ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【Java面试】JVM如何判断一个对象可以被回收

2022-05-29 16:04:36  阅读:167  来源: 互联网

标签:Java 对象 回收 面试 计数器 GC 引用 JVM


Hi, 我是Mic。

今天分享一道一线互联网公司必问的面试题。

”JVM如何判断一个对象可以被回收“

关于这个问题,来看看普通人和高手的回答。

普通人:

嗯。。。。。。。。。。

高手:

好的,面试官。

在JVM里面,要判断一个对象是否可以被回收,最重要的是判断这个对象是否还在被使用,只有没被使用的对象才能回收。

  1. 引用计数器,也就是为每一个对象添加一个引用计数器,用来统计指向当前对象的引用次数,

    如果当前对象存在应用的更新,那么就对这个引用计数器进行增加,一旦这个引用计数器变成0,就意味着它可以被回收了。

    这种方法需要额外的空间来存储引用计数器,但是它的实现很简单,而且效率也比较高。

    image-20220423173852373

    不过主流的JVM都没有采用这种方式,因为引用计数器在处理一些复杂的循环引用或者相互依赖的情况时,

    可能会出现一些不再使用但是又无法回收的内存,造成内存泄露的问题。

    image-20220423170255641

  2. 可达性分析,它的主要思想是,首先确定一系列肯定不能回收的对象作为GC root,

    比如虚拟机栈里面的引用对象、本地方法栈引用的对象等,然后以GC ROOT作为起始节点,

    从这些节点开始向下搜索,去寻找它的直接和间接引用的对象,当遍历完之后如果发现有一些对象不可到达,

    那么就认为这些对象已经没有用了,需要被回收。

    在垃圾回收的时候,JVM会首先找到所有的GC root,这个过程会暂停所有用户线程,

    也就是stop the world,然后再从GC Roots这些根节点向下搜索,可达的对象保留,不可达的就会回收掉。

    可达性分析是目前主流JVM使用的算法。

    以上就是我对这个问题的理解。

    image-20220423172025944

总结

很多粉丝和我说,很多东西看完以后过一段时间就忘记了,问我是怎么记下来的。

我和他说,技术这些东西不需要记,你唯一能做的就是减少碎片化的学习,多花一点时间在系统学习上,只有体系化的知识是不会忘记的。

可是,搭建体系化知识的过程要比碎片化的点状学习痛苦不止一万倍。

技术的沉淀是没有捷径的,只能花苦功夫去学习。

喜欢我的作品的小伙伴记得点赞和收藏。

file

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构
如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

标签:Java,对象,回收,面试,计数器,GC,引用,JVM
来源: https://www.cnblogs.com/mic112/p/16323982.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有