0%

对象可达性分析

文章字数:553,阅读全文大约需要2分钟

java是自动管理内存的语言,需要知道对象是否存活已决定是否清理对象。

引用计数法

  1. 方式: 每当有一个地方引用对象,对象计数器+1,引用失效-1
  2. 判断方式: 计数不为0时存活,否则判断死亡
  3. 优点: 简单实现,高效判断
  4. 缺点: 如果对象相互引用,但是没有其它对象引用这两个。这两个对象会一直相互引用

引用链法

  1. 方式
  • 可达性分析
  • 第一次标记,筛选
  • 第二次标记,筛选
  1. 可达性分析
  • 一系列的GC Roots对象作为起点,向下搜索
  • GC Root对象有: 虚拟机栈中的引用对象、JNI引用对象、方法区中常量、类静态属性引用的对象。
  • GC Root不可达代表对象不可用
  • 不可达对象再经过两次标记筛选后才会加入优先级很低的销毁队列
  1. 第一次标记筛选
  • 条件: 判断该对象是否有必要执行finalize()方法
    需要执行(需要设置)则筛选出来进入下一次筛选
    没必要则判定死亡,执行回收
  1. 第二次标记筛选
  • 对象存放在F-Queue队列中,被一个自动建立,优先级低的Finalizer线程去执行finalize()
  • finalize()方法如果没有或者执行过一次,则视为没必要执行