我有一些代码会抛出OutOfMemoryError
。
我将 JVM 设置为在 OOM 时转储,并在 Java Flight Recorder 中打开转储。
在 JFR 中检查 Activity 对象时,我看到的对象很少(少于 60 个)。
如何找出 OOM 触发时内存中保存且不可回收的最大对象?
最佳答案
对象是采样的,因此无法确保在 OOM 之前看到最大的对象。
也就是说,60 个样本通常足以发现内存泄漏,至少在应用程序已运行一段时间并且泄漏的大小不可忽略的情况下是如此。
开始时发生的示例通常是在整个应用程序持续时间内拥有的单例和静态对象。最后发生的样本通常是要被垃圾收集的短期对象。在 JMC 中,您可以单击顶部时间线的“中间”来查找更多泄漏候选者。然后您可以查看堆栈跟踪和 GC 根路径,看看是否看到可疑的内容。
您还可以使用命令行工具并执行以下操作:
$ jfr print --events OldObjectSample --stack-depth 64 recording.jfr
它将按时间顺序列出样本。查看每个样本可能比查看聚合更容易。命令行方法详细描述here
关于Java OutOfMemoryError,但在 JFR 中很少看到 Activity 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61295737/