我当前的应用程序在2GB内存正常GC循环上运行。
我想将JVM内存增加到4GB以提高应用程序性能。
它会不会加速GC时间?如果是,将会影响多少性能。他们调整GC有什么好的艺术吗?答案 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.html和http://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的好地方是