JVM調優(一)
一、JVM基礎
1、JVM是一種半解釋半編譯的語言
編譯:java檔案-->javac編譯-->class檔案
解釋:JVM去解釋為二進位制檔案,交給作業系統去執行
2、JVM、JRE、JDK之間的關係
JRE=JVM+一些java的類庫(String.class、Object.class等)
JDK=JRE+自己定義的方法
3、class檔案格式:二進位制位元組流
16進位制下是以cafe babe開頭的16進位制的一堆數字,可以在idea中下載jclasslib外掛進行檢視
二、類載入器
1、載入過程
①loading:將class檔案載入到記憶體
②linking:
verification:校驗class檔案是否符合標準,比如class檔案開頭4位元組是否為cafe babe
preparation:將class檔案中靜態變數賦預設值
resolution:轉換為記憶體地址
③initializing:靜態變數賦初始值
2、java中所有class檔案都是由jvm中的類載入器ClassLoader載入到記憶體中的
class檔案載入到記憶體,記憶體中有兩塊空間,一塊是class檔案的內容,另一個是class檔案的類物件,該物件指向class檔案的記憶體
3、類載入器
Bootstrap和Extension是載入指定jar包下的
App:載入自己寫的類
4、雙親委派,以自定義類T.class為例(在Custom ClassLoader中載入)
當T.class要被載入到記憶體中時
①先去Custom ClassLoader中尋找,Custom ClassLoader會在記憶體中維護一個快取空間記錄該類是否被載入
②若未被載入,向上詢問App快取是否被載入
③若App快取中未被載入,向上詢問Extention中是否被載入
④若Extention快取中未被載入,向上詢問Bootstrap中是否被記載
⑤若Bootstrap快取中未被載入,向下開始載入
⑥Bootstrap中判斷是否能找到該類,發現找不到
⑦到Extention中判斷是否能找到該類,發現找不到
⑧到App中判斷是否能找到該類,發現找不到
⑨到Custom ClassLoader中判斷是否能找到該類,發現可以找到,將T.class記載到記憶體,如果發現找不到則丟擲ClassNotFoundException異常
5、為什麼要有雙親委派機制?不能直接載入到記憶體中嗎?
為了安全
如果沒有雙親委派機制,自定義一個java.lang.String,直接將該類漏到記憶體,當用戶輸入密碼的時候,轉成自定義的String物件,就可以獲取密碼