天天看點

jvm記憶體模型jvm記憶體模型

jvm記憶體模型

jvm記憶體模型jvm記憶體模型

類加載器子系統:

  • 隻負責加載class檔案,至于該類是否被執行則由執行引擎所決定,每個class檔案都有特定的辨別,稱為魔數。

    魔數:class檔案以十六進制方式進行檢視,第一行字母:CA FE BA BE

    該魔數表示目前class是java語言編譯而成的,不同的語言編譯得到的class檔案的魔數都不一樣

    在魔數之後20 20 20 34表示目前class檔案是那個版本的JDK所編譯的。這裡的34等于十進制的52,52則代表JDK1.8版本。

  • 加載類的資訊存放于一塊方法區的空間

方法區:

  1. 方法區中存放虛拟機已加載好的所有類的資訊

類資訊包括:

類型資訊
  • 類的全限定類名(例:java.lang.System)
  • 類的直接父類的全限定類名
  • 類的直接實作接口的有序清單(因為一個類直接實作的接口可能不止一個,是以放到一個有序清單中)
  • 類的修飾符

    可以看做是,對一個類進行登記,這個類的名字叫啥,他爹是誰,有沒有實作接口,權限是啥

類型的常量池(運作時常量池)
  • 每一個class檔案中,都維護着一個常量池(這個儲存在類檔案中,不要與方法取得運作時常量池搞混),裡面存放着編譯時期生成的各種字面值和符号引用;這個常量池的内容,在類加載的時候,被複制到方法區的運作時常量池。
  • 字面值:就像String,基本資料類型,以及他們的包裝類的值,以及final修飾的變量,簡單說就是在編譯期間,就可以确定下來的值
類變量(static變量)
  • 非final類變量
  • 在JVM使用一個類之前,它必須在方法區中為每個非final類變量配置設定空間。非final類變量存儲在定義它的類中
final類變量(不存儲在方法區中),由于final的不可改變性
是以,final類變量的值在編譯期間就被确定
被儲存在類的常量池裡面,
在加載類的時候,複制進方法區的運作時常量池
final類變量存儲在運作時常量池裡面,每一個使用它的類儲存着一個對其的引用。