我们在Intranet上运行了一个生产Web应用程序:
配置为:
-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停止时,Hotspot JIT信息明显丢失。
是否有关于JVM关闭的GC优化/等等? JVM是否实际上消耗了比它需要更多的内存,因为某些Hotspot优化还没有发生?
如果JVM没有重新启动,我们是否有可能从这个应用程序获得更好的内存性能?我们找到了另一种方法来执行数据库备份?
(重申一下,我知道有十万件可能影响应用程序行为的东西,尤其是一个几乎没有人知道的应用程序!我真的只想知道是否有某些与JVM的内存性能,当它停止时会丢失)
答案 0 :(得分:0)
是的,由于JIT优化,GC的行为可能会随着时间的推移而发生变化。一个例子是'Escape Analysis',它自Java 6u23起默认启用。这种类型的优化可以防止在堆中创建一些对象,因此根本不需要垃圾收集。
有关详细信息,请参阅Java 7's HotSpot Performance Enhancements。