點選上方“芋道原始碼”,選擇“置頂公眾號”
技術文章第一時間送達!
原始碼精品專欄
對於有一定經驗的開發者,在面試過程中多多少少都會被問及jvm相關知識,但是往往在實際開發中涉及較少,這裡整理一些知識點做一期面試題庫拿出來,希望對有用到朋友有一些參考。
小編水平有限,可以把常考題型列出來,但解答部分僅做參考,如果有知識點錯誤希望能夠留言糾正,如果是有更好的參考答案,更加歡迎留言大家探討,我會置頂,以上這些,下麵是正題。
Java語言中一個顯著的特點就是引入了垃圾回收機制,這個大家都清楚,垃圾回收的概念這裡也不做介紹,重點是垃圾回收是在什麼時候開始?對什麼東西,做了什麼事情?
GC何時開始:
所有的回收器型別都是基於分代技術來實現的,那就必須要清楚物件按其生命週期是如何劃分的。
-
年輕代:劃分為三個區域:原始區(Eden)和兩個小的存活區(Survivor),兩個存活區按功能分為From和To。絕大多數的物件都在原始區分配,超過一個垃圾回收操作仍然存活的物件放到存活區。垃圾回收絕大部分發生在年輕代。
-
年老代:儲存年輕代中經過多個回收週期仍然存活的物件,對於一些大的記憶體分配,也可能直接分配到永久代。
-
持久代:儲存類、方法以及它們的描述資訊,這裡基本不產生垃圾回收。
有了以上這些鋪墊之後開始回答GC何時開始:
Eden記憶體滿了之後,開始Minor GC(從年輕代空間回收記憶體被稱為 Minor GC);升到老年代的物件所需空間大於老年代剩餘空間時開始Full GC(但也可能小於剩餘空間時,被HandlePromotionFailure引數強制Full GC)
對什麼東西操作,即垃圾回收的物件是什麼:
從root開始搜尋沒有可達物件,而且經過第一次標記、清理後,仍然沒有複活的物件。
做了什麼東西:
主要做了清理物件,整理記憶體的工作。具體的引申如下
垃圾回收器的型別:
-
序列垃圾回收器(Serial Garbage Collector)
-
並行垃圾回收器(Parallel Garbage Collector)
-
併發標記掃描垃圾回收器(CMS Garbage Collector)
-
G1垃圾回收器(G1 Garbage Collector)
垃圾回收演演算法:
-
取用計數法
-
標記清除法
-
複製演演算法
-
標記壓縮演演算法
-
分代演演算法
-
分割槽演演算法
以上這些,可以自己瞭解一下,這裡列舉幾篇相關文章:
類在虛擬機器中的載入過程
載入Loading:
透過一個類的全限定名來獲取一個二進位制位元組流、將這個位元組流所代表的靜態儲存結構轉化為方法區的執行時資料結構、在記憶體中生成一個代表這個類的java.lang.Class物件,作為方法區這個類的各種資料的訪問入口。
驗證Verification:
確保Class檔案的位元組流中包含的資訊符合當前虛擬機器的要求,並不會危害虛擬機器的自身安全。
準備Preparation:
正式為類變數分配記憶體並設定類變數初始值。
解析Resolution:
虛擬機器將常量池內的符號取用替換為直接取用的過程。
初始化Initialization:
類載入過程的最後一步,到了這個階段才真正開始執行類中定義的Java程式程式碼。
使用Using:
根據你寫的程式程式碼定義的行為執行。
解除安裝Unloading:
GC負責解除安裝,這部分一般不用討論。
以上這些拋磚引玉,歡迎留言更清晰的類載入過程,相關文章可以閱讀:
強取用、軟取用、弱取用、虛取用與GC的關係
強取用:new出的物件之類的取用,只要強取用還在,永遠不會回收。
軟取用:取用但非必須的物件,記憶體上限溢位異常之前回收。
弱取用:非必須的物件,物件只能生存到下一次垃圾收集發生之前。
虛取用:對生存時間無影響,在垃圾回收時得到通知。
這個相對好理解了,相關閱讀如下:
目前在知識星球(https://t.zsxq.com/2VbiaEu)更新瞭如下 Dubbo 原始碼解析如下:
01. 除錯環境搭建
02. 專案結構一覽
03. API 配置(一)之應用
04. API 配置(二)之服務提供者
05. API 配置(三)之服務消費者
06. 屬性配置
07. XML 配置
08. 核心流程一覽
09. 拓展機制 SPI
10. 執行緒池
…
一共 60 篇++