是否有关于GC问题的食谱指南?

Aar*_*lla 34 java garbage-collection

几乎每个人最终都会遇到使用Java的GC问题.

是否有烹饪指南或半自动化工具来调整GC for Java?

我的理由是这样的:

  • 几乎任何人都有这些问题
  • 有许多可能的因素(比如20),其中只有少数会影响你的问题.
  • 大多数人不知道如何识别关键因素,因此GC调整更像是黑人艺术而不是科学.
  • 并非每个人都使用HotSpot VM.不同的Sun版本具有不同的GC特征.
  • 实验没有什么动力(比如每天运行具有稍微不同设置的VM以查看它们是如何发挥作用的).

所以问题确实是:我能以检查清单的方式使用某些东西吗?或者甚至可能是一个分析GC日志或堆转储的工具,并给我具体的提示在哪里查看(而不是告诉我"95%的数据分配在byte []类型的对象中,这基本上是无用的).

相关问题:

Ale*_*leš 21

在各种资源中,我编写了一个健全性检查表,用于分析我的应用程序的GC行为和性能.这些指南是通用的,适用于任何特定于供应商的JVM,但也包含特定于HotspotVM的信息以供说明.

  1. 禁用显式GC.显式GC是一种糟糕的编码实践,它从来没有帮助.使用-XX:+DisableExplicitGC.

  2. 启用完整GC记录.轻巧而强大.

    • 计算实时数据集,分配率促销率.这将告诉您是否需要更大的堆或者如果您需要更大的堆.Young Gen太小,或者你的幸存者空间太多,等等.
    • 计算总GC时间,应该<总运行时间的5%.
    • 使用 -XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
  3. 考虑收集有关GC的信息的其他方法.记录很好,但有时可用的轻量级命令行工具可以提供更多的洞察力.例如.jstat热点,它将向您展示伊甸园,幸存者和老将的职业/能力.

  4. 收集类直方图这些是轻量级的,它将显示堆的内容.您可以在发现某些奇怪的GC活动时拍摄快照,也可以在Full GC之前/之后拍摄它们:

    • OldGen空间的内容:您可以找到OldGen中的对象.您需要在Full GC之前和之后打印直方图.由于YoungGen集合在Full GC之前执行,因此这些直方图将向您显示老一代的内容.使用-XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC.
    • 检测过早提升的对象:要确定是否提前提升任何实例,您需要研究直方图以查看预期哪些类位于OldGen中以及哪些类应仅在YoungGen中显示.这不能自动完成,您需要推断每个类及其实例的目的,以确定该对象是否是临时的.
  5. 考虑不同的GC算法.虚拟机通常带有几种不同的GC实现,可提供各种权衡:吞吐量,占用空间,暂停/短暂停顿,实时等.考虑您拥有的选项并选择满足您需求的选项.

  6. 小心finalize().检查GC是否与使用的类保持同步finalize().此方法的执行可能非常昂贵,这可能会影响GC和应用程序吞吐量.

  7. 堆转储.这是重量级的第一步,将影响正在运行的应用程序.收集堆转储以进一步研究堆内容或确认在步骤4中观察到的假设.

使用的资源:

图书:

讲座/文章:

邮件列表:


Mer*_*lin 15

各种GC信息的参考:

神谕

使用5.0 Java [tm]虚拟机调整垃圾收集

这也是

Java SE 6 HotSpot [tm]虚拟机垃圾收集调整

IBM

微调垃圾收集 [link dead]

可扩展的详细工具包

SAP JVM

内存管理(垃圾收集)

检测内存泄漏

检测挂起/循环虚拟机

分析内存不足的情况

对不起,我对SAP了解不多,但提供了一些我发现的东西.

至于食谱,调整很可能是在这个级别的应用程序特定,但它是一个有趣的主题.

附录

您还提到了分析工具.一些候选人列在这里:

知道任何Java垃圾收集日志分析工具吗?


归档时间:

查看次数:

5776 次

最近记录:

11 年,2 月 前