我运行了一个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错误?
答案 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
}