通常在OutOfMemoryError之后生成的线程转储包含有关最后几个垃圾收集器周期的信息( GC历史记录部分)。但是我没有这些信息就得到了OutOfMemory线程转储。
1STGCHTYPE GC History
NULL
NULL ------------------------------------------------------------------------
0SECTION LOCKS subcomponent dump routine
NULL ===============================
环境:IBM WebSphere 7.0.0.19
有人知道为什么这个转储没有这个信息吗? GC根本没有开始?
答案 0 :(得分:2)
如果您的程序一次性请求足够大的内存(如大型数组分配等),JVM无法实现,则会发生这种情况。
答案 1 :(得分:2)
在这种情况下,您应该查看JVM与转储一起生成的Snap.*.trc
文件。它是一个二进制文件,但IBM提供tool来解码该跟踪文件。
上次我看到没有GC历史记录的javacore
文件时,这是因为OutOfMemoryError
不是由堆(或本机内存)饥饿引发的,而是由于过多的垃圾收集开销。跟踪文件中清楚地表明了这一点。