Hi, 我是 浮生。
今天分享一道一线互联网公司必问的面试题。
”JVM 如何判断一个对象可以被回收“
关于这个问题,来看看高手的回答。
一、问题解析
在 JVM 里面,要判断一个对象是否可以被回收,最重要的是判断这个对象是否还在被使用,只有没被使用的对象才能回收。
1. (如图)引用计数器,也就是为每一个对象添加一个引用计数器,用来统计指向当前对象的引用次数,如果当前对象存在应用的更新,那么就对这个引用计数器进行增加,一旦这个引用计数
器变成 0,就意味着它可以被回收了。这种方法需要额外的空间来存储引用计数器,但是它的实现很简单,而且效率也比较高。
(如图)不过主流的 JVM 都没有采用这种方式,因为引用计数器在处理一些复杂的循环引用或者相互依赖的情况时,可能会出现一些不再使用但是又无法回收的内存,造成内存泄露的问题。
2. 可达性分析,它的主要思想是,首先确定一系列肯定不能回收的对象作为 GC root,比如虚拟机栈里面的引用对象、本地方法栈引用的对象等,然后以 GC ROOT 作为起始 节点, 从这些节点开始向下搜索,去寻找它的直接和间接引用的对象,当遍历完之后如果发现 有一些对象不可到达, 那么就认为这些对象已经没有用了,需要被回收。 在垃圾回收的时候,JVM 会首先找到所有的 GC root,这个过程会暂停所有用户线程, 也就是 stop the world,然后再从 GC Roots 这些根节点向下搜索,可达的对象保留, 不可达的就会回收掉。 可达性分析是目前主流 JVM 使用的算法。
以上就是我对这个问题的理解。
二、面试总结
很多粉丝和我说,很多东西看完以后过一段时间就忘记了,问我是怎么记下来的。我和他说,技术这些东西不需要记,你唯一能做的就是减少碎片化的学习,多花一点时间在系统学习上,只有体系化的知识是不会忘记的。可是,搭建体系化知识的过程要比碎片化的点状学习痛苦不止一万倍。 技术的沉淀是没有捷径的,只能花苦功夫去学习。
好的,本期的高手面试系列的文章就到这里结束了
喜欢我的作品的小伙伴记得点赞和收藏。
我是 浮生,一个工作了 14 年的 Java 程序员,咱们下期再见。
三、粉丝福利
最近很多同学问我有没有java学习资料,我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我
公众号:“ 灰灰聊架构 ”, 回复暗号:“ 321 ”即可获取