当发生许多外部错误时,我怎样才能准确地进行线程转储?

时间:2013-06-29 12:09:28

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

我运行了一个jvm进程,有一天它遇到了outofmemory异常。在日志中我发现了许多outofmemory错误::

-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>> <> <>
     

&LT; 1372410567863&GT;

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

我想编写一个小程序,当发生outofmemory错误时会自动生成一个threaddump文件。

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

1 个答案:

答案 0 :(得分:0)

我可能会尝试使用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