一、1.8之前
運行時數據區(進程共享)
- 運行時常量池
- 為什么要有方法區:
- jvm完成類裝載后,需要將class文件中的常量池轉入內存,保存在方法區中
- 為什么是常量:
- 常量對象操作較多,為了避免頻繁創建和銷毀
進程私有區域
- 虛擬機棧:主要用于方法的調用,每次函數調用都對應一個棧幀,方法結束(異常也可)彈出棧幀,由于方法中局部變量本身是實例變量的引用,因此棧中實際上保存的是對gc堆中對象的引用。
- 本地方法棧:服務非java原生方法
- 程序計數器
二、關于運行時常量池和串池
- 1.7之前:運行時常量池邏輯包含串池,位于方法區
- 1.7:串池被放入了堆之中
- 1.8:串池還在堆,方法區被取消,運行時常量池此時在原空間中
三、1.8及之后
將方法區拉出來,作為元空間,元空間使用直接內存