image.png 程式計數器 作用:當前線程所執行的位元組碼的行號指示器。 在虛擬機的概念模型里,位元組碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。 註:如果線程正在執行一個java方法,計數器記錄 ...
image.png
- 程式計數器
作用:當前線程所執行的位元組碼的行號指示器。
在虛擬機的概念模型里,位元組碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。
註:如果線程正在執行一個java方法,計數器記錄的是正在執行的虛擬機位元組碼指令的地址;如果正在執行的是Native方法,這個計數器值為空。此記憶體區域是唯一一個在java虛擬機規範中沒有定義任何OutOfMemoryError情況的區域。
- Java虛擬機棧
生命周期與線程相同,描述Java方法執行的記憶體模型:每個方法被執行時同時創建一個棧幀用於存儲局部變數表、操作棧、動態鏈接、方法出口等信息。每個方法都被調用直至執行完成的過程,就對應一個棧幀在虛擬機棧中從入棧到出棧的過程。
在Java虛擬機規範中,這個區域規定了兩種異常狀況:如果線程請求的棧深度大於虛擬機所允許的深度,將拋出StackOverflowError異常;如果虛擬機棧可以動態擴展,當擴展時無法申請到足夠的記憶體時會拋出OutOfMemoryError異常。
- 本地方法棧
與虛擬機棧發揮的作用非常相似,區別不過是虛擬機棧為虛擬機執行Java方法服務,本地方法棧則是為虛擬機使用到的Native方法服務。
拋異常情況同上。
-
堆
Java虛擬機所管理的記憶體中最大的一塊。在虛擬機啟動時創建,此記憶體區域的唯一目的就是存放對象實例。
堆是垃圾收集器管理的主要區域,從記憶體回收的角度看,由於現在收集器基本都採用的分代收集演算法,所以Java堆中還可以細分為:新生代和老年代;再細緻一點的有Eden空間、From Survivor空間、To Survivor空間等。
Java堆可以處於物理上不連續的記憶體空間中,只要邏輯上連續的即可。 -
方法區
用於存儲已被虛擬機載入的類信息、常量、靜態變數、即時編譯器編譯後的代碼等數據。
題外:運行時常量池
方法區的一部分,用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類載入後存放到方法區的運行時常量池中。
堆的最小值 -Xms
最大值-Xmx
最大方法區容量 MaxPermSize
方法區大小的參數 -XX:PermSize
-XX:MaxPermSize
本機直接記憶體容量可通過-XX:MaxDirectMemorySize指定,如果不指定,則預設與Java堆的最大值(-Xmx指定)一樣。
歡迎加入學習交流群569772982,大家一起學習交流。