垃圾回收算法分为:引用计数法、标记清除法、复制算法、标记压缩清除法、分代算法、分区算法等。
- 引用计数法:这是一个比较古老而经典的算法,其核心就是在对象被引用时加1,引用失败是减1,这种方法存在的严重问题是,无法处理循环引用的问题、每次进行加减操作影响系统性能。
- 标记清除法:就是进行标记和清除两个阶段进行处理内存中对象,这种方式最大的弊端就是空间碎片问题,垃圾回收后的内存空间不是连续的,不连续的内存空间的工作效率远远低于连续的内存空间。
-
复制算法:其核心思想就是将内存空间分为两块,每次只使用一块,在垃圾回收时,将正在使用的内存中存留的对象复制到未被使用的内存快中去,然后清除之前正在使用的内存块中所有的对象,反复交换两块内存的角色,完成垃圾回收。
java堆内存新生代中的from/to空间就是用的这种算法
-
标记压缩清除法:此种方法在标记清除法上面做了优化,把存活的对象压缩到内存的一端,然后进行垃圾清除。
java堆内存中的老年代使用这种算法
- 分代算法:根据对象的特点把内存分为N块,然后根据每个内存的特点使用不同的算法。例如:对于新生代和老年代来说新生代的垃圾回收频率很高,但每次回收耗时很短;而老年代的回收频率低,但耗时相对较长,所以尽量减少老年代的GC。
- 分区算法:主要是将整个内存分为N个独立的空间,每个空间都可以独立的使用,这样就细粒度的控制每个小内存空间,而不是对整个内存进行GC,从而提升性能,并减少GC的停顿时间。
垃圾回收时停顿现象
垃圾回收器的任务是识别和回收垃圾对象进行内存清理,为了让垃圾回收器可以高效地执行,在大部分情况下,会要求系统进入一个停顿状态。停顿的目的是终止所有的应用线程,只有这样才不会产生新的垃圾,同样停顿也保证了系统状态在某一个瞬间的一致性,有益于更好的标记垃圾对象。因此在垃圾回收时,都会产生应用程序的停顿。