文章目錄
- 1.方法區
-
- 1.1 class檔案資訊
- 1.2 常量池
-
- 1.2.1 class檔案常量池-靜态常量池
- 1.3 運作時常量池-動态常量池
- 1.4 持久代(元空間)
- 1.5 資料區
方法區和常量池
Java虛拟機所管理的記憶體将會包括《方法區、堆、虛拟機棧、本地方法棧、程式計數器》等運作時資料區域。
1.方法區
方法區存放類的資訊、常量和靜态變量,即類被編譯後的class檔案。更加具體地說,存放着:類的版本,字段,方法,接口和常量池。常量池裡存儲着字面量和符号引用。
符号引用包括:1.類的全限定名,2.字段名和屬性,3.方法名和屬性。
- 方法區存class檔案資訊、class檔案常量池和運作時常量池
- 持久化(元空間)和資料區
方法區大小可以通過-XX:PermSize及-XX:MaxPermSize來進行調節。當方法區無法滿足記憶體配置設定需求時,會抛出java.lang.OutOfMemoryError: PermGenspace的異常。
1.1 class檔案資訊
class檔案資訊包括:魔數,版本号,常量池,常量池計數器,類,父類索引和接口數組,字段,方法等資訊,其中類裡面又包括字段和方法的資訊。
類型 | 名稱 | 數量 |
---|---|---|
u4 | magic魔數 | 1 |
u2 | minor_version副版本号 | 1 |
u2 | major_version主版本号 | 1 |
u2 | constant_pool_count常量池計數器 | 1 |
cp_info | constant_pool常量池資料 | constant_pool_count - 1 |
u2 | access_flags通路标志 | 1 |
u2 | this_class類索引 | 1 |
u2 | super_class父類索引 | 1 |
u2 | interfaces_count接口計數器 | 1 |
u2 | interfaces接口資料 | interfaces_count |
u2 | fields_count 字段計數器 | 1 |
field_info | fields字段資料 | fields_count |
u2 | methods_count | 方法電腦1 |
method_info | methods 方法 | methods_count |
u2 | attribute_count | 1 |
attribute_info | attributes | attributes_count |
1.2 常量池
1.2.1 class檔案常量池-靜态常量池
靜态常量池存儲的是當class檔案被java虛拟機加載進來後存放在方法區的一些字面量和符号引用,字面量包括字元串,基本類型的常量,符号引用其實引用的就是常量池裡面的字元串,但符号引用不是直接存儲字元串,而是存儲字元串在常量池裡的索引。
1.3 運作時常量池-動态常量池
動态常量池是當class檔案被加載完成後,java虛拟機會将靜态常量池裡的内容轉移到動态常量池裡,在靜态常量池的符号引用有一部分是會被轉變為直接引用的,比如說類的靜态方法或私有方法,執行個體構造方法,父類方法,這是因為這些方法不能被重寫其他版本,是以能在加載的時候就可以将符号引用轉變為直接引用,而其他的一些方法是在這個方法被第一次調用的時候才會将符号引用轉變為直接引用的
1.4 持久代(元空間)
持久代,這個區域會存儲包括類定義、結構、字段、方法(資料及代碼)以及常量在内的類相關資料。JDK8開始,持久代已經被徹底删除了,取代它的是另一個記憶體區域也被稱為元空間。
1.5 資料區
- 1.類加載器引用(classLoader)
-
2.運作時常量池
所有常量、字段引用、方法引用、屬性
-
3.字段資料
每個方法的名字、類型(如類的全路徑名、類型或接口) 、修飾符(如public、abstract、final)、屬性
-
4.方法資料
每個方法的名字、傳回類型、參數類型(按順序)、修飾符、屬性
-
5.方法代碼
每個方法的位元組碼、操作數棧大小、局部變量大小、局部變量表、異常表和每個異常處理的開始位置、結 束位置、代碼處理在程式計數器中的偏移位址、被捕獲的異常類的常量池索引