JVM的学习5_____垃圾回收:分代收集算法

本文主要了解三种常用的垃圾收集算法:

  1. 标记清除-算法(Mark Sweep);
  2. 复制算法(Copying);
  3. 标记-压缩算法(Mark-Compact);

1.标记-清除算法(Mark Sweep):

    此过程分为两个步骤:垃圾标记,垃圾清除。该算法相比于其他两个算法:执行效率低下,还容易产生内存碎片。

    但是由于老年代的生命周期比较长,使用复制清除算法操作的对象会比较多,所以老年代会使用标记清除算法。但是由于内存空间的碎片化比较严重大大降低了内存的使用率,因此标记压缩算法由此而生。

2.复制算法:

    复制算法广泛的应用于新生代(由于新生代中对象的生命周期比较短暂)中,明显的提高的GC的执行效率。当执行一次Minor GC(新生代的垃圾回收)时,Eden中存活的对象和From中之前已经经历过一次Minor GC并且还继续存活的对象都会被复制到to区域中,以下两种情况对象会直接晋升到老年代中,一是当From中存活的对象的分代年龄超过阈值时会直接放进到老年代,二是当to中容量已满放不下时,会将部分对象放进到老年代。此时,Eden和From中就只剩了垃圾对象,就可以进行垃圾清理,释放掉其所占用的内存空间。接下来将ToSurvivor和FromSurvivor调换位置,必须保证一个Survivor空间是空的。这就是复制清除算法。

3.标记-压缩算法:

    老年代的Full GC(也叫Major GC)使用的该算法,在标记处垃圾对象后,会将存活的对象方法到一个规整并连续的内存空间中,然后执行Full GC。当Full GC执行完毕后已用的内存未用的内存之间靠一个指针维系着,该指针记录了下一次分配的起始点的位置,下一次为新对象进行内存分配时,可使用指针碰撞法进行分配相当的便捷高效。

posted @ 2019-08-22 23:42  德鲁大叔817  阅读(657)  评论(0编辑  收藏  举报