首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在内存不足错误上生成线程转储java

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

Stack Overflow用户
提问于 2010-05-07 10:57:44
回答 6查看 22K关注 0票数 14
  • 除了堆转储(java_pid14941.hprof)之外,java 6是否生成线程转储?
  • 这就是我的申请之一发生的事。 java.lang.OutOfMemoryError: GC开销限制超过了将堆转储到java_pid14941.hprof .
  • 我确实在工作目录中找到了ava_pid14941.hprof,但是没有找到任何包含线程转储的文件。当我得到这个OutOfMemory错误时,我需要知道所有线程都在做什么。
  • 除了内存异常上的堆转储之外,还有任何配置选项可以生成线程转储吗?
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-05-07 12:15:12

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

你的问题可以简化为:

  • 如何生成线程转储

以及:

  • 如何捕捉内存不足的错误(请不要注意这里的naysayer,他们错过了更大的图片,请看我的评论)

所以其实很简单,你可以这样做:

  • 安装默认的未处理异常处理程序
  • 在捕获一个未捕获的异常时,检查是否有一个OutOfMemoryError
  • 如果您有一个OutOfMemoryError,请自己生成一个完整的线程转储,或者要求用户通过电子邮件将其发送给您,或者主动提供自动发送它。

奖励:它在1.5上也很好:)

代码语言:javascript
复制
 Thread.setDefaultUncaughtExceptionHandler( new Thread.UncaughtExceptionHandler() {
     public void uncaughtException( final Thread t, final Throwable e ) {
         ...
     }

您可能需要研究以下内容:

代码语言:javascript
复制
 e.getMessage();

这是:

代码语言:javascript
复制
Thread.getAllStackTraces();

我一直在一个应用程序中这样做,这个应用程序在数百个不同的1.5和1.6JVM上(在不同的OSes上)。

票数 17
EN

Stack Overflow用户

发布于 2010-05-20 15:05:19

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

代码语言:javascript
复制
-XX:OnOutOfMemoryError="kill -3 %p"

这样,您就不必让您的应用程序生成定期线程转储,当它实际阻塞时,您将得到一个快照。

使用%p,您不需要传递PID,JVM将自动选择正确的进程id作为这里提到的

票数 22
EN

Stack Overflow用户

发布于 2014-07-17 12:59:37

当使用j堆栈触发OnOutOfMemoryError时,可以触发线程转储。例如:-

代码语言:javascript
复制
jstack -F pid > /var/tmp/<identifier>.dump
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2787976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档