GC-垃圾回收算法

GC-垃圾回收算法

标记清除算法(Mark-Sweep)

最基础的垃圾回收算法,分为标记和清除两个阶段:
1.标记出所有需要回收的对象;
2.回收被标记的对象所占用的内存空间;
算法效率较低, 会产生较多内存碎片, 可能会导致大对象找不到可利用空间问题。
GC-垃圾回收算法

复制算法(Cpoying)

按照内存容量将内存划分为相等大小的两块内存区域。每次使用时只使用其中的一块,当这一块内存满后将存活的对象复制到另一块内存区域上去,将剩余的已使用的内存回收。
这种算法实现简单,内存效率高,不易产生内存碎片,但是内存使用率被压缩到了以前的一半。当存货对象增多时,复制算法的效率会大大降低。
GC-垃圾回收算法

标记整理算法(Mark-Compact)

结合以上两个算法,为了避免缺陷而提出,标记阶段和标记清除算法相同,但标记后不是清理对象,而是将存活的对向移至内存的一端,然后清除边界外的对象。
GC-垃圾回收算法

分代收集算法

目前JVM大部分采用的都是分代收集算法,是根据对象存活的不同生命周期将内存划分为不同的域。主要将GC堆内存划分为新生代(Young Generation)和老年代(Tenured/Old Generation)。新生代的特点是每次垃圾回收都要大量垃圾被回收,采用的是复制算法;老年代的特点是每次进行垃圾回收时只有少数对象需要回收。

目前大部分JVM的GC对于新生代都采用复制算法(Cpoying),因为新生代中每次垃圾回收都要回收大部分对象,即需要复制的对象较少。新生代内存区域主要分为一个较大的Eden内存空间和两个较小的Survivor(From 和To,这两块内存时相对的)内存空间,默认大小比例为8:1:1,每次使用时只使用Eden空间和其中一块Survivor(From)空间,当Eden和From Survivor内存空间不足时,进行一次垃圾回收,会将这两块空间中尚存活的对象复制到另一块Survivor空间(To Survivor)中,然后清理Eden和From Survivor的内存空间;如果To Survivor内存空间无法存储某个对象时,则会将该对象存储至老年代;此时From区和To互换,如此循环;当对象在一次GC时未被清除,该对象年龄就会+1。默认情况下,年龄达到15的对象就会被移至老年代。
GC-垃圾回收算法