【问题标题】:How can i take a thread dump exactly when many outofmemory error occur?当发生许多内存不足错误时,如何准确地进行线程转储?
【发布时间】:2013-06-27 03:09:57
【问题描述】:

我运行了一个 jvm 进程,有一天它遇到了内存不足的异常。在日志中我发现了很多内存不足的错误::

-bash-3.00# grep OutOfMemoryError AdminServer.log00399
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
####<2013-6-28 05:09:27 pm CST> <Error> <Server> <kfmsapp2> <AdminServer> <DynamicListenThread[Default[3]]> <<WLS Kernel>> <> <>

它还生成了一个heapdump文件,我用mat分析后发现是一个线程中的一个大对象,我只知道它是一个hibernate公共对象org.hibernate.engine.PersistenceContext,但我不知道它来自哪里。

我想写一个小程序,当出现内存不足的错误时,它会自动生成一个threaddump文件。

我的问题是:程序执行的时间最好准确地进行线程转储?是在日志文件中出现的第一个内存不足错误吗?

【问题讨论】:

    标签: java out-of-memory heap-dump


    【解决方案1】:

    我可能会尝试使用UncaughtExceptionHandler

    public static void main(String[] args) {
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
    
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces();
                // print it ...
            }
        });
    
                // ... continuing
    }
    

    如需打印,请参阅herehere

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2011-10-18
      • 2011-11-29
      • 1970-01-01
      相关资源
      最近更新 更多