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

时间:2011-07-29 09:37:57

标签: java garbage-collection

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

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

我的理由是:

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

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

相关问题:

2 个答案:

答案 0 :(得分:20)

在各种资源中,我编制了一个完整性检查表,用于分析我的应用程序的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是否与类保持同步。执行此方法可能会非常昂贵,这可能会影响GC和应用程序吞吐量。

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

  8. 使用的资源:

    书籍:

    讲座/文章:

    邮寄名单:

答案 1 :(得分:15)

各种GC信息的参考文献:

<强>的Oracle

Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine

这也是

Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning

<强> IBM

Fine Tuning Garbage Collection [link dead]

Extensible Verbose Toolkit

SAP JVM

Memory Management (Garbage Collection)

Detecting Memory Leaks

Detecting Hanging / Looping VMs

Analyzing Out-of-Memory Situations

抱歉,我对SAP了解不多,但提供了一些我发现的东西。

至于食谱,调整很可能是这个级别的特定应用,但这是一个有趣的话题。

<强>附录

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

Know of any Java garbage collection log analysis tools?