我们的Intranet上运行着一个生产Web应用程序,该应用程序:
每天在0300重新启动
-Xms2g
-XX:PermSize=256m
-Xmx4g
-XX:MaxPermSize=256m
-Xss192k
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=50
-XX:+DisableExplicitGC
每天堆的使用情况:
这时,堆在大约40分钟内上升到55%,然后被无限次回收到37%,直到下一次重新启动为止。
我们已经在JVM上安装了AppDynamics,可以看到主要垃圾收集大约每分钟发生一次,而对内存没有多大影响(当然,除了上面概述的下降之外),直到内存达到37%时,主要收集变得更少了。频繁。
Web应用程序的行为显然有数百个外部因素,但是一种研究途径是,当JVM停止时,热点JIT信息显然丢失了。
是否存在GC优化/etc,这些优化也随JVM的关闭而丢失了? JVM是否由于尚未进行某些Hotspot优化而有效地消耗了过多的内存?
如果不重新启动JVM并且找到了另一种执行数据库备份的方法,是否有可能从该应用程序中获得更好的内存性能?
(重申一下,我知道有十万种因素可能会影响应用程序的行为,尤其是几乎没有其他人知道的应用程序!我真的只是想知道是否某些因素与应用程序的内存性能有关。停止时丢失的JVM)
最佳答案
是的,由于JIT优化,GC的行为有可能随时间改变。一个示例是“转义分析”,此自Java 6u23起已默认启用。这种类型的优化可以防止在堆中创建某些对象,因此根本不需要垃圾回收。
有关更多信息,请参见Java 7's HotSpot Performance Enhancements。
关于java - Java垃圾收集器的行为会随着时间的推移而发展还是会受到JIT的影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20975043/