面試題:“你能不能談談,java 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控制進入老年前生存次數等
總結:程式設計師不能具體控制時間,系統在不可預測的時間呼叫System.gc()函式的時候;當然可以通過調優,用NewRatio控制newObject和oldObject的比例,用MaxTenuringThreshold 控制進入oldObject的次數,使得oldObject 儲存空間延遲達到full gc,從而使得計時器引發gc時間延遲OOM的時間延遲,以延長物件生存期。
二.回答:對什麼東西?
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點我就給全部分數。
總結:超出了作用域或引用計數為空的物件;從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 GC是在什麼時候,對什麼東西,做了什麼事情?”
面試題目: 地球人都知道,Java有個東西叫垃圾收集器,它讓建立的物件不需要像c/cpp那樣delete、free掉,你能不能談談: GC是在什麼時候,對什麼東西,做了什麼事情? 以上算是三個問題,下面逐一分析: 問題一回答:什麼時候? 1.系統空閒的時候。
面試題:“你能不能談談,java GC是在什麼時候,對什麼東西,做了什麼事情?”
地球人都知道,Java有個東西叫垃圾收集器,它讓建立的物件不需要像c/cpp那樣delete、free掉,你能不能談談,GC是在什麼時候,對什麼東西,做了什麼事情?一.回答:什麼時候?1.系統空閒的時候。 分析:這種回答大約佔30%,遇到的話一般我就會準備轉向別的話題,譬如演算法、譬如SSH看看能否發掘
面試題:你能寫一個Vue的雙向資料繫結嗎?
在目前的前端面試中,vue的雙向資料繫結已經成為了一個非常容易考到的點,即使不能當場寫出來,至少也要能說出原理。本篇文章中我將會仿照vue寫一個雙向資料繫結的例項,名字就叫myVue吧。結合註釋,希望能讓大家有所收穫。 1、原理 Vue的雙向資料繫結的原理相信大家也都十分了解了,主要是通過 Obje
java算法面試題:設計一個快速排序。雙路快速排序,簡單易於理解。
面試題 != ava 思路 add bubuko 比較器 繼續 array package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.Com
面試題:你簡歷中寫到熟悉Spring原始碼,那你給我說說它用到了那些設計模式?
Spring作為業界的經典框架,無論是在架構設計方面,還是在程式碼編寫方面,都堪稱行內典範。好了,話不多說,開始今天的內容。
面試題:你為什麼選擇python?
你為什麼選擇python? 答題路線:python的優點(python優缺點),python的應用領域廣(python應用領域) python優點: 1、簡單: Python的語法非常優雅,沒有大括號,分號等特殊符號,一種極簡主義的設計思想。適合人類閱讀,
面試題:1000瓶水其中有一瓶水有毒,有10只老鼠並且只要老鼠喝了有毒的水必死。請問怎樣通過一次實驗找出有毒的那瓶水。
import java.util.Arrays; import java.lang.StringBuilder; import java.util.Scanner; public class toxicWater { public static final int waterNumber = 1000;
java基礎面試題:switch語句能否作用在byte上,能否作用在long上,能否作用在String上?
int 包裝類 println class ava col body package 面試題 package com.swift; public class Switch_Test { public static void main(String[] args
java基礎面試題:try{}裏有一個return語句,那麽緊跟在這個try後的finally {}裏的code會不會被執行,什麽時候被執行,在return前還是後?
nal java pan clas out bsp 出現 可能 inf package com.swift; public class Try_Catch_Finally_Test { public static void main(String[] args
java算法面試題:編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串,但要保證漢字不被截取半個, 如“我ABC”,4,應該截取“我AB”,輸入“我ABC漢DEF”,6,應該輸出“我ABC”,而不是“我ABC+漢的半個”。
構造 pack n) -- com post nts throw ... package com.swift; import java.util.Scanner; public class Hanzi_jiequ { public static void m
java面試題:如果一串字符如"aaaabbc中國1512"要分別統計英文字符的數量,中文字符的數量,和數字字符的數量,假設字符中沒有中文字符、英文字符、數字字符之外的其他特殊字符。
rgs info log letter clas [] 面試題 .com ack package com.swift; public class TotalNumber_String { public static void main(String[] arg
java算法面試題:遞歸算法題2 第1個人10,第2個比第1個人大2歲,依次遞推,請用遞歸方式計算出第8個人多大?
else oid 算法題 body println 算法 ring swift java算法 package com.swift; public class Digui_Return { public static void main(String[] arg
java算法面試題:有數組a[n],用java代碼將數組元素順序顛倒
mage post alt 數組a array [] ima log 算法 package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.Lis
這些java技術面試題也許你在面試時會遇到,早些防範!
大家在平常面試java的過程中都會遇到哪些難題呢?還有一些即將去面試java的童鞋們,你們想知道技術面試中會涉及到哪些點嗎?今天為你整理Java面試中會被問到的幾個技術難題。 1、一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制? 可以有多個類,但只能有一個p
面試題:談談你對對vuex的理解
當面試官問我們對vuex的理解的時候,我們不能只說“vuex是一個專為vue.js應用程式開發的狀態管理模式”,儘量不要讓面試官連續追問(總會問到自己不會的然後說你實力還差那麼點來可以得降薪),應該從三個方面一次性去說清楚: 1.vuex是什麼? 2.為什麼要用vuex? 3.vuex的核心概念;
Hive面試題:請寫出你在工作中自定義過的udf函式,簡述定義步驟
步驟: 1.extends UDF,實現evaluate() 2.add JAR /home/hadoop/hivejar/udf.jar; 3.create temporary function tolowercase as 'com.ghgj.hive.udf.ToLowerCa
Java面試題:面向物件,類載入器,JDBC, Spring 基礎概念
1. 為什麼說Java是一門平臺無關語言? 平臺無關實際的含義是“一次編寫到處執行”。Java 能夠做到是因為它的位元組碼(byte code)可以執行在任何作業系統上,與底層系統無關。 2. 為什麼 Java 不是100%面向物件? Java
C#面試題:輸入一個長度100的數字字串,判斷是否能被7整除
輸入一個長度為100的數字字串,首字元不能是0,判斷是否能被7整除。 思路:把字串中各個位數字拿出來與7取餘,如果最後為0,表示可以整除,不為0表示不能整除。 例如:504:5%=5,50%7=1,14%7=0等於0。那麼504能被7整除。 21
Java面試題:有陣列a[n],用java程式碼將陣列元素順序顛倒
Official Certification 鄧 斌,Tony,男,漢族,江西興國人,無黨派,研究生學歷。畢業於中國科學技術大學精密機械資訊工程專業,於2008年取得中國科學技術大學高階軟體工程專業工學碩士學位。先後在國內外知名網際網路企業做過資深軟體開發工程師、高階系
java多執行緒面試題:三個執行緒順序列印ABC,重複10次
這個面試題,比較經典。有不同的解決思路。有的博文是用Join去實現。我面試的時候也是第一個想到的是用join叫A執行緒等待B執行緒執行完再執行。這樣的思路能實現,但是不好。雖然當時湊合著說服了面試官。先把程式碼貼出來 private Thread aThread,bThr