JVM进行垃圾回收需要确定哪些是垃圾对象,有两种确认方法:
- 引用计数法:如果一个对象被引用,则引用计数+1,反之-1,那么引用计数为0的则为垃圾对象,但是这种方式无法解决循环引用问题。
- 根可达算法:通过一系列成为GC Roots的对象作为起点,向下搜索。当一个对象到任何GC Roots都没有引用链相连,说明其已经死亡。
JVM的垃圾回收算法包含以下几种:
- 复制算法:该算法主要作用在堆中的年轻代,具体过程为将不是垃圾对象从eden区+survior from区复制到survior to区,所有存活对象年龄+1,然后再循环下一次复制。该算法的特点是效率高,适合处理大量对象成为垃圾的场景,因为年轻代的对象都是朝生夕死,但是缺点就是有内存的浪费。
- 标记清除算法:最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。该算法的缺点是产生内存碎片。
- 标记整理算法:前一个阶段和标记清除很相似,都是标记需要回收的对象,标记后不是清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。该方法相对标记清除不会产生内存碎片,但是相对来说效率会低一些。