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

2022-09-02 02:53:04

我读过很多关于在Java中调整GC的文章,并且经常想知道有多少人真正使用一些更高级的功能。

我总是尽可能避免调整,而是专注于编写尽可能简单的代码(Brian Goetz的建议) - 到目前为止,这对我来说似乎很有效。

这些优化策略是否能够灵活应对不同 VM 版本的变化,还是需要不断重新评估?

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


答案 1

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

在接下来的几个月中,我分阶段自定义了 GC 设置。一般来说,最大的可用旋钮似乎是在调整增量gc的频率和大小 - 最大的改进是用大的周期性gc换取更小,更频繁的gc。但我们肯定能够看到性能的提高。

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

  • 在调整默认 gc 设置方面做了很多工作。几乎总是默认比我会做的任何调整更好。
  • 至少对我来说,gc调优实际上值得的情况非常极端,以至于试图模拟它们是不合理的,所以我不得不通过实验和增量方式进行。

这是来自上一个堆栈溢出讨论的良好参考。


答案 2

绝大多数开发人员将永远不必(或想要)调整GC。我曾与那些不得不调整它的人一起工作,这里有一些建议:

在尝试调整垃圾回收器之前,请 100% 确定已使用探查器进行验证。这是怎么回事。开始优化后,请确保使用探查器验证它是否具有积极影响。

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

我曾经帮助某人解决GC问题,结果发现他们没有关闭JDBC结果集(或类似的问题)。这导致内存永远无法释放(他的代码由于某种原因保留在它们上面)。解决这个问题使程序从20分钟增加到30秒或几分钟。内存使用量也下降了。


推荐