欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JVM垃圾收集算法之标记算法

程序员文章站 2022-10-08 14:26:55
前言 前言 总所周知,jvm的垃圾收集算法一般包括标记、清除、整理三个阶段,最近在看了有关于垃圾收集的标记算法,记录一下自己的理解。 垃圾收集中标记算法有两种:一种是引用计数法,一种是根搜索算法。 引用记数法 引用记数法 引用计数法非常容易理解,jvm为每一个对象设立一个引用计数器,当该对象被引用时 ......
  • 前言

   总所周知,jvm的垃圾收集算法一般包括标记、清除、整理三个阶段,最近在看了有关于垃圾收集的标记算法,记录一下自己的理解。

垃圾收集中标记算法有两种:一种是引用计数法,一种是根搜索算法。

  • 引用记数法

   引用计数法非常容易理解,jvm为每一个对象设立一个引用计数器,当该对象被引用时,计数器就加一,引用取消时则减一。

当jvm开始gc时,jvm判断该对象的引用计数器是否为0,若为0则标记为可清除对象。

JVM垃圾收集算法之标记算法

JVM垃圾收集算法之标记算法

引用计数器有个致命的缺点是无法解决循环依赖问题,这也导致这个算法被弃用。

如下图所示,当对象a中有对b的引用,对象b中也有对a的引用,两者之间形成循环依赖。

除此之外,还有一个point引用了对象a,此时程序中还有point这个指针能够使程序到达这两个对象,

一旦point引用取消,我们就会丢失对这两个对象的控制,同时引用计数器未到达0,所以对象一直存在在堆中,jvm不能进行回收,从此造成内存泄漏。

JVM垃圾收集算法之标记算法

 

  • 根搜索算法

根搜索算法是目前大部分jvm所使用的标记算法。

根搜索算法会以根对象集合中的根对象出发,进行自上往下的搜索,与根对象直接连接或间接连接的对象都可以被搜索。

当jvm无法到达某个对象时,它会被标记为可清除对象。

根对象集合指的是:

  1. java栈中的对象引用
  2. 本地方法栈的对象引用
  3. 运行时常量池中的对象引用
  4. 方法区中的类静态属性的对象引用
  5. 类对应的唯一数据类型的class对象(这句话有点抽象,实际上每个类都有一个class对象用于表示这个类在运行时被jvm加载的相关信息,如类名、方法、属性等)

             可以使用classname.class、实例化对象.class、class.forname(),获取该类的class对象

 

根搜索算法的过程

JVM垃圾收集算法之标记算法