在应用诊断分析平台ATP刚才有一台机器fullgc了,想问下从哪个可以分析出使用比较大的对象呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在应用诊断分析平台(ATP)中,如果某台机器发生了 Full GC,您可以通过以下方式分析出占用内存较大的对象:
Java 堆分析功能提供了多个视图,可以帮助您快速定位占用内存较大的对象。以下是具体步骤和相关视图的说明:
综合报表是堆分析的一个摘要视图,能够列出堆转储的基础信息,并概括性地展示堆中占比最大的类、对象和类加载器等信息。通过该视图,您可以快速了解堆的基本使用情况,例如对象数量以及按内存占用大小排序的 Java 类型饼图。
- 重点关注:饼图中占用内存最多的类型,这些类型可能是导致 Full GC 的主要原因。
类报表中的“数量统计”视图可以根据聚合类型列出堆中所有对象的数量和大小。例如,您可以按类聚合,查看某一特定类型(如 Foo
类型)的对象数量和总内存占用。
- 操作建议:筛选出占用内存较大的类,进一步分析其对象实例是否存在异常。
支配关系视图是堆分析中最重要的视图之一,它展示了对象之间的支配关系。如果对象 A 支配对象 B,则垃圾回收器必须先释放 B 对象才能释放 A 对象。通过该视图,您可以清晰地看到哪些对象占用了大量内存,以及它们为何仍然存活(可通过 GC 根路径查看)。
- 重点关注:支配关系图中占用内存最大的对象及其 GC 根路径,这有助于判断是否存在内存泄漏或不合理引用。
“不可达类型”视图会搜集堆中所有不可达对象,并按类型进行聚合。虽然这些对象在下一次 GC 中会被回收,但它们的存在可能反映了某些潜在问题。
- 操作建议:检查不可达对象的数量和类型,确认是否存在频繁创建和销毁大对象的情况。
除了堆分析,您还可以通过 GC 日志分析功能进一步验证 Full GC 的原因。以下是相关视图的说明:
暂停信息视图展示了 GC 吞吐量、平均和最大暂停时间等统计指标,并以可视化方式显示不同时间范围内的暂停次数。
- 重点关注:Full GC 的暂停时间和频率,结合堆分析结果判断是否由大对象分配导致。
内存统计视图详细列出了年轻代、老年代、大对象区、整堆和元空间的平均容量、最大使用量以及 GC 后的平均使用量。
- 操作建议:观察老年代和大对象区的内存使用情况,确认是否存在大对象直接进入老年代的情况。
GC 原因视图按照 GC 发生的原因维度,展示不同 GC 的次数、间隔和时长等指标。
- 重点关注:Full GC 的触发原因,例如“晋升失败”或“元空间不足”,结合堆分析结果进一步排查。
如果您有两份堆转储文件或 GC 日志文件,可以使用差异分析功能对比两次分析结果,发现某些指标的变化趋势。例如,对比 Full GC 前后的堆内存使用情况,找出新增的大对象或异常增长的类。
为了分析 Full GC 中占用内存较大的对象,建议您按照以下步骤操作: 1. 使用 Java 堆分析 功能,重点查看 综合报表 和 类报表 - 支配关系 视图,定位占用内存最大的对象及其 GC 根路径。 2. 结合 GC 日志分析 功能,查看 暂停信息 和 内存统计 视图,确认 Full GC 的触发原因及内存使用趋势。 3. 如果有条件,使用 差异分析 功能对比 Full GC 前后的堆转储文件,发现异常变化的对象或类。
通过以上方法,您可以快速定位并解决 Full GC 中占用内存较大的对象问题。