JVM——Minor GC、Major GC和Full GC之间的区别

1.Minor GC

我们知道,新生代可以分为Eden和Survivor区域,而从新生代代空间(包括 Eden 和 Survivor 区域)回收内存则被称为 Minor GC。可以参考JVM——四种垃圾收集算法详解中的标记复制算法。

2.Major GC vs Full GC

  • Major GC 是清理老年代。但是由于很多MojorGC 是由MinorGC 触发的,所以有时候很难将MajorGC 和MinorGC区分开。出现了 Major GC,经常会伴随至少一次的 Minor GC(但非绝对的,ParallelScavenge 收集器的收集策略里就有直接进行 Major GC 的策略选择过程) 。MajorGC 的速度一般会比 Minor GC 慢 10倍以上。
  • Full GC 是清理整个堆空间—包括年轻代和老年代。

3.触发机制

Minor GC触发机制: 当年轻代满时就会触发Minor GC,这里的年轻代满指的是Eden代满,Survivor满不会引发GC。 
Full GC触发机制: 

  • 调用System.gc时,系统建议执行Full GC(但是不必然执行 )
  • 老年代空间不足 
  • 方法区空间不足 
  • 通过Minor GC后进入老年代的平均大小大于老年代的可用内存 
  • 由Eden区、survivor space1(From Space)区向survivor space2(To Space)区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
  • 当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载。 
     

其实Full GC定义是相对明确的,就是针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC;Minor GC和Major GC是俗称,在Hotspot JVM实现的Serial GC, Parallel GC, CMS, G1 GC中大致可以对应到某个Young GC和Old GC算法组合;
因此,简单的说,GC的触发条件就是某GC算法对应区域满了,或是预测快满了。比如,上文说到的,各种Young GC的触发原因都是eden区满了。

好啦,以上就是关于几种GC的相关知识总结啦,如果大家有什么不明白的地方或者发现文中有描述不好的地方,欢迎大家留言评论,我们一起学习呀。

Biu~~~~~~~~~~~~~~~~~~~~宫å´éªé¾ç«è¡¨æå|é¾ç«gifå¾è¡¨æåä¸è½½å¾ç~~~~~~~~~~~~~~~~~~~~~~pia!

猜你喜欢

转载自blog.csdn.net/Searchin_R/article/details/85101967