标记就是把需要回收的对象标志出来;
标记-清除是最基础的回收算法。它有两个问题。首先是效率问题,标记和清除这两个过程,都需要全部扫描一遍;另一个问题就是空间问题,标志清除之后会产生大量不连续的内存碎片,当碎片太多的时候,就无法周到足够的连续的内存,不得不提前触发另一次的垃圾收集动作。
另一种回收算法是标记-整理算法。标记的步骤和标记-清除算法一样,但是后续步骤不是直接对对象进行删除,而是让存活的对象都向一端移动,然后之际清理掉端边界以外的内存。
分代收集算法。这种算法是根据对象存活周期的不同将内存分成好几块。一般就是把Java 堆分成新生代(Young Generation)和老年代(Old Generation)。然后根据各个年代采用最适当的收集算法。在新生代采用了类似于复制算法。而老年代因为对象存活率高,没有额外空间对它担保,所以必须采用“标记-清理”或者“标记-整理”算法来进行回收。
原文👇:https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html#t3