1. JVM介紹和運行流程-CSDN博客
2. 什么是程序計數器-CSDN博客
3. java 堆和 JVM 內存結構-CSDN博客
4. 虛擬機棧-CSDN博客
5. JVM 的方法區-CSDN博客
6. JVM直接內存-CSDN博客
7. JVM類加載器與雙親委派模型-CSDN博客
8. JVM類裝載的執行過程-CSDN博客
9. JVM垃圾回收-CSDN博客
10. 垃圾回收的算法-CSDN博客
11. JVM中的分代回收-CSDN博客
12. JVM的垃圾回收器-CSDN博客
13. G1垃圾回收器-CSDN博客
14. 垃圾回收的引用區別-CSDN博客
15. JVM調優的參數設置-CSDN博客
16. JVM調優工具-CSDN博客
1.?什么是方法區
方法區是Java虛擬機(JVM)內存結構中的一個重要組成部分,主要用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。
主要特點
-
共享內存區域:所有線程共享方法區
-
邏輯部分:是Java堆的邏輯組成部分
-
規范描述:在JVM規范中屬于堆的一個邏輯部分,但習慣上被稱為"非堆"(Non-Heap)
?發展與演進
-
永久代(PermGen):在JDK7及之前,虛擬機用永久代來實現方法區。
-
元空間(Metaspace)(方法區):從JDK8開始,永久代被移除,改用本地內存實現的元空間(方法區)。
存儲內容?
方法區主要存儲:
類信息(Class元數據)
運行時常量池
靜態變量
即時編譯器編譯后的代碼(JIT編譯的本地代碼)
方法代碼
2.? 元空間的常量池
常量池(Constant Pool)是 Java 類文件(.class 文件)和 JVM 運行時內存中的一個重要數據結構,用于存儲類、方法、字段等相關的符號引用和字面量。
它分為兩種:
Class 文件常量池(靜態常量池,編譯期生成)
運行時常量池(Runtime Constant Pool,JVM 運行時使用)
常量池 可以看作是一張表,虛擬機指令根據這張常量表找到要執行的類名、方法名、參數類型、字面量等信息?。?
可以使用下面的指令查看字節碼結構(類的基本信息、常量池、方法定義):
javap -vApplication.class
例如下圖:?
Class 文件常量池(靜態常量池)
在?.class
?文件中,常量池存儲了類、方法、字段等的符號引用和字面量,主要包括:
-
字面量(Literals):
-
字符串(如?
"Hello"
) -
整數、浮點數(如?
100
,?3.14
) -
布爾值(
true
/false
) -
null
-
-
符號引用(Symbolic References):
-
類和接口的全限定名(如?
java/lang/Object
) -
字段的名稱和描述符(如?
name:Ljava/lang/String;
) -
方法的名稱和描述符(如?
main:([Ljava/lang/String;)V
)
-
特點:
-
編譯期生成,存儲在?
.class
?文件中 -
不占用 JVM 內存,僅用于類加載時的解析
運行時常量池(Runtime Constant Pool)
當 JVM?加載類時,會將 Class 文件常量池的內容解析并存儲到?方法區(元空間)?中的運行時常量池。它包含:
-
解析后的直接引用(如方法、字段的內存地址)
-
動態生成的常量(如?
String.intern()
?的字符串) -
JVM 運行時的符號引用解析結果
特點:
-
存儲在?方法區(JDK 8 后是元空間)
-
可以動態添加(如?
String.intern()
) -
如果內存不足,會拋出?
OutOfMemoryError
3. 總結?
3.1 什么是方法區?
- 方法區(Method Area)是各個線程共享的內存區域
- 主要存儲類的信息、運行時常量池
- 虛擬機啟動的時候創建,關閉虛擬機時釋放
- 如果方法區域中的內存無法滿足分配請求,則會拋出OutOfMemoryError:Metaspace
3.2 介紹一下運行時常量池
- 常量池:可以看作是一張表,虛擬機指令根據這張常量表找到要執行的類名方法名、參數類型、字面量等信息
- 當類被加載,它的常量池信息就會放入運行時常量池,并把里面的符號地址變為真實地址