0

我运行了一个 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>> <> <>

<1372410567863>

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

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

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

4

1 回答 1

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
}

如需打印,请参见此处此处

于 2013-06-29T12:32:03.467 回答