如何在内存不足错误时生成线程转储java

2022-09-03 16:56:10
  • 除了堆转储之外,java 6 是否还会生成线程转储 (java_pid14941.hprof)

  • 这就是我的一个应用程序所发生的事情。

    java.lang.OutOfMemoryError: GC 开销限制超过 Dumping heap to java_pid14941.hprof ...

  • 我确实在工作目录中找到了ava_pid14941.hprof,但没有找到任何包含线程转储的文件。我需要知道当我得到这个OutOfMemory错误时,所有线程都在做什么。

  • 除了内存不足异常时的堆转储之外,是否有任何配置选项会生成线程转储?


答案 1

如果你在Linux/Unix环境中,你可以这样做:

-XX:OnOutOfMemoryError="kill -3 %p"

这样,您就不必让应用程序生成定期线程转储,并且在实际阻塞时将获得快照。

有了 ,您不需要传递 PID,JVM 将自动选择正确的进程 ID,如此处所述%p


答案 2

如何在内存不足错误时生成线程转储java?

您的问题可以简化为:

  • 如何生成线程转储

和:

  • 如何捕捉内存不足的错误(不要注意这里的反对者,他们错过了更大的图景,请参阅我的评论)

所以这实际上很容易,你可以像这样做:

  • 安装默认的未捕获异常处理程序

  • 在捕获未捕获的异常时,请检查您是否有一个 OutOfMemoryError

  • 如果你有一个 OutOfMemoror,请为自己生成一个完整的线程转储,并要求用户通过电子邮件将其发送给您,或者主动提出自动发送它

优点:它在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(在不同的操作系统上)上发布。


推荐