1、标记-清除算法
标记-清除算法是最基础的收集算法,分为标记和清除两个阶段,首先标记处需要回收的对象,标记完成后统一回收所有被标记的对象。有两个主要的缺点:效率不高,会产生内存碎片。
2、复制算法
复制算法可以解决效率的问题,适合在存活大小较少时使用,基本的思想将可用内存分为大小相等的两块A和B,每次只使用其中一块。当其中一块A用完,就将存活的对象直接复制到另一块B空间中,把原来的那一块空间A全部清空,使用B来支撑程序正常执行,如此循环交替。这种算法的好处在于:不用考虑内存碎片,实现简单,运行高效。代价在于内存空间缩小为原来的一半。
实际上,Hotspot虚拟机将新生代内存空间分为一块较大的Eden空间和两块较小的Survivor(s0,s1)空间,每次使用Eden空间和其中一块Survivor空间,当进行垃圾回收时,将正在使用的Eden和Survivor空间中存活的对象复制到另外一块空闲的Survivor空间,同时清空掉刚才使用的Eden和Survivor空间,再使用Eden和另一块Survivor。默认情况下Eden和Survivor的大小比例是8:1,当Survivor空间不够用时,需要使用内存担保机制(依赖其他内存如老年代进行分配担保,直接进入老年代)。
3、标记-整理算法
标记-整理算法核心思想是让所有存活的对象向空间一端移动,然后直接清理掉边界以外的空间。主要是针对对象成活率较高,只有少数对象被回收的情况,适合老年代使用,不会出现内存碎片问题。
4、分代回收算法
分代回收算法将根据对象存活周期的长短,将堆分为新生代和老年代,并采用不同的算法。新生代中,每次垃圾收集都会有大量对象被回收,只有少量对象存活,适合采用复制收集算法;老年代中,对象存活率高,适合采用标记-整理算法。
Minnor GC和Full GC的不同:
新生代GC(Minnor GC):发生在新生代的垃圾收集动作,对象存活期短,Minnor GC非常频繁,速度也比较快。
老年代GC(Major GC/Full GC):发生在老年代的垃圾收集动作,对象存活期长,Major GC比Minnor GC慢很多(10倍以上)。