如果我增加内存堆,是否会增加垃圾回收时间?

3

我的当前应用程序在2GB内存下运行普通GC周期。

我想将JVM内存增加到4GB以提高应用程序性能。

这样做会增加GC时间吗?如果是的话,性能会受到多少影响?有没有好的文章可以调整GC?


你是指长期还是短期内的总GC时间?这是非常重要的细节。 - mindas
我是指短期内。毫无疑问,GC调用数量将会减少,但单个GC周期所需的时间呢? - Kamahire
请注意,如果您使用的是32位操作系统,则通常无法让JVM使用多达4GB的内存。建议您使用64位操作系统和64位JVM。但请注意,使用64位JVM时最常见的问题之一是GC可能会成为一个问题。 - Michael McGowan
6个回答

7

简短回答

是的,时间会增加。堆越大,暂停时间就越长。

详细回答

有几个因素需要考虑。您如何配置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,直到您解决了潜在问题。

最终,您需要尝试各种配置,进行适当的测试,并将最适合您的内容放入生产环境。


5

大的堆 == 长时间的GC暂停。

我曾经见过GC在约10G大小的堆上停止了数分钟。

另一方面,较小的堆意味着更频繁(但更短暂)的GC周期。这个问题没有一个好的通用答案 - 一切都取决于你的应用程序需求(高频交易应用程序?kitten网页服务器?),硬件,对象周转等。

关于此主题的几个好资源:


0

没有直接的答案,因为答案取决于您的应用程序在内存方面的操作。
但是,您应该考虑增加jvm内存,那么您的应用程序将拥有更多的内存...如果所有内存都被使用,则垃圾回收会更频繁地调用(GC时间增加)
增加内存并不总是最好的解决方案,优化对象使用和回收未使用的对象可能是更好的解决方案。


-1:更多可用的内存意味着(完整的)垃圾回收将 LESS 频繁地执行。 - Michael Borgwardt
@Michael Borgwardt:您误解了我的回答。在短期内,垃圾回收将被调用的频率较低,但这取决于应用程序的工作方式......如果应用程序存在内存泄漏,那么您最终会遇到相同的问题... - VirtualTroll
存在内存泄漏本身就是一种失败场景,与性能调优的问题无关。 - Michael Borgwardt

0

更多可用的内存往往会减少 GC 所花费的总时间,但会增加一次完整 GC 的时间。然而,现代 JVM 不一定再使用“停止世界”垃圾收集器。

调整 GC 当然取决于您使用的 JVM。Oracle JVM 有大量的 GC 调整选项和相当详细的调整指南。

巨量的 GC 调整选项

调整指南


0

0

性能调优有点像黑魔法,一旦您开始更改GC设置,它就成为您需要不断监视的东西,因为在我看来,您是在告诉虚拟机您更懂。

有一些VM标志可以添加以记录GC暂停和堆大小,这非常有用,您可以grep您的日志并获得一些良好的统计数据。

verbose:gc -XX:+PrintGCDetails XX:+PrintGCTimeStamps –Xloggc:PATH_FROM_ROOT/gclog.log

使用JVisualVM、Jconsole或像JProfiler这样的好的分析工具进行监控。关于GC的阅读起点是

Tuning Garbage Collection


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接