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

标签 java out-of-memory performance-testing

我有一些代码会抛出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/

相关文章:

java - 即使在设置 Cache-Control 后,动态生成的 CSS 文件也不会被缓存

c - 运行中内存不足时撤消C动态数据结构的变化

javascript - node.js "net"性能测试

ruby - 如何在 Ruby/Rails 中节省 CPU 周期?

Java编译时错误和异常处理中的多个catch block

java - 注解处理后,JVM 永远不会终止;每次构建之前必须清洁

java - Android 应用程序中 ArrayList 的 OutOfMemoryError

android - 将图像加载到位图对象时出现奇怪的 OutOfMemory 问题

tomcat - cpu如何分配给一个进程?

java - 在 xml 中使用 < 和 > 符号