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

2020年3月1日JVM面试记录

程序员文章站 2022-06-17 22:14:20
1、jvm怎么判断哪些对象应该回收呢回答:引用计数算法和可达性分析算法 因为引用计数法的算法是这样的:在对象中添加一个引用计数器,每当一个地方引用它时,计数器就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 但是这样的算法有个问题,是什么呢? 就是不能解决循环依赖 ......

1、jvm怎么判断哪些对象应该回收呢
回答:引用计数算法和可达性分析算法

因为引用计数法的算法是这样的:在对象中添加一个引用计数器,每当一个地方引用它时,计数器就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。

但是这样的算法有个问题,是什么呢?

就是不能解决循环依赖的问题。看下图解释:

2020年3月1日JVM面试记录

 

 

object 1和object 2其实都可以被回收,但是它们之间还有相互引用,所以它们各自的计数器为1,则还是不会被回收。
所以,java虚拟机没有采用引用计数法。它采用的是可达性分析算法。
可达性分析算法的思路就是通过一系列的“gc roots”,也就是根对象作为起始节点集合,从根节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为引用链,如果某个对象到gc roots间没有任何引用链相连。
用图论的话来说就是从gc roots到这个对象不可达时,则证明此对象是不可能再被使用的。所以此对象就是可以被回收的对象。

2020年3月1日JVM面试记录

 

 


你刚刚谈到了根节点,那你知道哪些对象可以作为根对象吗?

你刚刚谈到了引用,那你知道java里面有哪几种引用吗?

你刚刚谈到了可达性分析算法,那如果在该算法中被判定不可达对象,是不是一定会被回收呢?

谈谈你熟悉的垃圾回收器和他们的工作过程?