产品详情
垃圾收集器的基本原理
垃圾收集器通过追踪对象的引用情况,识别出那些不再被引用的对象,并回收它们所占用的内存。这一过程通常包括三个阶段:
- 标记(Marking):标记出所有存活的对象。
- 清除(Sweeping):清除未被标记的对象,释放它们的内存。
- 压缩(Compacting,可选):将存活的对象压缩到内存的一端,以便腾出连续的内存空间,减少内存碎片。
二、常见的垃圾收集算法
-
标记-清除算法(Mark-Sweep):
- 原理:标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。
- 缺点:效率问题(标记和清除过程的效率都不高)和空间问题(标记清除之后会产生大量不连续的内存碎片)。
-
复制算法(Copying):
- 原理:将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
- 优点:实现简单,运行高效,且没有内存碎片。
- 缺点:将内存缩小为原来的一半,持续复制长生存期的对象则导致效率降低。
-
标记-整理算法(Mark-Compact):
- 原理:标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
- 优点:避免了内存碎片的产生。
-
分代收集算法(Generational Collection):
- 原理:根据对象存活周期的不同将内存划分为几块,如新生代和老年代。这样就可以根据各个年代的特点采用最适当的收集算法。
- 应用:在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法;而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。


