我读过很多关于Java中调整垃圾回收的文章,经常想知道有多少人真正使用了一些更高级的特性。
我一直尽可能避免调优,并集中精力编写最简单的代码(Brian Goetz的建议)- 这似乎对我至今有效。
这些调优策略是否能够跨VM版本保持稳健,还是需要不断重新评估?
我使用过的一个调优策略是 -server 标志。
我读过很多关于Java中调整垃圾回收的文章,经常想知道有多少人真正使用了一些更高级的特性。
我一直尽可能避免调优,并集中精力编写最简单的代码(Brian Goetz的建议)- 这似乎对我至今有效。
这些调优策略是否能够跨VM版本保持稳健,还是需要不断重新评估?
我使用过的一个调优策略是 -server 标志。
我的工作职责之一是维护一个大型Java应用程序,该应用程序被设计为需要大量内存(目前约8GB),主要是由于进行了许多具有缓存数据的持续计算。我最初使用了标准的GC设置进行部署,主要是因为没有简单的方法来模拟完全运行的生产环境。
在接下来的几个月中,我分阶段定制了GC设置。通常,最大的可用旋钮似乎是调整增量GC的频率和幅度-最大的改进是将大的周期性GC与更小且更频繁的GC做出权衡。但我们确实能够看到性能提升。
我不会发布我的具体设置,因为a)它们是特定于我们的设置的,b)因为我手边没有它们:)
但总的来说,我的发现是:
这里是一个来自先前stackoverflow讨论的好参考。
绝大多数开发人员不需要(或不想)调整GC。我曾与那些必须调整它的人一起工作,以下是建议:
在尝试调整垃圾回收器之前,务必使用分析器100%验证正在发生的情况。一旦开始调整,请务必使用分析器验证它是否产生了积极的影响。
您还应该在每次运行不同VM版本时重新审查更改(不同的VM将具有不同的调整策略)。
我曾帮助某人解决过一个GC问题,后来发现这是由于他们没有关闭JDBC结果集(或类似问题)导致的。这会导致内存永远不会被释放(他的代码出于某种原因将它们保留下来)。修复该问题使程序从20分钟变为了30秒或几分钟左右。内存使用情况也大大降低。
我必须说,我自己并没有太多使用调优的需求。但是我与那些编写对延迟非常敏感的代码的人密切合作:他们经常使用这种调优——指定要使用哪个GC算法、最大暂停时间、幸存者比例等。
因此,我想答案是:如果应用程序对延迟非常敏感,您可能需要考虑调整您的GC
-Xincgc
设置会将客户端垃圾回收器从更多的大爆炸式清理切换到定期清理一些垃圾的模式。因此,帧延迟的分布要低得多,给人以更平滑的视频印象(而不是1-2-3-暂停,1-2-3-暂停)。-Xincgc
实际上会降低性能。简而言之,是的,它对于优化任何严肃的Java应用程序非常有用。我们经常发现,在生产场景中,这是一个稳定应用程序和完全不可预测应用程序之间的区别。当您有一个运行良好的应用程序并可以为其应用真正的负载时,它肯定不是我要做的第一件事情,但此时它是要调查的第一件事情之一。