如何在内存不足时生成线程转储Java
问题内容:
-
除了堆转储(java_pid14941.hprof),Java 6还会生成线程转储吗?
-
这就是我的一个应用程序发生的事情。
java.lang.OutOfMemoryError:超出了GC开销限制将堆倾倒到java_pid14941.hprof …
-
我确实在工作目录中找到了ava_pid14941.hprof,但没有找到任何包含线程转储的文件。当我收到此OutOfMemory错误时,我需要知道所有线程在做什么。
-
除了发生内存不足异常时的堆转储之外,是否有任何配置选项会生成线程转储?
问题答案:
如何在发生内存不足错误时生成线程转储Java?
您的问题可以简化为:
- 如何生成线程转储
和:
- 如何捕获内存不足错误(在这里不要注意naysayer,他们正在错过大图,请参阅我的评论)
因此,这实际上很容易,您可以这样操作:
-
安装默认的未捕获异常处理程序
-
捕获未捕获的异常后,检查是否存在OutOfMemoryError
-
如果存在OutOfMemoryError,请为自己生成一个完整的线程转储,然后要求用户通过电子邮件将其发送给您,或者主动提供自动发送
奖励:它在1.5上也能正常工作:)
Thread.setDefaultUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler() {
public void uncaughtException( final Thread t, final Throwable e ) {
...
}
您可能需要调查以下内容:
e.getMessage();
还有这个:
Thread.getAllStackTraces();
我一直在使用数百种不同的1.5和1.6 JVM(在不同的操作系统上)附带的应用程序中进行此操作。