有没有人发现垃圾收集调整有用?

我已经阅读了很多关于在Java中调优GC的文章,并且经常想知道有多少人真的使用了一些更高级的function。

我总是尽可能地避免调整,并集中精力编写尽可能简单的代码(Brian Goetz的建议) – 到目前为止,这似乎对我有用。

这些调整策略是否适应VM版本的变化,还是需要不断重新评估?

我使用的一个调整是-server标志。

我目前的工作的一部分是关注和提供大型Java应用程序,该应用程序旨在运行大量内存(目前大约8 Gb),主要是由于持续计算大量缓存数据。 我使用标准GC设置进行了初始部署,主要是因为没有一种简单的方法来模拟全速运行的生产环境。

在接下来的几个月中,我已经定制了GC设置。 通常,最大的可用旋钮似乎是调整增量gc的频率和幅度 – 最大的改进是在较大和较频繁的gc中折衷大周期gc。 但我们肯定能够看到性能改进。

我不打算发布我的具体设置,因为a)它们特定于我们的设置,而b)因为我没有它们方便:)。 但总的来说,我发现的是

  • 调整默认的gc设置已经做了很多工作。 几乎总是默认值比我做的任何调整更好。
  • 至少在我看来,gc调优实际上值得的情况非常严重,以至于试图模拟它们是不合理的,所以我必须通过实验和增量来做。

这是prev 的一个很好的参考。 stackoverflow讨论。

绝大多数开发人员永远不会(或想要)调整GC。 我和那些不得不调整它的人一起工作,这是建议:

在您尝试调整垃圾收集器之前,请100%确定您已使用分析器进行validation。 到底是怎么回事。 一旦开始调整,请确保使用分析器validation它是否具有正面效果。

您还应该重新访问运行的每个VM版本的更改(不同的VM将具有不同的调整策略)。

我曾经帮助过一个GC问题的人,结果certificate他们没有关闭JDBC结果集(或类似的问题)。 这导致内存永远不会被释放(由于某种原因,他的代码保留在它们上面)。 修复该问题使程序从20分钟变为30秒或几分钟。 内存使用量也下降了。

我不得不说我没有必要自己使用调音。 但我与编写延迟至关重要的代码的人密切合作:他们大量使用这种调优 – 指定使用哪种GC算法,最大暂停时间,幸存者比率等。

我想因此答案是: 如果延迟对应用程序至关重要,您可能需要考虑调整GC

我想说最常见的调整是最大内存大小。 大多数其他内存选项都有合理的默认值,并且经常过度调整恕我直言。 即设置它真的没有太大的区别。 在任何情况下,我常常看到人们设置了很多选项,其中一半是默认选项。 ;)

使用分析器是改善GC行为的最有用方法(通过减少创建的对象数量)

我有,但不是最近。 我正在处理的应用程序是实时渲染由各个动态JPEG图像构成的video流。 当时(大约是JDK 1.2和1.3),- -Xincgc设置会将客户端垃圾收集器从更大的清理切换到定期清理一点垃圾的模式。 结果,帧延迟的分布要低得多,给人的印象是video更流畅(而不是1-2-3暂停,1-2-3暂停)。

我在相当长的时间内没有看过那段代码,但我强烈怀疑,使用现代垃圾收集算法, -Xincgc实际上会降低性能。

在今天的世界中,我会说应该始终应用标准优化怀疑论:配置文件配置文件配置文件。 你确定瓶颈真的是垃圾收集器……?

简而言之,是的,它对调整任何严肃的Java应用程序非常有用。 我们经常发现,在生产场景中,稳定的应用程序和完全不可预测的应用程序之间存在差异。 这肯定不是我做的第一件事,但是一旦你有一个应用程序工作并且可以对它应用实际负载,它就是那时要研究的第一件事。