首先看下jvm内存中主要需要回收垃圾的区域Heap
回收分为轻量级的GC和重量级的GC , 又称为GC和full GC
GC: 轻量级GC主要作用区域为新生区(Edem),每次轻GC后将会清空Edem区域,未被清除的对象保存到幸存区中,也就是图中的from和to的总称;当幸存区中的对象达到默认存活次数后,该对象进去老年区。
默认存活次数是15, 可以修改配置参数修改这个值
--X:MaxTenuringThreshold=? 来修改存活次数。
四种垃圾回收算法:
1、 复制算法
主要针对于新生区,该算法适用于存活率低的区域,而新生区恰好符合这个特点。
描述: 当Edem经历依次轻GC后,幸存区需要将from区的所有幸存对象移到to区域,并且将Edem中存活的也移到to区,然后将to区名变为from,原来的from区域的东西由于都移动到to区域了,所以此时为空,此时将原from区域名改为to区域。保证:在下一次GC来临之前,to区域永远为空。
这种算法的优点是没有内存碎片,缺点是浪费内存空间,因为永远有一块区域to里面总是为空的。
2、标记清除算法
首先扫描一次内存,标记不需要被GC回收的对象(一块内存空间)
第二次扫描内存,清楚没有被标记的内存
这种算法的要经历两次扫描,所以浪费时间,而且会产生内存碎片,但是不需要额外空间。
3、 标记清除压缩算法
在标记清除的算法之上,增加了压缩功能。主要是在扫描一次内存,将空闲的内存和占有的内存交换,使得内存空间变的规整。压缩后的内存空间如下:
不过,我们可以结合二者以提升时间效率,当进行好几次清除算法在进行一次压缩算法
这种算法非常消耗时间,但是没有内存碎片,也不浪费额外的内存空间,适合存活率高的使用。
4、 分代回收算法
结合上面集中垃圾回收算法的优点,实行分代回收:
新生区存活率低,所以采用复制回收算法
老年代存活率高,采用标记清除压缩算法。