技術文章第一時間送達!
對于有一定經驗的開發者,在面試過程中多多少少都會被問及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)
垃圾回收算法:
引用計數法
标記清除法
複制算法
标記壓縮算法
分代算法
分區算法
以上這些,可以自己了解一下,這裡列舉幾篇相關文章:
JVM的記憶體區域劃分
JVM知識點梳理
JVM記憶體配置設定與回收
JVM記憶體管理機制
Java虛拟機學習 - 垃圾收集器
類在虛拟機中的加載過程
加載Loading:
通過一個類的全限定名來擷取一個二進制位元組流、将這個位元組流所代表的靜态存儲結構轉化為方法區的運作時資料結構、在記憶體中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種資料的通路入口。
驗證Verification:
確定Class檔案的位元組流中包含的資訊符合目前虛拟機的要求,并不會危害虛拟機的自身安全。
準備Preparation:
正式為類變量配置設定記憶體并設定類變量初始值。
解析Resolution:
虛拟機将常量池内的符号引用替換為直接引用的過程。
初始化Initialization:
類加載過程的最後一步,到了這個階段才真正開始執行類中定義的Java程式代碼。
使用Using:
根據你寫的程式代碼定義的行為執行。
解除安裝Unloading:
GC負責解除安裝,這部分一般不用讨論。
以上這些抛磚引玉,歡迎留言更清晰的類加載過程,相關文章可以閱讀:
類加載器詳解
詳解java類的生命周期
談談我對面向對象以及類與對象的了解
強引用、軟引用、弱引用、虛引用與GC的關系
強引用:new出的對象之類的引用,隻要強引用還在,永遠不會回收。
軟引用:引用但非必須的對象,記憶體溢出異常之前回收。
弱引用:非必須的對象,對象隻能生存到下一次垃圾收集發生之前。
虛引用:對生存時間無影響,在垃圾回收時得到通知。
這個相對好了解了,相關閱讀如下:
Java 如何有效地避免OOM:善于利用軟引用和弱引用