核心思想
- 找到内存中存活的对象
- 释放不再存活对象的内存,使得程序能够再次利用这部分空间
垃圾回收算法的评价标准
Java 垃圾回收过程会通过单独的 GC 线程来完成,但是不管使用哪一种 GC 算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为 StopTheWorld 简称 STW,如果 STW 时间过长则会影响用户的使用。
- 吞吐量:吞吐量指的是 CPU 用于执行用户代码的时间与 CPU 总执行时间的比值,即吞吐量=执行用户代码时间/(执行用户代码时间+GC 时间)。吞吐量数值越高,垃圾回收的效率就越高。
- 最大暂停时间:最大暂停时间指的是所有在垃圾回收过程中的STW时间最大值。
- 堆使用效率:不同垃圾回收算法,对堆内存的使用方式是不同的。比如标记清除算法,可以使用完整的堆内存。而复制算法会将堆内存一分为二,每次只能使用一半内存。从堆使用效率上来说,标记清除算法要优于复制算法。
传统垃圾回收算法
标记清除算法
- 标记阶段:将所有存活的对象进行标记。Java 中使用可达性分析算法,从 GC Root 开始通过引用链遍历出所有存活对象
- 清除阶段:从内存中删除没有被标记,也就是非存活对象
-
优点:实现简单
-
缺点:碎片化问题、分配速度慢
复制算法
将存活的对象放到另外一块空间,并将当前空间清理掉
- 优点:吞吐量高、不会发生碎片化
- 缺点:内存使用效率低
标记整理算法