面試題:“你能不能談談,java GC是在什麼時候,對什麼東西,做了什麼事情?”

来源:http://www.cnblogs.com/shouce/archive/2016/04/29/5445019.html
-Advertisement-
Play Games

面試題目:地球人都知道,Java有個東西叫垃圾收集器,它讓創建的對象不需要像c/cpp那樣delete、free掉,你能不能談談: GC是在什麼時候,對什麼東西,做了什麼事情? 以上算是三個問題,下麵逐一分析: 問題一回答:什麼時候?1.系統空閑的時候。 分析:這種回答大約占30%,遇到的話一般我就 ...


面試題目:
地球人都知道,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到底怎麼判斷哪些對象在不在作用域的?至於引用計數來判斷對象是否可收集的,我可以會補充一個下麵這個例子讓面試者分析一下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下,就算說也要說出自己以前遇到這樣的問題是怎麼處理的,對這個知識有什麼認識想法,然後可以反問下考官,這樣可以不讓技術型的考官為如何繼續話題而對你無語,呵呵。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linq的delegate表達式,Insus.NET覺得它封裝得好,讓開發時簡化了很多代碼,而且容易閱讀與檢索。 比如,我們需要計算優惠給客戶金額,打85%折,可以這樣寫: using System; using System.Collections.Generic; using System.Li ...
  • 在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知識點。照此,ASP.NET MVC 大牛之路系列也先給大家普及一下C#.NET中的高級知識點。每個知識點不太會過於詳細,但足矣。要深入研究還需要去查看更多的專業資料。 要成為大牛,必然要有扎實的基本功,不然時間再長項目再多 ...
  • 因為公司有多個伺服器,要檢查磁碟的使用情況確定程式放哪個伺服器和清理垃圾,所以寫個小程式幫忙檢查。 效果圖: 後臺代碼: ...
  • 近乎的Ajax控制項介紹,代碼下載:http://www.jinhusns.com/Products/Download?type=whp AjaxForm 概述 功能說明 基於 ajaxForm 插件進行構建,可以使表單通過ajax的方式進行提交,並擴展了以下功能: 1.通過Html.BeginAja ...
  • 昨天在手機端測試自己的項目遇到如下情況。 1.在手機上(蘋果qq瀏覽器),登陸時存在session中的圖片驗證碼結果,一直獲取不到,考慮是cookies的問題。但是其他網站有貌似可以正常使用cookies,這是第一點矛盾。 2.在平板上(安卓qq瀏覽器),一直可以正常使用session,證明cook ...
  • ()help('What your wannt object') 看對像怎麼用法,按key q退出()在Python中有4種類型的數——整數、長整數、浮點數和複數。 * 2是一個整數的例子。 * 長整數不過是大一些的整數。 * 3.23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裡,52 ...
  • 首先關於json_encode的gbk中文亂碼,創建JSON函數,這一段來自網上某一位大俠 /************************************************************** * * 使用特定function對數組中所有元素做處理 * @param str ...
  • 1.什麼是記憶體泄漏(Memory Leak)? 簡單地說就是申請了一塊記憶體空間,使用完畢後沒有釋放掉。它的一般表現方式是程式運行時間越長,占用記憶體越多,最終用盡全部記憶體,整個系統崩潰。由程式申請的一塊記憶體,且沒有任何一個指針指向它,那麼這塊記憶體就泄露了。 2.記憶體泄漏的危害性 從用戶使用程式的角度來 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...