深刻淺出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 錯誤。java

    ####運行時常量池
    • 方法區的一部分;
    • 存放編譯期產生的各類字面量和符號引用;
    • OOM 報錯和方法區一致。
相關文章
相關標籤/搜索