標籤:位元組 靜態變數 jvm 編譯 基本 運行 過程 方法區 儲存
讀了《深入理解Java虛擬機器》之後,當時理解了,過段時間又忘記了,在此做下記錄,方便自我回顧,也希望能幫到想要學習虛擬機器的同學。
Java虛擬機器在執行java程式時會把它所管理的記憶體分為5個不同的資料區域(也可以細分為7個不同的地區,後續做介紹):程式計數器、Java虛擬機器棧、本地方法棧、Java堆、方法區
java虛擬機器運行時資料區
1、程式計數器:用來記錄正在執行的虛擬機器位元組碼指令地址。可通過改變這個計數器的值來選取下一條需要執行的位元組碼指令。
-
- 線程私人:為了線程切換後能恢複到正確的位置,每條線程都需要有一個獨立的程式計數器,各條線程之間計數器互不影響。
2、Java虛擬機器棧:線程私人,生命週期與線程相同,每當建立一個線程時,JVM就會為這個線程建立一個對應的java棧。在這個java棧中又會包含多個棧幀,每運行一個方法就建立一個棧幀,用於儲存局部變數表、操作棧、方法傳回值等。每一個方法從調用直至執行完成的過程,就對應一個棧幀在java棧中入棧到出棧的過程。
-
- 局部變數表:存放編譯器可知的各種基礎資料型別 (Elementary Data Type)、對象引用。
3、本地方法棧:與虛擬機器棧發揮的作用相似,區別在於:虛擬機器棧為虛擬機器執行java方法(也就是位元組碼)服務,本地方法棧為虛擬機器使用到的Native方法服務。
4、java堆:儲存物件執行個體以及數組。是垃圾收集器管理的主要區域。
-
- 線程共用。java堆可以處於物理上不連續的記憶體空間,只要邏輯上連續即可。
5、方法區:用於存放類資訊(如類名、存取修飾詞等)、常量池、靜態變數、即時編譯器便宜後的代碼等。雖然JVM規範把方法區描述為堆的一個邏輯部分, 但它卻有個別名non-heap(非堆),目的應該是與Java堆區分開來。
6、運行時常量池:方法區的一部分,用於存放編譯期產生的各種字面量和符號引用。
-
- 常量池:指的是編譯期被確定並被儲存在已編譯的.class檔案中的一些資料,除了包含代碼中所定義的各種基本類型(如int、long等)和物件類型(如String和數組)的常量值(final),還包含一些以文本形式出現的一些符號引用。
7、直接記憶體:堆外的記憶體。它不是虛擬機器運行時資料區的一部分,也不是java虛擬機器規範中定義的記憶體地區。
java記憶體地區的分布