JVM---運行時數據區域
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---運行時數據區域