『壹』 13道常見的 JVM面試題
類載入過程:
java內存模型:
內存區域:
堆與棧的區別:
GC流程:
雙親委派模型:
JVM參數:
引用類型:
垃圾回收演算法:
垃圾回收器:
內存回收:
GC監控:
內存錯誤處理:
『貳』 java中類載入器是怎麼工作的
JVM將類載入過程分為三個步驟:裝載(Load),鏈接(Link)和初始化(Initialize)
鏈接又分為三個步驟,驗證、准備、解析
1) 裝載:查找並載入類的二進制數據;
2)鏈接:
驗證:確保被載入類的正確性;
准備:為類的靜態變數分配內存,並將其初始化為默認值;
解析:把類中的符號引用轉換為直接引用;
3)初始化:為類的靜態變數賦予正確的初始值;
那為什麼我要有驗證這一步驟呢?首先如果由編譯器生成的class文件,它肯定是符合JVM位元組碼格式的,但是萬一有高手自己寫一個class文件,讓JVM載入並運行,用於惡意用途,就不妙了,因此這個class文件要先過驗證這一關,不符合的話不會讓它繼續執行的,也是為了安全考慮吧。
准備階段和初始化階段看似有點牟盾,其實是不牟盾的,如果類中有語句:private static int a = 10,它的執行過程是這樣的,首先位元組碼文件被載入到內存後,先進行鏈接的驗證這一步驟,驗證通過後准備階段,給a分配內存,因為變數a是static的,所以此時a等於int類型的默認初始值0,即a=0,然後到解析(後面在說),到初始化這一步驟時,才把a的真正的值10賦給a,此時
『叄』 java類的載入過程是怎麼樣的
類載入到jvm需要經歷如下幾個過程:
一.載入
通過類的全限定名轉換為二進制位元組流,在jvm堆中生成代表這個Class的對象,作為方法區域的方法入口.
二.連接
1.驗證:驗證class的位元組流是否對jvm虛擬機造成傷害,是否符合jvm的規范,這里包含幾個驗證.
2.准備:為類的static變數賦初始值,其中不包含類其它實例成員的初始化.
3.解析:將常量池內的符號引用替換成直接引用
三.初始化
這里是static{}塊,構造函數,代碼塊{}的執行過程.
四.使用
對象的屬性,方法等調用操作.
五.銷毀
jvm通過確定對象沒有引用後進行gc操作.