JVM 知识点整理:知识点整理:GC垃圾收集器及相关算法垃圾收集器及相关算法
JVM 知识点整理:知识点整理:GC垃圾收集器垃圾收集器判断哪些对象需要回收引用计数器算法可达性分析算法引用还有分类(了解)“缓刑”
finalize(了解)开始垃圾收集标记 – 清除算法复制算法标记 – 整理算法分代收集算法HotSpot 算法枚举根节点安全点安全区
域
判断哪些对象需要回收判断哪些对象需要回收
Java 堆里存放着几乎所有的对象实例,因此在回收前需要判断哪些对象是 “存活” 的,这些对象不需要回收,只回收已经 “死
去” 的对象(即不可能再被任何途径使用的对象)。
引用计数器算法引用计数器算法
算法原理:
给对象添加一个引用计数器,每当有一个地方引用它时,计算器 +1;当引用失效时,计数器 -1;任何时刻计数器为 0 的对象就是不可能再被使用的,可以
被回收。
优点:优点: 实现简单,判断效率高
缺点:缺点: 无法解决对象间相互引用的问题
应用:应用: Python 语言,游戏脚本领域使用的 Squirrel 等
可达性分析算法可达性分析算法
算法原理:算法原理:
从一系列称为 “GC Roots” 的对象为起点,沿着引用链向下搜索,当一个对象到 GC Roots 没有任何引用链相连,则证明此对象可以被回
收(即 GC Roots 无法到达此对象)。
GC Roots 的对象:的对象:
虚拟机栈(栈帧中的本地变量表)中引用的对象。
对象在创建时候,会在堆上开辟一个空间用于分配实例,之后把堆的地址作为引用存放在栈中,在对象生命周期结束后,引用就会
从虚拟机栈中出栈
方法区(永久代)中类静态属性引用的对象。
即被 static 修饰的静态对象,存放在方法区中
方法区(永久代)中常量引用的对象。
即被 static 与 final 修饰的对象,存放在方法区中
本地方法栈中 JNI(即一般说的 Native 方法)引用的对象。
JNI 即 Java Native Interface,主要用于帮助 Java 与 别的语言进行通信(主要 C,C++)提供接口。
缺点:缺点: GC停顿,为了保证一致性,导致GC进行时必须停顿所有的 Java 执行线程。可以想象下,系统运行一半,突然像被人按了
暂停键一样突然卡住了,然后 GC 结束才继续。