OOM异常后GC收集日志信息
我们先对-Xms -Xmx等参数做一个设置 方便来出现OOM异常(我们将堆的大小设定为10m)
我们的测试代码
package com.zyk;
import java.util.Random;
public class JVMTest {
public static void main(String[] args) throws Exception{
/* long maxMemory =Runtime.getRuntime().maxMemory();
long totalMemory =Runtime.getRuntime().totalMemory();
System.out.println("-Xmx:MAX_MEMORY = "+maxMemory+"字节"+(maxMemory/(double)1024/1024)+"MB");
System.out.println("-Xms:TOTAL_MEMORY = "+totalMemory+"字节"+(totalMemory/(double)1024/1024)+"MB");*/
String str = "hello";
while (true) {
str += str + new Random().nextInt(988898989) + new Random().nextInt(799898989);
}
}
}
结果图
我们对红框选中的日志信息做一个简单分析
[GC (Allocation Failure)
[PSYoungGen: 2029K->504K(2560K)]
2029K->676K(9728K), 0.0009753 secs]
[Times: user=0.00 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 2029K->504K(2560K)]
2029k:YongGC之前新生代的内存占用
504k:YongGC之后新生代的内存占用
2560k:新生代总共的大小(堆内存我们分配了10m 这里新生代大致分配了三分之一)
2029K->676K(9728K)
2029k:YongGC之前JVM堆的内存占用
676k:YongGC之后JVM堆的内存占用
9728k:JVM对的总大小(约等于我们分配的10m)
这张图片展示的更加清楚
我们在对OOM之前最后一次的FullGC做一次分析
[Full GC (Allocation Failure) [PSYoungGen: 0K->0K(2048K)]
[ParOldGen: 5040K->5020K(7168K)]
5040K->5020K(9216K),
[Metaspace: 3502K->3502K(1056768K)], 0.0075995 secs]
[Times: user=0.00 sys=0.00, real=0.00 secs]
[ParOldGen: 5040K->5020K(7168K)]
5040k:GC前old区占用的空间大小
5020k:GC后old区占用的空间大小
7168k:old区总大小
5040K->5020K(9216K),
5040k:GC前JVM堆的内存占用
5020k:GC后JVM堆的内存占用
9216k:JVM堆的总大小(约等于young区加old区的大小)