深入淺出JVM(一):運行時數據區域

JVM運行時數據區

程序計數器

  • 線程私有
  • 指向了正在執行的虛擬機字節碼指令的地址;如果是本地方法,數值爲空
  • 沒有 OutOfMemoryError 錯誤的區域

Java虛擬機棧

  • 線程私有;
  • 生命週期與線程相同;
  • 代表着 Java 方法執行的內存模型:每個方法執行時的同時會創建一個棧幀(Stack Frame)用於存放***局部比量表、操作數棧、動態鏈接、方法出口***等信息。
    • 每個方法從調用到執行完畢的過程,對應着每一個棧幀在虛擬機棧中入棧到出棧的過程。
  • 如果線程請求的棧深度大於虛擬機允許的深度,跑出 StackOverflowError 異常;無法申請到足夠的內存,拋出 OutOfMemoryError 錯誤。

本地方法棧

  • 線程私有;
  • 和 Java 虛擬機棧類似,但是是爲 Native 方法服務。

Java 堆

  • 線程共享;
  • Java 虛擬機中內存最大的一塊;
  • 惟一的作用是存放對象實例:所有的對象實例以及數組都要在堆上分配
  • 是垃圾收集器的主要區域。詳細區分的話,可以分爲新生代和老年代,再細緻的話,可以分爲 Eden 空間、 From Surivor 空間、 To Surivor 空間;
  • Java 堆可以處於物理上不連續的內存空間中,只要邏輯是連續的即可。 主流的虛擬機通過 -Xms 和***-Xmx***控制;
  • 如果堆中沒有內存完成實例分配,並且堆無法再拓展時,拋出 OutOfMemoryError 錯誤。

方法區

  • 線程共享;
  • 存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據;
  • 已被稱爲 Non-Heap;
  • 有時候被稱爲***永久帶***,原因:HotSpot 虛擬機將GC分帶收集拓展至方法區;
  • 方法區內存無法滿足內存分配需求時,拋出 OutOfMemoryError 錯誤。

    運行時常量池

    • 方法區的一部分;
    • 存放編譯期產生的各種字面量和符號引用;
    • OOM 報錯和方法區一致。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章