1. 程式人生 > 其它 >JVM調優(一)

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物件,就可以獲取密碼