当前位置: 首页 > 后端技术 > Java

【Java访谈】JVM是如何判断一个对象可以被回收的

时间:2023-04-01 18:53:23 Java

Hi,我是Mic。今天分享一道一线互联网公司必问的面试题。“JVM是如何判断一个对象可以被回收的?”关于这个问题,我们来看看普通人和专家的回答。普通人:嗯。.........师父:好的,面试官。在JVM中,判断一个对象是否可以被回收,最重要的是判断这个对象是否还在使用中,只有没有被使用的对象才能被回收。引用计数器,即为每个对象添加一个引用计数器,统计指向当前对象的引用的数量。如果当前对象有应用程序更新,则增加引用计数器。一旦引用计数器变为0,就意味着它可以被回收了。该方法需要额外的空间来存储引用计数器,但其实现简单且相对高效。但是主流的JVM并没有采用这种方式,因为当引用计数器在处理一些复杂的循环引用或者相互依赖的情况时,可能会有一些内存不再使用但又无法回收,从而造成内存泄漏。可达性分析的主要思路是先确定一系列不能回收的对象作为GC根,比如虚拟机栈中的引用对象,本地方法栈引用的对象等,然后使用GCROOT作为起始节点。从这些节点开始向下搜索,找到其直接和间接引用的对象。遍历之后,如果发现有些对象不可达,那么这些对象就认为是无用的,需要回收。在进行垃圾回收时,JVM会首先找到所有的GC根。这个过程会把所有的用户线程挂起,也就是stoptheworld,然后从GCRoots的根节点往下找。可达的对象保留,不可达的对象保留。将被回收。可达性分析是目前主流JVM使用的一种算法。以上是我对这个问题的理解。综上所述,很多粉丝跟我说,很多东西看了一段时间后就忘记了,问我是怎么记住的。我告诉他,技术性的东西不用死记硬背。唯一能做的就是减少碎片化的学习,多花点时间在系统的学习上。只有系统的知识才不会被遗忘。然而,构建系统知识的过程,比碎片化的点学习要痛苦一万多倍。技术的沉淀没有捷径,唯有努力学习。喜欢我作品的朋友记得点赞收藏哦。版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!