面经复盘系列之「Java GC中使用引用计数法所存在的缺点」问题应该如何去思考

时间:2025-04-10 18:12:34

网抑云二面面经

网抑云二面虽然难偏怪,但是复盘下来,确实能学到很多。
也感谢很多大佬跟我分享他们学习的思路和思考的方向,才写了这一篇文章,后续的有缘更新吧。

阅读前必看:
如果你只是想知道这个问题的答案,请出门左转找别人的博客,我这里并没有放出答案,而是以「就问题本身该怎么去思考」提供了自己的想法。

那么现在我们回到正题。


Java GC中使用引用计数法所存在的缺点

首先是Javaer人尽皆知的循环依赖,然后呢?

说实话,面试时因为【突如其来的没有自我介绍就直入主题 和 跳表刚讲了一句就被示意下一题】这种第一次遇见的情况,我自己也有点慌乱,毕竟面试经验还不够,当然了这都并不妨碍我想不出来回答,但是心态确确实实被影响了一下,需要及时调整。

那么回到正题,在没有明确答案的时候,应该怎么去思考这个问题?从什么方面来思考?

说白了就是得在空白的大脑里装点东西。

如果是刚起步,可以说个大概,如果是思路清晰,那就可以结构化的去讲。

引用一个牛油跟我说的话(这简直就是我求职路上的指路明灯啊)

对于现在的互联网来说,其实无非是在追求两个东西,一个是更安全,一个是更快速,在这两个基础上在追求相互之间的边界性和联系性。

所以其实很好发现,在我们平时学的一些东西的时候,他们的设计者无非是围绕着这两点去做的设计和优化。

—— 双非也有梦想

所以接下来,我们分别从安全速度来说。


首先,「安全」。

(还是引用他的话,因为太精辟了

任何技术的操作,无非都是落脚到对于内存的操作,这也是我们为什么要费劲去研究操作系统和计算机基础的原因,对于内存的操作其实也就是对于数据的操作。

—— 双非也有梦想

所以我们可以进一步去想:引用计数法与「内存」之间的干系

那么,我们平时编程中,有遇到内存相关的问题吗?
有的。内存泄漏内存溢出。(这也是面试的一个常考知识点,内存溢出与内存泄漏的区别。

我们知道引用计数法的实现,无非就是在对象上安一个计数器,每当有额外的对象引用该对象,或丢弃了对该对象的引用,就需要修改计数器。

那么这个实现,与内存问题有关吗?

不如先想想看

内存泄露是什么?
—— Memory Leak,无法释放已经申请的内存空间。

内存溢出是什么?
—— OOM,给对象分配内存时,内存不够。

那么,引用计数法会导致内存泄露吗?
详细来说,他会导致已申请的内存空间无法释放吗?

如果还没有眉目,那换个问法,他会导致对象不会被回收吗? 也即,会不会存在对象的引用计数永不为0呢?

这下应该恍然大悟了,我们“人尽皆知”的循环依赖的问题,无非就是对象的引用计数永远减少不到0。
这其实就是带来了「安全」上的问题,细化来说,即是存在「内存泄漏」的问题。

(虽然看起来是知道答案而在倒推答案的感觉吧。????

现在再来看看,引用计数法会导致内存溢出吗?
会导致给对象分配内存时出现内存不足的情况吗?

好像不会,当然你也可以说:给每个对象都安一个计数器难道不会占用很多内存吗?
我觉得你完全可以跟面试官说出来,因为我也有这个想法。????


走到现在,「安全」方面好像考虑得差不多了?
(我这里的思路也主要只是从「内存问题」上来找,完全可以拓开自己的思路,因为我水平不高,只能想到这些。

接下来,我们试试走「速度」这条路。

我们知道,引用计数法本身的作用,是为了找到可以回收的对象。那么判断可回收对象的算法,就会对他有「速度」的要求。

显然,引用计数法判断对象是否可回收只要与0做对比就好了,非常快,这也是他最大的优点。
那我为什么要给「判断」加粗呢?

想想看,GC除了判断是否可回收快,还要考虑什么方面的速度?

如果没有思路,你想想看,「引用」是一个对象之间的事吗?

显然,A引用B,那必然是牵扯到双方的事。
假设现在,A对B的引用失效了,B需要做什么?更新

想到了吗?

我们不仅要求判断要快,更新也不能慢。

假设现在存在一条链式引用,A引用B,B引用C,…,Y引用Z,现在万恶之源A丢弃了对B的引用,或者A被回收了。
接下来会发生什么?链式效应的更新,与回收。
那如果不是链式的,是网状的呢?洪泛效应的更新,与回收。

而在实际项目中,对象的引用链通常是七通八达十分复杂的,任意一个引用的失效可能都会触发整个对象图的计数器的更新(个人觉得有点类似路由算法ospf)。

现在假设在一个高并发的情况下,诸多对象的引用发生了变化,会带来什么问题?要解决什么问题?如何解决?
个人认为其实这些就是如果jvm采用引用计数法时所需要解决的问题(中的其中一小部分)。

开放性思路,你会怎么解决?


其实这也只是如果让我再来重新思考这个问题,我会去采取的一个思考方式,当然了正式面试的时候还得看脑子空不空白了233333

其实还能想很多,还可以去和可达性分析来做对比找不足等等,思考方式是多样化的。

另外中间如果有错误还请指出,一起学习,谢谢。