我已经阅读了很多关于在Java中调优GC的文章,并且经常想知道有多少人真正使用了一些更高级的功能。
我总是尽可能地避免调整,并专注于编写尽可能简单的代码(Brian Goetz的建议) - 到目前为止,这似乎对我有用。
这些调整策略是否适用于跨VM版本的更改,还是需要不断重新评估?
我使用的一个调整是-server标志。
答案 0 :(得分:20)
我目前的工作的一部分是关注和提供大型Java应用程序,该应用程序旨在运行大量内存(目前大约8 Gb),主要是由于持续计算大量缓存数据。我使用标准GC设置进行了初始部署,主要是因为没有一种简单的方法来模拟全速运行的生产环境。
在接下来的几个月中,我已经定制了GC设置。通常,最大的可用旋钮似乎是调整增量gc的频率和幅度 - 最大的改进是在较大和较频繁的gc中使用大周期gc。但我们肯定能够看到性能改进。
我不会发布我的特定设置,因为a)它们特定于我们的设置,而b)因为我没有它们方便:)。但总的来说,我发现的是
Here's来自prev的一个很好的参考。 stackoverflow讨论。
答案 1 :(得分:10)
绝大多数开发人员永远不会(或想要)调整GC。我和那些不得不调整它的人一起工作,这是建议:
在您尝试调整垃圾之前 收藏家100%肯定你有 通过分析器验证。什么是 继续一旦你开始调整make 确保您使用分析器验证 它产生了积极的影响。
您还应该重新访问运行的每个VM版本的更改(不同的VM将具有不同的调整策略)。
我曾经帮助过一个有GC问题的人,结果证明他们没有关闭JDBC结果集(或类似的问题)。这导致永远不会释放内存(由于某种原因,他的代码保留在它们上面)。修复该问题使程序从20分钟变为30秒或几分钟。内存使用率也下降了。
答案 2 :(得分:8)
我不得不说我自己没有必要使用调音。但我与编写延迟至关重要的代码的人密切合作:他们大量使用这种调优 - 指定使用哪种GC算法,最大暂停时间,幸存者比率等。
我想答案是:如果延迟对应用程序至关重要,您可能需要考虑调整GC
答案 3 :(得分:3)
我想说最常见的调整是最大内存大小。大多数其他内存选项都有合理的默认值,并经常过度调整恕我直言。即设置它真的没有太大的区别。在任何情况下,我常常看到人们设置了很多选项,其中一半是默认选项。 ;)
使用分析器是改善GC行为的最有用方法(通过减少创建的对象数量)
答案 4 :(得分:3)
我有,但不是最近。我正在处理的应用程序是实时渲染由各个动态JPEG图像构成的视频流。当时(大约是JDK 1.2和1.3),-Xincgc
设置会将客户端垃圾收集器从更大的清理切换到定期清理一点垃圾的模式。因此,帧延迟的分布要低得多,给人的印象是视频更流畅(而不是1-2-3暂停,1-2-3暂停)。
我在相当长的时间内没有看过那段代码,但我强烈怀疑,使用现代垃圾收集算法,-Xincgc
实际上会降低性能。
在今天的世界中,我会说应该始终适用标准优化怀疑论:个人资料个人资料。你确定瓶颈真的是垃圾收集器......?
答案 5 :(得分:2)
简而言之,是的,它对调整任何严肃的Java应用程序非常有用。我们经常发现,在生产场景中,稳定的应用程序和完全不可预测的应用程序之间存在差异。这肯定不是我做的第一件事,但是一旦你有一个应用程序工作并且可以对它应用实际负载,它就是那时要研究的第一件事。