gpt4 book ai didi

Java OutOfMemoryError,但在 JFR 中看到的 Activity 对象很少?

转载 作者:行者123 更新时间:2023-12-04 10:12:00 26 4
gpt4 key购买 nike

我有一些代码会抛出 OutOfMemoryError .

我将 JVM 设置为在 OOM 上转储,然后在 Java Flight Recorder 中打开转储。

在 JFR 中检查 Activity 对象时,我看到的对象很少(少于 60 个)。

如何找出在触发 OOM 时保存在内存中且不可收集的最大对象?

最佳答案

由于所收集数据的性质,您无法以自动方式执行此操作(如内存分析器工具使用堆转储来执行此操作)。
您只能看到少数对象是完全没问题的。原因在于低开销采样的工作原理——在每次新的 TLAB 分配时,JFR 都会介入并从旧 TLAB 中获取一些对象。因此,您不会记录所有对象,只会记录分配的对象的代表性样本。这应该足以为您提供堆中对象的比率。此外,所有报告的对象在记录转储时都处于 Activity 状态。
如果您认为获得的样本太少而无法得出正确的结论,则可能是您的堆相对于 TLAB 大小而言较小,您可能想要减小 TLAB 大小。这在生产环境中是不可取的,因为不正确的 TLAB 设置会降低应用程序性能。
如果您在记录期间的分析配置中将“内存泄漏检测”设置为“对象类型 + 分配堆栈跟踪 + GC 根路径”,则可以跟踪 Activity 对象在创建后在代码中的位置,并且可以重建具有代表性的支配树道路。
如果您关心大对象本身就意味着大(并且不保留大部分堆),您可以通过查看“TLAB 分配”页面并查找“TLAB 外的总分配”列来查找比 TLAB 大的对象。仅当分析配置将“内存分析”设置为“对象分配和提升”时,才会收集此数据。
分析配置是指您使用 settings 指定的文件开始使用 JFR 录制时的选项。该文件可以使用 JMC 应用程序的“飞行记录模板管理器”创建。

关于Java OutOfMemoryError,但在 JFR 中看到的 Activity 对象很少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61295737/

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