1、概念
GC 中的垃圾,特指存在于内存中、不会再被使用的对象。垃圾回收有很多种算法,如引用计数法、复制算法、分代、分区的思想。
2、算法
1、引用计数法:对象被其他所引用时计数器加 1,而当引用失效时则减 1,。但这种方式有非常严重的问题:无法处理循环引用的情况、还有就是每次进行加减操作比较浪费性能。
2、标记清除法:就是分为标记和清除两个阶段进行处理内存中的对象,当然这种方式也有非常大的弊端,就是空间碎片问题,垃圾回收后的空间不是连续的,不连续的内存空间工作效率要低于连续的内存空间 ( java 中新生代的 from 和 to 空间就是使用的复制算法 )
3、复制算法:其核心思想就是将内存分为两块,每次只使用一块,在垃圾回收时,将正在使用的内存中的存留对象复制到未被使用的内存中去,之后清除之前使用内存中的对象,反复去交换两个内存的角色,完成垃圾回收。
4、标记压缩法:标记压缩法在标记清除法基础上做了优化,把存活的对象压缩到内存一端,然后进行垃圾清理。( java 中老年代就是使用的标记压缩法 )
5、分代算法:根据对象的特点把内存份为 n 块,然后根据每个内存的特点使用不同的算法。对新生代和老年代来说,新生代回收频率高,但每次耗时短,而老年代回收频率低,但耗时相对较长,所以应当尽量减少老年代的 GC。
6、分区算法:将整个内存分为 n 个独立空间,每个小空间都可以独立使用,这样细粒度的控制一次回收多少个小空间和哪些空间,而不是对整个空间进行 GC,从而提升性能,并减少 GC 的停顿时间。
3、为什么新生代和老年代使用不同的算法
新生代里面的对象死得快、死的多,所以采用复制算法可以一次性大批量 GC
老年代里面的对象死的少、死的慢,所以采用标记压缩法一次性小批量 GC