JVM(java)如何判断对象是否死亡?

虚拟机回收对象之前首先要判断对象是否死亡,两种方法:引用计数器法可达性分析算法。

引用计数器法:给对象添加一个引用计数器,每当有一个地方引用它,计数器就加1,当引用失效时,计数器就减1,任何时刻当计数器为0的时候,这个对象就不能再被使用了。优点:实现简单效率高。缺点:主流jvm不使用这个算法,因为无法解决对象循环引用的问题。

可达性分析算法:首先有一系列的“GC roots”根节点,从根节点向下搜索,走过的路径叫做引用链,当一个对象到GC root没有任何引用链的时候,证明对象是不可活的(就是这个对象到GC root是不可达的),这些是可回收对象。当对象不可活的时候,仍然可以通过finalize()方法自救。可作为GC root的对象有:方法区中常量引用的对象,方法区中静态属性引用的对象,虚拟机栈中引用的对象,本地方法中引用的对象。

可达性分析算法中,要宣告一个对象真正的死亡,要经历两次标记的过程:

1. 如果对象在经历可达性分析之后,发现没有与GC root相连的引用链,将会被第一次标记并且进行第一次筛选,筛选的条件是是否有必要执行finalize()方法,当对象没有finalize()方法或者虚拟机已经调用过finalize()方法,视为没有必要执行。

2. 如果这个对象被判定为有必要执行finalize()方法,那么对象将会放置在一个F-Queue队列中,稍后由一个虚拟机自动建立的、低优先级的Finalizer线程去执行它。finalize()方法是对象逃离死亡的最后一次机会,稍后GC将会对队列进行第二次小规标记,如果对象要finalize()拯救它,只需要与引用链上的任意一个对象建立关联即可,那么第二次标记的时候它将会被移出即将回收的集合,如果没逃脱,就会真正被回收。

 

你可能感兴趣的:(JVM,面试问题)