思想
枚举根节点,做可达性分析
该节点是垃圾节点,虽然相互持有引用,但无法枚举到根节点,和根节点没任何关系,所以会作为垃圾节点被回收
根节点
类加载器
Thread
虚拟机栈的本地变量表
Static成员
常量引用
本地方法栈的变量
标记清除
分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有
缺点:
效率不高。标记和清除两个过程的效率都不高
产生碎片。碎片太多会导致提前GC
复制
它将内存按容量划分为大小相等的两块,每次只使用其中的一块。当这块内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉
优缺点:
实现简单,运行高效,但空间利用率低
标记整理
标记过程仍然与”标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一段移动,然后直接清理掉端边界以外的内存
优缺点:
没有了内存碎片,但整理内存比较耗时
分带垃圾回收
Young区用复制算法
对象是在young区进行内存分配的,大部分对象生命周期短,所以该算法效率比较高
Old区标记清除或标记整理
对象是在old区,生命周期比较长
对象分配
对象优先分配到Eden区
大对象直接进入老年代
-XX:PretenureSizeThreshold :定义多大的对象进入老年代
长期存活对象进入老年代
-XX:MaxTenuringThreshold:年龄达到多少岁进入老年代