面試題目:
地球人都知道,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%。
總結:程序員不能具體控制時間,系統在不可預測的時間調用System.gc()函數的時候;固然能夠經過調優,用NewRatio控制newObject和oldObject的比例,用MaxTenuringThreshold 控制進入oldObject的次數,使得oldObject 存儲空間延遲達到full gc,從而使得計時器引起gc時間延遲OOM的時間延遲,以延長對象生存期。
二.回答:對什麼東西?
1.不使用的對象。
分析:至關於沒有回答,問題就是在問什麼對象纔是「不使用的對象」。大約佔30%。
2.超出做用域的對象/引用計數爲空的對象。
分析:這2個回答站了60%,至關高的比例,估計學校教java的時候老師就是這樣教的。第一個回答沒有解決個人疑問,gc到底怎麼判斷哪些對象在不在做用域的?至於引用計數來判斷對象是否可收集的,我能夠會補充一個下面這個例子讓面試者分析一下obj一、obj2是否會被GC掉?
class C{
public Object x;
}
C obj一、obj2 = new C();
obj1.x = obj2;
obj2.x = obj1;
obj一、obj2 = null;
3.從gc root開始搜索,搜索不到的對象。
分析:根對象查找、標記已經算是不錯了,小於5%的人能夠回答道這步,估計是引用計數的方式太「深刻民心」了。基本能夠獲得這個問題所有分數。
PS:有面試者在這個問補充強引用、弱引用、軟引用、幻影引用區別等,不是我想問的答案,但能夠加分。
4.從root搜索不到,並且通過第一次標記、清理後,仍然沒有復活的對象。
分析:我期待的答案。可是的確不多面試者會回答到這一點,因此在我心中回答道第3點我就給所有分數。
總結:超出了做用域或引用計數爲空的對象;從gc root開始搜索找不到的對象,並且通過一次標記、清理,仍然沒有復活的對象。
三.回答:作什麼?
1.刪除不使用的對象,騰出內存空間。
分析:同問題2第一點。40%。
2.補充一些諸如中止其餘線程執行、運行finalize等的說明。
分析:起碼把問題具體化了一些,若是像答案1那樣我很難在回答中找到話題繼續展開,大約佔40%的人。
補充一點題外話,面試時我最怕遇到的回答就是「這個問題我說不上來,可是遇到的時候我上網搜一下能作出來」。作程序開發確實不是去鍛鍊茴香豆的「茴」有幾種寫法,不死記硬揹我贊成,我不會糾語法、單詞,可是多少你說個思路呀,要直接回答一個上網搜,我徹底沒辦法從中獲取能夠評價應聘者的信息,也很難從回答中繼續發掘話題展開討論。建議你們儘可能回答引向本身熟悉的,可討論的領域,展示給面試官最擅長的一面。
3.能說出諸如新生代作的是複製清理、from survivor、to survivor是幹啥用的、老年代作的是標記清理、標記清理後碎片要不要整理、複製清理和標記清理有有什麼優劣勢等。
分析:也是看過《深刻JVM虛擬機》的基本都能回答道這個程度,其實到這個程度我已經比較期待了。一樣小於10%。
4.除了3外,還能講清楚串行、並行(整理/不整理碎片)、CMS等蒐集器可做用的年代、特色、優劣勢,而且能說明控制/調整收集器選擇的方式。
分析:同上面2個問題的第四點。
總結:刪除不使用的對象,回收內存空間;運行默認的finalize,固然程序員想馬上調用就用dipose調用以釋放資源如文件句柄,JVM用from survivor、to survivor對它進行標記清理,對象序列化後也可使它復活。
千萬不要說網上google下,就算說也要說出本身之前遇到這樣的問題是怎麼處理的,對這個知識有什麼認識想法,而後能夠反問下考官,這樣能夠不讓技術型的考官爲如何繼續話題而對你無語,呵呵。java
轉載地址:http://jeromecen1021.blog.163.com/blog/static/18851527120117274624888/程序員