2013-03-03 33 views
2

我知道-XX:+HeapDumpOnOutOfMemoryError将在OutOfMemoryError上启用堆转储。如何在内存不足错误时执行线程转储

有什么类似的线程转储?我需要这个以防服务器发生错误时 - 我无法在发生时自行处理它

+0

您可以使用VisualVM做一个HeapDump,较新的Java版本可以在板上查看bin /文件夹。 – 2013-03-03 23:04:45

+0

在Unix中,SIGQUIT(无论是使用kill命令发送还是通过在程序控制台中键入Ctrl- \)都会转储所有线程的堆栈跟踪。在Windows中,程序控制台中的Ctrl-Break将执行此操作。 – VGR 2013-03-03 23:10:25

回答

2

发生OutOfMemoryError的确切执行点非常多(除非您有单个线程应用程序) ,所以我认为在OOM上获得线程转储不会太有意义。至少这是真的,如果它是'Java堆空间'类的OOM,但也可能用于其他类型的OOM错误。

无论如何,看看this older post解决同样的问题。

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

+0

感谢您的链接。我们正在使用服务包装,我发现配置设置。否则,我会去异常处理程序解决方案。 – 2013-03-04 05:05:30

+0

上面的“旧帖子”提出:-XX:OnOutOfMemoryError =“kill -3%p” – vorburger 2017-03-09 12:23:40