编程语言
首页 > 编程语言> > 如何调试Java OutOfMemory异常?

如何调试Java OutOfMemory异常?

作者:互联网

调试java.lang.OutOfMemoryError异常的最佳方法是什么?

当我们的应用程序发生这种情况时,我们的应用服务器(Weblogic)会生成堆转储文件.我们应该使用堆转储文件吗?我们应该生成Java线程转储吗?究竟有什么区别?

更新:生成线程转储的最佳方法是什么? kill -3(我们的应用程序在Solaris上运行)是杀死应用程序并生成线程转储的最佳方法吗?有没有办法生成线程转储但不杀死应用程序?

解决方法:

分析和修复Java中的内存不足错误非常简单.

在Java中,占用内存的对象都链接到其他一些对象,形成一棵巨树.想法是找到树的最大分支,这通常指向内存泄漏情况(在Java中,当您忘记删除对象时,泄漏内存,但是当您忘记忘记对象时,即保留在某处提到它).

步骤1.在运行时启用堆转储

使用-XX运行您的进程:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = / tmp

(始终启用这些选项是安全的.根据需要调整路径,必须由java用户写入)

第2步.重现错误

让应用程序运行,直到发生OutOfMemoryError.

JVM将自动写入类似java_pid12345.hprof的文件.

第3步.获取转储

将java_pid12345.hprof复制到您的PC(它将至少与您的最大堆大小一样大,因此可以变得非常大 – 如有必要,请将其gzip).

步骤4.使用IBM的Heap Analyzer或Eclipse的Memory Analyzer打开转储文件

堆分析器将为您显示错误发生时所有对象的树.
有可能在打开时直接指出问题.

IBM HeapAnalyzer

注意:给HeapAnalyzer足够的内存,因为它需要加载你的整个转储!

java -Xmx10g -jar ha456.jar

步骤5.确定最大堆使用的区域

浏览对象树并识别不必要地保留的对象.

请注意,也可能发生所有对象都是必需的,这意味着您需要更大的堆.大小和tuneappropriately.

第6步.修复代码

确保只保留实际需要的物体.及时从集合中删除项目.确保不要保留对不再需要的对象的引用,然后才能对它们进行垃圾回收.

标签:java1-4,java,out-of-memory,coredump,thread-dump
来源: https://codeday.me/bug/20190928/1827746.html