几乎每个人最终都会遇到使用Java的GC问题。
是否有烹饪指南或半自动化工具来调整GC for Java?
我的理由是:
所以真正的问题是:我能以检查表方式使用某些东西吗?或者甚至可能是一个分析GC日志或堆转储的工具,并给出了具体提示在哪里查看(而不是告诉我“95%的数据是在byte []类型的对象中分配的,这基本上没用)。
相关问题:
答案 0 :(得分:20)
在各种资源中,我编制了一个完整性检查表,用于分析我的应用程序的GC行为和性能。 这些指南是通用的,适用于任何特定于供应商的JVM,但也包含特定于HotspotVM的信息以供说明。
禁用显式GC 。显式GC是一种糟糕的编码实践,它从来没有帮助。使用-XX:+DisableExplicitGC
。
启用完整GC记录。轻巧而强大。
-XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
考虑收集有关GC的信息的其他方法。记录很好,但有时可用的轻量级命令行工具可以提供更多的洞察力。例如。热点jstat
将显示你对伊甸园,幸存者和老一代的职业/能力。
收集班级直方图这些是轻量级的,会显示堆的内容。每当您发现一些奇怪的GC活动时,您都可以拍摄快照,或者您可以在Full GC之前/之后拍摄它们:
-XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC.
考虑使用不同的GC算法。虚拟机通常带有几种不同的GC实现,可提供各种权衡:吞吐量,占用空间,暂停/短暂停顿,实时等。考虑您拥有的选项并选择满足您需求的选项。
谨防结束()。使用finalize()
检查GC是否与类保持同步。执行此方法可能会非常昂贵,这可能会影响GC和应用程序吞吐量。
堆转储。这是重量级的第一步,会影响正在运行的应用程序。收集堆转储以进一步研究堆内容或确认步骤4中观察到的假设。
使用的资源:
书籍:
讲座/文章:
邮寄名单:
答案 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]
SAP JVM
Memory Management (Garbage Collection)
Detecting Hanging / Looping VMs
Analyzing Out-of-Memory Situations
抱歉,我对SAP了解不多,但提供了一些我发现的东西。
至于食谱,调整很可能是这个级别的特定应用,但这是一个有趣的话题。
<强>附录强>
您还提到了分析工具。一些候选人列在这里: