如何在内存不足时生成线程转储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(在不同的操作系统上)附带的应用程序中进行此操作。