1. 程式人生 > >JVM---運行時數據區域

JVM---運行時數據區域

over 運行時數據區域 服務 異常 內存 內存分配 甚至有 動態擴展 數據區

1、程序計數器

  1.1  一塊較小的內存空間、可以看作是當前線程所執行的字節碼的行號指示器;

  1.2  在JVM的概念模型中,字節碼解釋器的作用:通過改變程序計數器的值來選取下一條需要執行的字節碼指令(分支、循環、異常處理、線程恢復等基礎功能

      都需要依賴程序計數器來實現);

  1.3  JVM的多線程實現方式:

        通過線程輪流切換  並分配處理器執行時間

     為了線程切換後能恢復到正確的執行位置,每個線程必須有獨立的程序計數器,各計數器獨立存儲、互不影響;

  1.4  如果線程執行的是一個Java方法,程序計數器中記錄的是正在執行字節碼指令的地址;

     如果線程執行的是一個native方法,程序計數器的值為空(undefined);

  1.5  生命周期同線程;

2、Java虛擬機棧

  1.1  生命周期同線程;

  1.2  描述的是Java方法執行的內存模型:

        每個方法在執行的同時都會創建一個棧幀,用於存儲局部變量表、操作數棧、方法出口等信息;

        每個方法從調用到執行完成,對應著一個棧幀在Java虛擬機棧中入棧到出棧的過程;

  1.3  在JVM規範中,對Java虛擬機棧規定了2種異常情況:

        如果線程請求的棧深度大於JVM所允許的深度,則拋出StackOverflowError異常;

        如果棧可以動態擴展,擴展時無法申請到足夠的內存,則拋出OutOfMemoryError異常;

3、本地方法棧

  1.1  生命周期同線程;

  1.2  作用:為虛擬機用到的native方法服務;

  1.3  在JVM規範中,對本地方法棧中方法的使用語言、使用方式、數據結構沒有做強制要求,具體的虛擬機可以自由實現它,

      甚至有的虛擬機直接將Java虛擬機棧和本地方法棧合二為一;

  1.4  同Java虛擬機棧規定了StackOverflowError異常、OutOfMemoryError異常;

4、Java堆

  1.1  生命周期同進程;

  1.2  被所有線程共享;

  1.3  作用:存放對象實例;

  1.4  又稱“GC堆”

  1.5  在JVM規範中,如果沒有多余內存分配對象實例,並且堆也無法擴展,拋出OutOfMemoryError異常;

5、方法區

  1.1  生命周期同進程;

  1.2  被所有線程共享;

  1.3  用於存儲已被虛擬機加載的類信息、常量、靜態變量等數據;

  1.4  在JVM規範中,當方法區無法滿足內存分配需求時,拋出OutOfMemoryError異常;

JVM---運行時數據區域