天天看點

JVM垃圾回收面試題

Java垃圾回收有個經典面試題,什麼時候,對什麼對象,做了什麼操作?

垃圾回收裡涉及内容很多,要準确回答這個問題首先要先限定邊界。厘清楚虛拟機規範定義和不同虛拟機實作的差異。以工作中用到的hotspot為例不同JDK版本不同垃圾回收器的實作也不同。下面是網上的一個分析回答。

 首先是“什麼時候”,不同層次的回答從低到高排列: 

    1.系統空閑的時候。 

    分析:這種回答大約占30%,遇到的話一般我就會準備轉向别的話題,譬如算法、譬如SSH看看能否發掘一些他擅長的其他方面。 

    2.系統自身決定,不可預測的時間/調用System.gc()的時候。 

    分析:這種回答大約占55%,大部分應屆生都能回答到這個答案,起碼不能算錯誤是吧,後續應當細分一下到底是語言表述導緻答案太籠統,還是本身就隻有這樣一個模糊的認識。 

    3.能說出新生代、老年代結構,能提出minor gc/full gc 

    分析:到了這個層次,基本上能說對GC運作有概念上的了解,譬如看過《深入JVM虛拟機》之類的。這部分不足10%。 

    4.能說明minor gc/full gc的觸發條件、OOM的觸發條件,降低GC的調優的政策。 

    分析:列舉一些我期望的回答:eden滿了minor gc,升到老年代的對象大于老年代剩餘空間full gc,或者小于時被HandlePromotionFailure參數強制full gc;gc與非gc時間耗時超過了GCTimeRatio的限制引發OOM,調優諸如通過NewRatio控制新生代老年代比例,通過MaxTenuringThreshold控制進入老年前生存次數等……能回答道這個階段就會給我帶來比較高的期望了,當然面試的時候正常人都不會記得每個參數的拼寫,我自己寫這段話的時候也是翻過手冊的。回答道這部分的小于2%。 

PS:加起來不到100%,是因為有确實少數直接說不知道,或者直接拒絕回答的= =# 

    分析第二個問題:“對什麼東西”: 

    1.不使用的對象。 

    分析:相當于沒有回答,問題就是在問什麼對象才是“不使用的對象”。大約占30%。 

    2.超出作用域的對象/引用計數為空的對象。 

    分析:這2個回答站了60%,相當高的比例,估計學校教java的時候老師就是這樣教的。第一個回答沒有解決我的疑問,gc到底怎麼判斷哪些對象在不在作用域的?至于引用計數來判斷對象是否可收集的,我可以會補充一個下面這個例子讓面試者分析一下obj1、obj2是否會被GC掉? 

    class C{ 

         public Object x; 

    } 

    C obj1、obj2 = new C(); 

    obj1.x = obj2; 

    obj2.x = obj1; 

    obj1、obj2 = null; 

    3.從gc root開始搜尋,搜尋不到的對象。 

    分析:根對象查找、标記已經算是不錯了,小于5%的人可以回答道這步,估計是引用計數的方式太“深入民心”了。基本可以得到這個問題全部分數。 

    PS:有面試者在這個問補充強引用、弱引用、軟引用、幻影引用差別等,不是我想問的答案,但可以加分。 

    4.從root搜尋不到,而且經過第一次标記、清理後,仍然沒有複活的對象。 

    分析:我期待的答案。但是的确很少面試者會回答到這一點,是以在我心中回答道第3點我就給全部分數。 

    最後由一個問題:“做什麼事情”,這個問發揮的空間就太大了,不同年代、不同收集器的動作非常多。 

    1.删除不使用的對象,騰出記憶體空間。 

    分析:同問題2第一點。40%。 

    2.補充一些諸如停止其他線程執行、運作finalize等的說明。 

    分析:起碼把問題具體化了一些,如果像答案1那樣我很難在回答中找到話題繼續展開,大約占40%的人。 

    補充一點題外話,面試時我最怕遇到的回答就是“這個問題我說不上來,但是遇到的時候我上網搜一下能做出來”。做程式開發确實不是去鍛煉茴香豆的“茴”有幾種寫法,不死記硬背我同意,我不會糾文法、單詞,但是多少你說個思路呀,要直接回答一個上網搜,我完全沒辦法從中擷取可以評價應聘者的資訊,也很難從回答中繼續發掘話題展開讨論。建議大家盡量回答引向自己熟悉的,可讨論的領域,展現給面試官最擅長的一面。 

    3.能說出諸如新生代做的是複制清理、from survivor、to survivor是幹啥用的、老年代做的是标記清理、标記清理後碎片要不要整理、複制清理和标記清理有有什麼優劣勢等。 

    分析:也是看過《深入JVM虛拟機》的基本都能回答道這個程度,其實到這個程度我已經比較期待了。同樣小于10%。 

    4.除了3外,還能講清楚串行、并行(整理/不整理碎片)、CMS等搜集器可作用的年代、特點、優劣勢,并且能說明控制/調整收集器選擇的方式。 

    分析:同上面2個問題的第四點。