文档的java.lang.Error说:
Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题
但是作为java.lang.Error子类java.lang.Throwable,我可以捕获这种类型的Throwable.
我明白为什么抓住这种例外不是一个好主意.据我所知,如果我们决定捕获它,catch处理程序不应该自己分配任何内存.否则OutOfMemoryError将再次抛出.
所以,我的问题是:
java.lang.OutOfMemoryError可能是一个好主意?java.lang.OutOfMemoryError,我们怎么能确定catch处理程序本身不分配任何内存(任何工具或最佳实践)?默认情况下,maven surefile插件在隔离(分叉)环境中运行测试.您可以使用以下配置覆盖此行为:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<forkMode>never</forkMode>
</configuration>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
如果需要调试测试,则应使用此配置代码段.或者您可以通过以下方式简单地运行maven:
$ mvn -Dmaven.surefire.debug tests
Run Code Online (Sandbox Code Playgroud)
这将启动端口5005上的调试器.
我的问题是:分支策略有哪些好处?为什么选择maven构建的默认策略?非福祉策略是不是更直接,因此应该用作默认值(maven是约定优于配置工具,对吧)?
在剖析本土网络应用程序时,我遇到了非常奇怪的(至少对我来说)观察.
几乎所有的时间都花在socketRead0()了SocketInputStream课堂的方法上.这并不奇怪,因为我的应用程序在每个请求上都使用远程服务进行联网.奇怪的是,这种方法不仅挂钟时间使用率高,而且CPU时钟时间也很高.我无法理解为什么CPU时间很长,因为如果我的应用程序等待远程服务回复(实际上并不是那么快),那么应用程序本身就没有什么可做的了.所以CPU时间应该很低.
更多观察:
SocketInputStream.socketRead0()占用时间高达95%(挂钟时间和 CPU时间);mpstat (我们使用Linux作为操作系统)显示约90%的用户时间和约1-3%的系统时间(其余为空闲时间);RestTemplate来与远程服务进行交互,而不是SocketInputStream直接进行.现在我只有一个想法 - 也许这是在JVM中调用本机方法的开销(SocketInputStream.socketRead0()原生)?
你怎么看?还有其他原因吗?
在阅读"Lucene in Action 2nd edition"时,我遇到了Filter可用于Lucene中的结果过滤的类的描述.Lucene有很多重复Query类的过滤器.例如,NumericRangeQuery和NumericRangeFilter.
这本书说NRF完全相同,NRQ但没有文件评分.这是否意味着,如果我不需要得分或排序文件文档字段的值,我应该更喜欢Filter荷兰国际集团在Query从性能的角度来看荷兰国际集团?
我想知道在JSP中解决Spring控制器是否有任何好的做法.
假设我有控制器:
@Controller
class FooController {
// Don't bother about semantic of this query right now
@RequestMapping("/search/{applicationId}")
public String handleSearch(@PathVariable String applicationId) {
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
当然在JSP中我可以写:
<c:url value="/search/${application.id}" />
Run Code Online (Sandbox Code Playgroud)
但是现在很难改变网址.如果您熟悉Rails/Grails,那么现在您可以解决此问题:
redirect_to(:controller => 'foo', :action = 'search')
Run Code Online (Sandbox Code Playgroud)
但是在Spring中有很多UrlMappers.每个UrlMapper都有自己的语义和绑定方案.Rails一样的方案根本不起作用(除非你自己实现).我的问题是:在Spring中有没有更方便的方法来解决JSP中的控制器问题?
假设我有以下代码
private volatile Service service;
public void setService(Service service) {
this.service = service;
}
public void doWork() {
service.doWork();
}
Run Code Online (Sandbox Code Playgroud)
修改后的字段标记为volatile,其值不依赖于先前的状态.所以,这是正确的多线程代码(不用担心Service一分钟的实现).
据我所知,从内存可见性的角度来看,读取volatile变量就像输入一个锁.这是因为读取常规变量不能通过读取volatile变量来重新排序.
这是否意味着以下代码是正确的?
private volatile boolean serviceReady = false;
private Service service;
public void setService(Service service) {
this.service = service;
this.serviceReady = true;
}
public void doWork() {
if ( serviceReady ) {
service.doWork();
}
}
Run Code Online (Sandbox Code Playgroud) 我需要以编程方式呈现JSP页面.据我所知,JSP应该有一些编译器.问题是我可以在没有JspServlet和其他人的情况下直接使用这个编译器吗?我需要的只是文档如何使用JSP编译器(例如,Jasper).
我认为,一些额外的信息可以澄清情况.我不能使用标准的JspServlet.我想以某种方式在编译之前更改源JSP(准确地将两个JSP合并在一起),因此我需要一种方法直接使用JSP编译器从InputStream(或Reader)编译JSP结果.
两个JSP的合并是布局要求.你可以问:"但为什么这个人不使用SiteMesh或类似的东西?".其中一个JSP页面不是静态的.它由用户提供并存储在数据库中.我们清理并验证了这个JSP布局(用户只能使用标签的子集,并且所有这些标签都不是标准的,而是专门为它们创建的),缓存它们等等.但是现在我们需要一种方法来使用这些JSP页面(存储在内存中)作为用户请求的所有JSP页面的布局.
当我调试CI服务器上的一个单元测试(实际上是maven构建)时发生了有趣的事情.我连接到java进程strace -ff -e trace=network -p [pid]跟踪构建过程的网络活动.这就是我所看到的:
Process 26324 attached
Process 26325 attached (waiting for parent)
Process 26325 resumed (parent 26312 ready)
Process 26325 detached
Process 26324 detached
Process 26320 detached
Process 26317 detached
Process 26308 resumed
[pid 26308] --- SIGCHLD (Child exited) @ 0 (0) ---
Process 26307 resumed
Process 26308 detached
[pid 26310] --- SIGCHLD (Child exited) @ 0 (0) ---
Process 26310 detached
[pid 25551] --- SIGSEGV (Segmentation fault) @ 0 (0) ---
Process 26309 detached …Run Code Online (Sandbox Code Playgroud) 我在某处读到java可以为大约12个机器指令中的对象分配内存.这对我来说非常令人印象深刻.据我所知,JVM使用的一个技巧是在块中预分配内存.这有助于最大限度地减少对操作系统的请求数量,这是非常昂贵的,我想.但即便是CAS操作也可能在现代处理器上花费多达150个周期.
那么,有没有人可以解释java中内存分配的实际成本以及JVM用于加速分配的技巧?