Java運行時數據區

JVM將運行時數據區劃分如下:

1. 堆區

堆區(Java Heap)通常是JVM所管理的內存中最大的,它是線程共享的區域,所有對象的實例都在堆上分配空間(也不十分絕對;

從內存回收的角度看,Java堆還可以細分爲新生代與老年代、或Eden/From Survivor/To Survivor空間;

從內存分配的角度看,堆會劃分出多個線程私有的分配緩衝區(TLAB),以提高分配效率,減少線程衝突。

2. 方法區

方法區(Method Area)也是線程共享的,習慣上被稱作非堆(Non-Heap),以示和堆的區別。用於存放虛擬機已加載的類的信息、常量、靜態變量、編譯後的代碼;

在JDK1.7以前,HotSpot將GC分代收集擴展至方法區,使用永久代實現方法區,從1.8開始,移除了永久代的概念,使用元空間(Metaspace)代替,也就是說JDK1.8的內存模型中也不存在方法區。原先存在於方法區中的大部分數據被移到元空間中,也有一部分被放到堆中;

元空間數據在本地內存中被分配,而非JVM虛擬機,實現的功能與原先的方法區基本無異;

方法區中的對象,既然被稱作永久代,雖然並非真的“永久”,但GC的頻率相對於堆區要低得多;方法區的內存回收主要包括類的卸載、常量池的清理等。

3.虛擬機棧

線程私有,生命週期與線程相同。方法被調用時,會創建一個棧幀,壓入虛擬機棧,函數返回對應棧幀出棧,棧幀包含:

  • 局部變量

局部變量表存放了編譯器可知的基本數據類型、引用類型、returnAddress類型;存放單元爲slot,一個字節;

  • 方法出口

保存了調用指令的字節地址;方法退出時,棧幀出棧,恢復調用函數的局部變量表、操作數棧,將方法的返回值壓入調用者的操作數棧,PC指向調用指令的下一條指令;

  • 操作數棧

與局部變量類似,但是個棧;

  • 動態鏈接

將符號引用在運行時轉化爲直接引用;

4.本地方法棧

線程私有,與虛擬機棧類似,記錄本地方法的調用;

5.程序計數器(PC)

記錄程序已運行到什麼位置;

 

參考:

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章