我的当前应用程序在2GB内存下运行普通GC周期。
我想将JVM内存增加到4GB以提高应用程序性能。
这样做会增加GC时间吗?如果是的话,性能会受到多少影响?有没有好的文章可以调整GC?
我的当前应用程序在2GB内存下运行普通GC周期。
我想将JVM内存增加到4GB以提高应用程序性能。
这样做会增加GC时间吗?如果是的话,性能会受到多少影响?有没有好的文章可以调整GC?
简短回答
是的,时间会增加。堆越大,暂停时间就越长。
详细回答
有几个因素需要考虑。您如何配置GC运行?您将年轻代大小设置为多少?您多频繁地看到Full GC?
如果您很少见到Full GC,则差异微不足道。如果您将GC活动记录到日志中,您可以看到部分GC的暂停时间非常快。对于部分GC的2GB和4GB之间的差异约为0.1秒。要记录GC活动,您可以使用以下参数-XX:+PrintGCDetails -verbose:gc -Xloggc:/log/path/gc.log
。有许多工具可以读取此GC日志,为您提供图形和统计数据,例如吞吐量和总暂停时间。
如果您经常看到Full GC,并且这就是您想添加更多内存的原因,则可能需要考虑对应用程序进行分析,以查看是什么在占用所有内存。随着堆越来越大,这些问题只会导致更长的GC,直到您解决了潜在问题。
最终,您需要尝试各种配置,进行适当的测试,并将最适合您的内容放入生产环境。
大的堆 == 长时间的GC暂停。
我曾经见过GC在约10G大小的堆上停止了数分钟。
另一方面,较小的堆意味着更频繁(但更短暂)的GC周期。这个问题没有一个好的通用答案 - 一切都取决于你的应用程序需求(高频交易应用程序?kitten网页服务器?),硬件,对象周转等。
关于此主题的几个好资源:
没有直接的答案,因为答案取决于您的应用程序在内存方面的操作。
但是,您应该考虑增加jvm内存,那么您的应用程序将拥有更多的内存...如果所有内存都被使用,则垃圾回收会更频繁地调用(GC时间增加)
增加内存并不总是最好的解决方案,优化对象使用和回收未使用的对象可能是更好的解决方案。
更多可用的内存往往会减少 GC 所花费的总时间,但会增加一次完整 GC 的时间。然而,现代 JVM 不一定再使用“停止世界”垃圾收集器。
调整 GC 当然取决于您使用的 JVM。Oracle JVM 有大量的 GC 调整选项和相当详细的调整指南。
如果你想学习如何调整你的JVM,可以先阅读http://java.sun.com/performance/reference/whitepapers/tuning.html和http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html。
关于你的问题,没有简单的答案,但增加堆大小既会延迟完整垃圾回收,也会使其持续更长时间。
性能调优有点像黑魔法,一旦您开始更改GC设置,它就成为您需要不断监视的东西,因为在我看来,您是在告诉虚拟机您更懂。
有一些VM标志可以添加以记录GC暂停和堆大小,这非常有用,您可以grep您的日志并获得一些良好的统计数据。
verbose:gc -XX:+PrintGCDetails XX:+PrintGCTimeStamps –Xloggc:PATH_FROM_ROOT/gclog.log
使用JVisualVM、Jconsole或像JProfiler这样的好的分析工具进行监控。关于GC的阅读起点是