当前位置: 首页 > 科技观察

面试官喜欢问的垃圾回收算法_0

时间:2023-03-21 17:16:14 科技观察

转载请联系程序员巴士公众号。前言前段时间过了第一面,阿爸阿爸受邀进入第二面。这一次,她和她遇到的面试官会继续为难她,问她关于GC算法的问题。回家等着通知面试官:你知道JVM垃圾回收吗?阿爸阿爸:嗯,我知道一点。面试官:那么JVM是怎么判断一个对象是垃圾的呢?阿爸阿爸:好像有可达性分析的方法。阿爸阿爸:可达的对象会判断为存活对象,然后不可达的对象会被认为是“垃圾”。面试官:嗯……说说你知道的垃圾回收算法吧。阿爸阿爸:标记清除算法标记排序算法复制算法分代收集算法面试官:嗯……那你知道这些算法吗?阿爸阿爸:嗯……不确定……面试官:好吧,今天就在这里见面吧,你先回去等通知吧??阿爸阿爸:好的。很遗憾你面试失败了。您的简历已加入公司人才库。期待下次再见……我会当场拿到offer。面试官:你了解JVM垃圾回收吗?阿爸阿爸:嗯嗯,懂一点。面试官:那么JVM是怎么判断一个对象是垃圾的呢?阿爸阿爸:有两种方法,一种是引用计数法,一种是可达性分析法。阿爸阿爸:引用计数的方法就是给对象一个引用计数器。每当有对该对象的引用时,引用计数器就会加一。每当引用断开连接时,引用计数器就会减一。当它为零时,就认为这个对象是无用的,也就是所谓的“垃圾”,但是这种方法有一个很大的缺点,就是不能处理循环引用。阿爸阿爸:循环引用对象的外部引用的存在看似没有问题,但是当我们断开方法区的引用时,问题就暴露出来了。阿爸阿爸:循环引用对象的外部引用被破坏的情况。AbbaAbba:在上面断开引用的情况下,很明显对象A和对象B没有外部引用来引用它们,它们已经变成了垃圾,而引用计数器都是有值的,因为它们相互引用(循环参考)。1.不可回收。这个缺点导致在JVM中并没有真正使用引用计数的方法。AbbaAbba:可达性分析方法就是利用GCRoots的对象从中往下搜索。该搜索路径称为“参考链”。当一个对象没有被任何GCRoots引用链Link引用,那么就判定这个对象“死了”,我们一般称这个对象为“不可达”。面试官:你刚才提到了GCRoots,你知道哪些对象可以作为GCRoots的对象吗?阿爸阿爸:是的,我理解主要有以下四种类型的对象可以作为GCRoots的对象。虚拟机栈中引用的对象方法区中静态属性引用的对象方法区中常量引用的对象本地方法栈中引用的对象Ababa:下图可以直观的看出他们的关系。阿爸阿爸:可以看出,只有在引用链上的对象才能判断为“存活”,不在引用链上的对象则判断为“死亡”,也会被当作垃圾回收。面试官:你很好。除了回收堆中的对象,方法区会不会回收垃圾?阿爸阿爸:方法区也有垃圾回收。方法区主要是回收和丢弃。常量和无用的类。面试官:嗯……说说你知道的垃圾回收算法吧。阿爸阿爸:垃圾收集算法主要分为以下四类。标记清除算法标记排序算法CopyingalgorithmGenerationalcollectionalgorithmAbaaba:标记清除算法分为两个阶段,第一阶段“标记”,第二阶段“清除”,首先标记出所有要清除的对象,即灰色部分,然后被回收。阿爸阿爸:使用mark-and-sweep算法清理堆后,产生了很多空间碎片。这些空间碎片使得很难为新对象分配内存。不仅如此,mark-and-sweep算法在mark阶段和clear阶段效率不高。太高。阿爸阿爸:标记排序算法就是为了解决内存碎片过多的问题而诞生的。阿爸阿爸:为了解决效率的问题,也出现了复制算法,即把一块内存分成2块大小相等的块,每次使用只使用其中一块。将内存中存活的对象转移到另一块内存中,然后清除这块内存中的所有对象。阿巴阿巴:复制算法简单、方便、高效,不需要考虑内存碎片的问题,但是将内存减少到原来的一半成本无疑是很高的。AbbaAbba:而且新生代的大部分对象都是一夜之间生死。按照1:1的空间比例使用复制算法会极大地影响内存的性能。阿爸阿爸:分代算法就是划分堆区域,然后根据不同区域的情况应用相应的垃圾回收算法。阿巴阿巴:下图是新生代的细化。新生代分为伊甸园和幸存者。幸存者进一步分为两个区域(s0和s1)。如图所示,它们的比例为8:1。:1.新对象首先分配在Eden区。mark-and-clear算法在这里不适用,因为碎片太多了。如果没有足够的连续空间分配给对象,就会不断触发垃圾回收,对性能影响很大。阿爸阿爸:对于传统的GC来说,无法避免GC进程带来的“STOP-THE-WORLD”。我们一般简称STW。STW对系统性能影响很大,所以如何消除STW或者减少STW的时间就显得尤为重要。事实上,分代算法并不是特定的算法。与以往的标记清除、标记排序算法、复制算法不同,分代算法只是对堆进行划分,在不同的区域使用。不同的算法将STW时间细分为各个区域,使STW时间不会持续很长时间,从而达到提高系统性能的目的。面试官:说的很清楚很详细,很好,明天来上班??。总结垃圾回收算法,必须回答GCRoots,各种垃圾回收算法,以及它们的优缺点。