JVM - 怎么判断对象是否可以被回收? GC Roots?

一般有两种方法来判断:

  • 引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题;
  • 可达性分析:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。

 

作为GC Roots的对象包括下面几种:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象。(正在运行当中,是活的)
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象。
  • 方法区中Static类静态属性引用的对象。Static User u = new User();
  • 方法区中Final常量引用的对象。public final Static User u = new User()

 

 

posted on 2020-12-15 22:11  frank_cui  阅读(281)  评论(0编辑  收藏  举报

导航

levels of contents