JVM垃圾回收过程有哪些关键步骤?
- 内容介绍
- 相关推荐
本文共计944个文字,预计阅读时间需要4分钟。
JVM垃圾回收算法众多,但不管哪种算法,在执行GC时的大致流程都相差不大,主要包括以下三个过程:
1. 指标根节点:这个过程主要是找到所有的GC Roots对象,这些对象通常包括字符串常量池、类加载器、线程栈等。这个步骤主要是为了找到所有存活的对象。
2. 标记可达对象:从GC Roots开始,遍历所有可达的对象,将它们标记为存活。
3. 清理不可达对象:最后,回收那些没有被标记为存活的对象所占用的内存空间。
JVM垃圾回收的算法很多,但是不管是哪种算法,在进行GC时大致的流程都是差不多的,主要有以下3个过程:
1. 枚举根节点
这个过程主要是找到所有的GC Roots对象,这些对象一般发生在JVM虚拟机栈栈帧、常量池中的静态对象、方法区中静态类属性引用、本地方法栈中引用的对象。这个过程会发生STW,所有的线程均运行到安全区域(Safe Region)才开始执行。
通常有两种算法:
- 引用计数法:每个对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就+1;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能在被使用的。
优点是效率高,缺点是循环引用无法处理,导致内存溢出。
- 可达性分析:以GC Roots为根节点,从这些根节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象不在任何引用链相连时,则证明此对象是不可用的。
优点可以检测所有的对象,缺点效率低。
本文共计944个文字,预计阅读时间需要4分钟。
JVM垃圾回收算法众多,但不管哪种算法,在执行GC时的大致流程都相差不大,主要包括以下三个过程:
1. 指标根节点:这个过程主要是找到所有的GC Roots对象,这些对象通常包括字符串常量池、类加载器、线程栈等。这个步骤主要是为了找到所有存活的对象。
2. 标记可达对象:从GC Roots开始,遍历所有可达的对象,将它们标记为存活。
3. 清理不可达对象:最后,回收那些没有被标记为存活的对象所占用的内存空间。
JVM垃圾回收的算法很多,但是不管是哪种算法,在进行GC时大致的流程都是差不多的,主要有以下3个过程:
1. 枚举根节点
这个过程主要是找到所有的GC Roots对象,这些对象一般发生在JVM虚拟机栈栈帧、常量池中的静态对象、方法区中静态类属性引用、本地方法栈中引用的对象。这个过程会发生STW,所有的线程均运行到安全区域(Safe Region)才开始执行。
通常有两种算法:
- 引用计数法:每个对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就+1;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能在被使用的。
优点是效率高,缺点是循环引用无法处理,导致内存溢出。
- 可达性分析:以GC Roots为根节点,从这些根节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象不在任何引用链相连时,则证明此对象是不可用的。
优点可以检测所有的对象,缺点效率低。

