首先查看GC日志需要在启动时-XX:+PrintGCDetails,在idea中

GC日志的查看(日志意思)

下面来分析一下GC日志直接贴图:

 GC日志的查看(日志意思)

GC日志的查看(日志意思)

先看头 [GC (Allocation Failure)  这个标识youngGC发生在young区的GC;[Full GC (Ergonomics) 是fullGC是发生在old区的GC

分开来看,先看youngGC,[PSYoungGen: 1362K->297K(2048K)] (即第一张图youngGC第二个框的数据),表示在执行youngGC前young区占用了1362k的空间,GC后占用了297k的空间,总的大小是2048k,这里GC后,大部分被回收,也有少量的进入了old区。4692K->3627K(9216K)(即第一张图youngGC第三个框的数据),表示youngGC前占用了4692k的数据,GC后占用了3627k数据;最后的0.0003604表示执行GC花费的时间单位秒。画个表格来解释(占用空间)

  GC前 GC后 总容量 耗时
young区 1362K 297K 2048K 0.0003604
堆内存 4692K 3627K 9216K 0.0003604
old区(推算)

1362-297=1065即young区被回收容量

4692-3627=1065即整个堆内存被回收容量

1065(young)-1065(heap)=0刚刚好此次回收没有对象

进入old区,但不是每次都不会,可以看下面一条。

再看fullGC,[PSYoungGen: 1480K->0K(2048K)](即第一张图fullGC第二个框的数据)表示young区状态,GC前有1480k,GC后被清空。[ParOldGen: 6678K->1745K(7168K)] 8158K->1745K(9216K) (即第一张图fullGC第三个框的数据)也即GC前old区占用空间是6678K,GC后占用空间1745K,总空间7168K。堆GC前占用空间8158K,GC后占用空间1745K,总空间9216K。[Metaspace: 3512K->3512K(1056768K)]是元空间信息。画个表格来解释(占用空间):

 

然后看第二张图,当FullGC回收时多次回收后均没有释放空间时,就会抛出异常OOM:java.lang.OutOfMemoryError: Java heap space。

相关文章: