【问题标题】:How to do thread dump on Out Of Memory Error [duplicate]如何在内存不足错误时进行线程转储[重复]
【发布时间】:2013-03-03 23:02:37
【问题描述】:

我知道-XX:+HeapDumpOnOutOfMemoryError 将在 OutOfMemoryError 上启用堆转储。

线程转储有什么类似的吗?我需要这个以防服务器上发生错误 - 当它发生时我无权访问进程本身

【问题讨论】:

  • 你可以使用 VisualVM 做一个 HeapDump,较新的 Java 版本有它,查看 bin/ 文件夹。
  • 在 Unix 中,SIGQUIT(无论是通过 kill 命令发送还是通过在程序控制台中键入 Ctrl-\ 发送)将转储所有线程的堆栈跟踪。在 Windows 中,程序控制台中的 Ctrl-Break 将执行此操作。

标签: java jvm out-of-memory sun


【解决方案1】:

引发 OutOfMemoryError 的确切执行点非常随机(除非您有一个单线程应用程序),因此我认为在 OOM 上获取线程转储没有太大意义。如果它是“Java 堆空间”类型的 OOM,至少这是正确的,但可能也适用于其他类型的 OOM 错误。

不管怎样,看看this older post 解决同样的问题。

不过,解决 OOM 错误的更好方法是使用 Eclipse Memory Analyzer Tool 检查堆转储。它通过将对象图转换为所谓的dominator tree 来帮助您识别内存泄漏。这种结构揭示了对象之间的保持活动依赖关系,因此很容易识别负责保留最大内存块的对象(请参阅Shallow vs. Retained Heap)。

【讨论】:

  • 感谢您的链接。我们正在使用服务包装器,我找到了它的配置设置。否则我会使用异常处理程序解决方案。
  • 上面的“老帖”建议:-XX:OnOutOfMemoryError="kill -3 %p"
猜你喜欢
  • 2011-02-16
  • 2013-06-27
  • 2018-08-25
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2021-08-25
相关资源
最近更新 更多