gpt4 book ai didi

java - 是否有针对 GC 问题的食谱指南?

转载 作者:IT老高 更新时间:2023-10-28 20:58:36 25 4
gpt4 key购买 nike

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

是否有针对 Java 调整 GC 的食谱指南或半自动化工具?

我的理由是:

  • 几乎所有人最终都会遇到这些问题
  • 有许多可能的因素(比如 20 个),其中只有少数会影响您的问题。
  • 大多数人不知道如何识别关键因素,因此 GC 调优更像是一门魔法而不是一门科学。
  • 并非所有人都使用 HotSpot 虚拟机。不同的 Sun 版本具有不同的 GC 特性。
  • 几乎没有进行实验的动力(例如每天使用略有不同的设置运行虚拟机,看看效果如何)。

所以问题真的是:有什么东西可以以 list 的方式使用吗?或者甚至可能是一个分析 GC 日志或堆转储并向我提供具体提示的工具(而不是告诉我“95% 的数据分配在 byte[] 类型的对象中”,这基本上是无用的)。

相关问题:

最佳答案

根据各种资源,我编制了一份健全性检查表,用于分析我的应用程序的 GC 行为和性能。 这些准则是通用的,适用于任何特定于供应商的 JVM,但也包含特定于 HotspotVM 的信息以供说明之用。

  1. 禁用显式 GC。显式 GC 是一种糟糕的编码实践,它永远不会有帮助。使用 -XX:+DisableExplicitGC

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

    • 计算实时数据集分配率提升率。这将告诉您是否需要更大的堆或您的例如。 Young Gen 太小,或者您的 Survivor 空间溢出等。
    • 计算总 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 用于 Hotspot,它将显示 Eden、Survivor 和 Old Gen 的职业/容量。

  4. 收集类直方图这些是轻量级的,会显示堆的内容。您可以在发现一些奇怪的 GC Activity 时拍摄快照,或者您可以在 Full GC 之前/之后拍摄它们:

    • OldGen 空间的内容:您可以找出哪些对象驻留在 OldGen 中。您需要在 Full GC 之前和之后打印直方图。而且由于 YoungGen 集合是在 Full GC 之前执行的,这些直方图将向您显示老年代的内容。使用 -XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC。
    • 检测过早提升的对象:要确定是否有任何实例被提早提升,您需要研究直方图以了解哪些类应该驻留在 OldGen 中,哪些类应该只在杨根。这不能自动完成,您需要推理每个类及其实例的用途以确定对象是否是临时对象。
  5. 考虑不同的 GC 算法。 VM 通常带有几种不同的 GC 实现,它们提供了各种权衡:吞吐量、占用空间、无暂停/短暂停、实时等。考虑您拥有的选项并选择适合您需求的选项。

  6. 小心 finalize()。使用 finalize() 检查 GC 是否跟上类。此方法的执行成本可能非常高,这会影响 GC 和应用程序的吞吐量。

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

使用的资源:

书籍:

讲座/文章:

邮件列表:

关于java - 是否有针对 GC 问题的食谱指南?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6871213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com