我们有一个运行Java6、Tomcat6、SpringFramework3、Hibernate4、EhCache的Web应用程序。我们遇到了一个问题,即垃圾收集时间极长,可能需要30秒或更长时间,导致应用程序无响应。我们目前正在测试,但除了显而易见的:添加更多内存之外,我想知道我们是否可以调整某些方面以减少垃圾收集时间。内存使用的主要贡献者是EHCache,因为我们正在积极缓存。但是我总是发现很难调整EHCache存储的大小(新的EhCache字节大小存储,导致我们遇到各种问题,因为缓存的对象图可能非常大)。这些是我对JVM的设置JAVA_OPTS="$JAVA_OPTS-server
我已阅读thisarticle关于虚拟机垃圾收集调整以更好地了解java垃圾收集器。每个空间都有一个虚拟堆空间区域,当所需的堆空间接近最大堆大小时,它可以增长到该区域。这可以在这张图片中看到:(来源:oracle.com)你可以通过NewRatio参数设置YoungGeneration和Old(Tenured)Generation之间的比例,EdenSpace和SurvivorSpace具有SurvivorRatio参数。最近thisquestion被问及如何找出堆空间的默认比率。它说您应该使用PrintGCDetails参数并手动计算比率。我的问题是:不同堆空间的大小是否以相同的比例
考虑下面的代码:Strings=null;s.toLowerCase();它抛出一个NPE:Exceptioninthread"main"java.lang.NullPointerExceptionatpracJava1.Prac.main(Prac.java:7)问题是:为什么JVM不能同时放置一条帮助消息:Exceptioninthread"main"java.lang.NullPointerException.AttemptedtoLowerCase()onnull这在像obj.setName(s.toLowerCase())这样的情况下很有用,行号不足以猜测obj是null还是
是否可以转储正在运行的JVM的图像,然后通过将图像加载到JVM中来恢复以前的状态?我相当确定答案是否定的,但很乐意是错误的。随着JVM可用的所有动态语言增加了交互性,能够保存编码session将有助于节省手动将VM恢复到之前session的时间。 最佳答案 有一个JSR323proposedforthis不久前,它是rejected.您可以在这些文章中找到一些链接,了解这背后的研究以及需要做什么。它主要被拒绝为一个太不成熟的想法。我听说至少有一家初创公司(不幸的是不记得这个名字)正在通过虚拟机管理程序(可能是Xen)开发虚拟化技术,
我有两种类型的对象的大型应用程序:长生命周期(缓存)和短生命周期(请求-处理-响应)。理论上,对于这种类型的应用程序,我认为可以配置YoungvsOld空间,因此Old空间消耗是恒定的,从而不会发生FullGC。我已经更改了newSize-maxNewSize参数,但是,旧堆继续上升,直到FullGC。每次FullGC后,消耗下降到20%(缓存占用20%)。出于某种原因,我的对象进入旧空间。我有两个怀疑为什么被转移到旧空间:根据这篇文章:http://chaoticjava.com/posts/gc-tips-and-memory-leaks/它被告知如果您分配了大对象,这些对象将直接
根据JSR-133不可变对象(immutable对象)是线程安全的,不需要同步。然而,可以使用反射更新最终字段的值:packagecom.stackoverflow;importjava.lang.reflect.Field;publicclassWhatsGoingOn{staticclassImmutable{privatefinalintvalue;publicImmutable(intvalue){this.value=value;}publicintgetValue(){returnvalue;}}publicstaticvoidmain(String[]args)throw
我只想控制Java(groovy)应用程序中所有线程的堆栈大小。对于HotspotOracleVM,我知道有两个参数(-Xss和XX:ThreadStackSize)。哪个是首选?它们之间有什么区别吗?关于OpenJDK7someoneaskedonthemailinglist,声明-Xss对于HotpotVM与-XX:ThreadStackSize相同。重点是,我正在测量可以在我的系统上启动多少线程。我的groovy脚本看起来像这样:intcount=0defprintCountThreads={println("XXXTherewerestarted$countthreads.")
我是从C++转到Java的。在C++世界中,我们关注异常安全,并注意到变元器可以在变元器本身或其委托(delegate)的方法抛出异常时提供不同的保证(最小、强、不抛出)。实现具有强异常保证的方法需要保证一些基本操作永远不会抛出异常。JLS声明哪些操作可以抛出哪些类型的异常,但是VirtualMachineError错误会带来问题。JLS:aninternalerrororresourcelimitationpreventstheJavavirtualmachinefromimplementingthesemanticsoftheJavaprogramminglanguage;inth
我正在启动OracleWebLogicServer12.1.3.0,我在其中托管了一些WEb应用程序,但我无法启动它,因为出现错误用Java版本回显启动weblogic:%JAVA_HOME%\bin\java%JAVA_VM%-versionif"%WLS_REDIRECT_LOG%"==""(echoStartingWLSwithline:echo%JAVA_HOME%\bin\java%JAVA_VM%%MEM_ARGS%-Dweblogic.Name=%SERVER_NAME%-Djava.security.policy=%WLS_POLICY_FILE%%JAVA_OPTIO
我需要在Java中生成一个进程(仅在Linux下),该进程将在JVM退出后继续运行。我怎样才能做到这一点?基本上,Java应用程序应该生成一个更新程序来停止Java应用程序、更新文件,然后再次启动它。我对一种简单的hack&slash方法很感兴趣,如果你有更好的设计方案的话,我也很感兴趣:) 最佳答案 如果您使用java.lang.Process生成进程它应该“正常工作”——我不相信生成的进程会在JVM退出时终止。不过,您可能会发现Ant库使您可以更轻松地控制生成。 关于java-在Ja