回覆列表
  • 1 # 熊痞痞20日晚9滿月

    怎麼在面試時回答Java垃圾回收機制(GC)相關問題

    1、筆試、面試去評價一個人肯定是不夠準確的,瞭解一個人最準確的方式就是“路遙知馬力,日久 見人心”。透過一、二個小時內的做題、交流,只是沒有其他辦法下進行的無奈之舉,所以透過 了面試不代表有多成功,沒透過也不代表有多失敗。2、好的面試官本身交談的時候就不應當把自己一個居高臨下的角色上,應當把自己和應聘者當做兩個 做技術的人平等的交流,把自己當作權威往往就會受到觀點的角度、語言表達、工作領域的慣性的 制約。3、好的考察題目則是大家能經常接觸,不同層次的人能有不同層次的答案,能從問題引申出後面繼續 討論的話題。舉個例子拋磚引玉,“地球人都知道,Java有個東西叫垃圾收集器,它讓建立的物件不需要像c/cpp那樣delete、free掉,你能不能談談,GC是在什麼時候,對什麼東西,做了什麼事情?”

    我自己分析一下這個問題,首先是“什麼時候”,不同層次的回答從低到高排列: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:有面試者在這個問補充強引用、弱引用、軟引用、Phantom引用區別等,不是我想問的答案,但可以加分。4.從root搜尋不到,而且經過第一次標記、清理後,仍然沒有復活的物件。分析:我期待的答案。但是的確很少面試者會回答到這一點,所以在我心中回答道第3點我就給全部分數。最後由一個問題:“做什麼事情”,這個問發揮的空間就太大了,不同年代、不同收集器的動作非常多。

    1.刪除不使用的物件,騰出記憶體空間。分析:同問題2第一點。40%。2.補充一些諸如停止其他執行緒執行、執行finalize等的說明。分析:起碼把問題具體化了一些,如果像答案1那樣我很難在回答中找到話題繼續展開,大約佔40%的人。補充一點題外話,面試時我最怕遇到的回答就是“這個問題我說不上來,但是遇到的時候我上網搜一下能做出來”。做程式開發確實不是去鍛鍊茴香豆的“茴”有幾種寫法,不死記硬揹我同意,我不會糾語法、單詞,但是多少你說個思路呀,要直接回答一個上網搜,我完全沒辦法從中獲取可以評價應聘者的資訊,也很難從回答中繼續發掘話題展開討論。建議大家儘量回答引向自己熟悉的,可討論的領域,展現給面試官最擅長的一面。3.能說出諸如新生代做的是複製清理、from survivor、to survivor是幹啥用的、老年代做的是標記清理、標記清理後碎片要不要整理、複製清理和標記清理有有什麼優劣勢等。分析:也是看過《深入JVM虛擬機器》的基本都能回答道這個程度,其實到這個程度我已經比較期待了。同樣小於10%。4.除了3外,還能講清楚序列、並行(整理/不整理碎片)、CMS等蒐集器可作用的年代、特點、優劣勢,並且能說明控制/調整收集器選擇的方式。分析:同上面2個問題的第四點。

  • 2 # 程式零世界

    Java堆記憶體被劃分為新生代和年老代兩部分,新生代主要使用複製和標記-清除垃圾回收演算法;年老代主要使用標記-整理垃圾回收演算法,因此java虛擬中針對新生代和年老代分別提供了多種不同的垃圾收集器

  • 3 # 梅涼欣

    給你個思路

    1、基本的垃圾回收演算法原理、優缺點、適用性

    2、jdk中垃圾回收器的實現原理、優缺點、適用性,中間要說出你對記憶體模型的瞭解

    3、介紹你在工作中遇到的相關問題、思考、解決辦法

    4、延伸:淺談你對G1、ZGC等前沿技術的瞭解

  • 中秋節和大豐收的關聯?
  • 框架樑左端標註為2φ22+2φ20,右端標註3φ22表示的是什麼意思(標在樑上支座處)?