2020年3月1日JVM面试记录
程序员文章站
2022-03-10 18:37:32
1、jvm怎么判断哪些对象应该回收呢回答:引用计数算法和可达性分析算法 因为引用计数法的算法是这样的:在对象中添加一个引用计数器,每当一个地方引用它时,计数器就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 但是这样的算法有个问题,是什么呢? 就是不能解决循环依赖 ......
1、jvm怎么判断哪些对象应该回收呢
回答:引用计数算法和可达性分析算法
因为引用计数法的算法是这样的:在对象中添加一个引用计数器,每当一个地方引用它时,计数器就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。
但是这样的算法有个问题,是什么呢?
就是不能解决循环依赖的问题。看下图解释:
object 1和object 2其实都可以被回收,但是它们之间还有相互引用,所以它们各自的计数器为1,则还是不会被回收。
所以,java虚拟机没有采用引用计数法。它采用的是可达性分析算法。
可达性分析算法的思路就是通过一系列的“gc roots”,也就是根对象作为起始节点集合,从根节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为引用链,如果某个对象到gc roots间没有任何引用链相连。
用图论的话来说就是从gc roots到这个对象不可达时,则证明此对象是不可能再被使用的。所以此对象就是可以被回收的对象。
你刚刚谈到了根节点,那你知道哪些对象可以作为根对象吗?
你刚刚谈到了引用,那你知道java里面有哪几种引用吗?
你刚刚谈到了可达性分析算法,那如果在该算法中被判定不可达对象,是不是一定会被回收呢?
谈谈你熟悉的垃圾回收器和他们的工作过程?
上一篇: MyBatis foreach 批量更新
下一篇: mybatis批量更新