如果我增加内存堆,则会增加GC时间

时间:2011-06-07 14:34:26

标签: java jvm

我当前的应用程序在2GB内存正常GC循环上运行。

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

它会不会加速GC时间?如果是,将会影响多少性能。他们调整GC有什么好的艺术吗?

6 个答案:

答案 0 :(得分:5)

简答

是的,时间会增加。更大的堆=更长的暂停时间

长答案

有几个因素需要考虑。您是如何配置GC运行的?你的年轻一代有多大?你多久看一次GC的完整版?

如果您很少看到完整的GC,则差异可以忽略不计。如果将GC活动记录到日志中,则可以看到部分GC的暂停时间非常快。部分GC上2GB和4GB之间的差异大约为0.1s。要记录GC活动,您可以使用以下参数-XX:+PrintGCDetails -verbose:gc -Xloggc:/log/path/gc.log。有许多工具可以为您读取此GC日志,提供图表和统计信息,如吞吐量和总暂停时间。

如果您经常看到Full GC,那就是为什么要添加更多内存,那么您可能需要考虑分析应用程序,而不是看看是什么占用了所有内存。使用更大的堆,这些问题只会导致更长的GC,直到您解决潜在的问题。

最后,您需要尝试各种配置,正确测试并将最适合您的生产环境放入生产环境中。

答案 1 :(得分:4)

大堆==长GC暂停。

我看到GC在~10G大小的堆上停了好几个分钟

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

阅读这个主题的好资源:

答案 2 :(得分:2)

没有直截了当的答案,因为答案取决于你的应用程序的记忆明智。
但是,您应该考虑如果增加jvm内存,那么您的应用程序将拥有更多内存......如果使用了所有内存,那么将更频繁地调用您的gc(增加GC时间) 增加内存并不总是最佳解决方案,优化对象使用和回收未使用的对象可能是更好的解决方案。

答案 3 :(得分:1)

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

调整GC当然取决于您使用的JVM。 Oracle JVM有一个huge amount of GC tuning options和一个非常广泛的tuning guide

答案 4 :(得分:1)

如果您想了解如何调整JVM,可以先阅读http://java.sun.com/performance/reference/whitepapers/tuning.htmlhttp://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

关于你的问题,没有简单的答案,但增加堆将延迟完整的垃圾收集,但也会使它持续更长时间。

答案 5 :(得分:0)

性能调整是一种黑色艺术,一旦你开始改变你的GC设置,它就会成为你需要不断监控的东西,因为在我看来你告诉VM你知道的更好。

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

  

详细:gc -XX:+ PrintGCDetails   XX:+ PrintGCTimeStamps   -Xloggc:PATH_FROM_ROOT / gclog.log

使用JVisualVM,Jconsole或像JProfiler这样的好的分析器进行监控。 开始阅读关于GC的好地方是

  

Tuning Garbage Collection