1. 程式人生 > >運行時數據

運行時數據

尺寸 sse contain ttr 正在 無法 apt 調用 內容

運行時數據區:

技術分享圖片技術分享圖片?

1. 程序計數器(線程私有)

  • 當前線程的所執行字節碼的行號指示器
  • 字節碼解釋器工作時通過改變計數器的值選擇下一條需要執行的字節碼指令。
  • java虛擬機的多線程通過輪流切換分配處理器(對於多核處理器來說是一個內核)執行時間來實現,一個時刻,一個處理器只會執行一條線程。
  • 為了保證線程切換後能恢復正確的位置,因此每個線程都有一個獨立的程序計數器。
  • 線程執行 java 方法時計數器記錄正在執行的虛擬機字節碼指令的地址;
  • 線程執行 native 方法時計數器值為空;

2. 虛擬機棧(線程私有)

  • 生命周期與線程相同
  • 描述java方法執行的內存模型:方法執行時創建一個棧幀存儲局部變量表,操作數棧,動態鏈接,方法出口
    等信息。方法的調用到完成對應著棧幀的入棧到出棧。
  • 局部變量表:存放編譯器可知的基本類型數據,對象引用和 returnAddress 類型(指向一條字節碼指令的地址)
  • 局部變量表所需空間在編譯期間完成分配,方法運行期間不會改變其大小。
  • 64位長度的long和double類型的數據占用2個局部變量空間(Slot),其余數據類型占用一個

  當線程請求的深入大於虛擬機允許的深度, 則拋出StackOverFlowError異常;

  當虛擬機棧動態擴展時無法申請到足夠的內存,則拋出OutOfMemoryError異常

3. 本地方法棧(線程私有)

  • 為Native 方法服務。

4. Java堆

  新生代+老年代 (內存回收采用分代收集 )

  新生代:Eden + From Survivor + To Survivor ( 8:1:1 )

5. 方法區(線程共享)

  Java虛擬機規範把方法區描述為堆的一個邏輯部分.

  a. 存儲虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯後的代碼等數據。

  b. HotSpot 使用永久代實現方法區,JDK1.7 將永久代的字符串常量池移出。

  c. 此區域的垃圾回收主要針對常量池的回收和類型的卸載。

6. 運行時常量池(方法區的一部分)

  a. 存儲編譯期間生成的字面量 和 符號引用,這部分內容在類加載後進入方法區的運行時常量池;

  b. 具備動態性,運行期間也可將新的常量放入池中;比如String 的 intern()

  c. 受方法區內存限制

  符號引用:

  1. 一組用來描述引用的目標的符號;

  直接引用:

  1. 直接指向目標的指針(指向Class 對象,類變量,類方法的直接引用,也可能是指向方法區的指針);
  2. 相對偏移量(指向實例變量,實例方法的直接引用);
  3. 一個能定位到目標的句柄。

7. 直接內存

  NIO引入一種基於通道(Channel)與緩沖區(Buffer)的I/O方式, 它可以直接使用Native函數直接分配堆外內存, 然後通過DirectByteBuffer對象操作這塊內存的引用進行操作.

  避免在Java堆和native堆中來回復制數據.

  直接內存的分配不受Java堆大小的限制.

技術分享圖片

運行時數據