深入理解java虛擬機

運行時數據區域

運行時數據區域
運行時數據區域

程序計數器

一塊較小的內存空間,(java中的多線程是輪流切換并分配處理器時間,在任一個確定的時刻,一個處理器只會執行一條線程。因此為了回復線程能夠恢復到正確的執行位置,每條線程都有一個獨立的計數器)各類線程之間計數器互不影像,獨立存儲,我們稱這類內存區域為“線程私有”的內存。
如果正在執行的java方法,這個計數器記錄的是正在執行的虛擬機指令地址;如果是Native方法,這個計數器值為空(undefined)。此區域是唯一一個在Java虛擬及規范中沒有規定的OutOfMemoryError 情況的區域。

Java 虛擬機棧

java虛擬機棧,也是線程私有的(同程序計數器),他的生命周期與線程相同。
(java方法執行的內存模型)每個方法執行的時候會創建棧幀,用于存儲局部變量表,操作數棧,動態鏈接,方法 出口信息等。
這個區域出現兩種狀況:如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常;如果虛擬機棧可以動態擴展,擴展時無法申請到足夠內存,就會拋出OutOfMerrorError異常

本地方法棧

本地方法棧(與虛擬機棧相似)。區別,虛擬機棧為虛擬機Java字節碼服務。而本地方法棧則為虛擬機使用的Native服務。
本地方法區域也會拋出StackOverflowError 和 OutOfMemoryError 異常。

Java 堆

被所有線程共享的一塊區域,主要存放對象的實例。隨著JIT發展和逃逸分析技術成熟,也不會那么“絕對”了
java堆可以處在物理上不連續的內存空間,只要邏輯上市連續的即可,就像我們的磁盤空間一樣。如果在堆中沒有內存完成實例分配,并且堆也無法擴展時候,將會拋出OutOfMemoryError

方法區

方法區和Java堆一樣,是線程共享的內存區域,用于存儲,虛擬機加載類信息,常量,靜態變量,即時編譯器編譯后的代碼等數據。Java虛擬機規范表示方法去是堆得一個邏輯部分。但是有一個別名叫非堆。
這個區域比較難管理,內存回收主要是對常量池的回收和對類型的卸載
當方法區無法滿足內存分配需求時候拋出OutOfMemoryError

運行時常量池

運行時常量池是方法區的一部分。
當常量池無法身親到內存是也會拋出OutOfMemoryError

直接內存

不是虛擬機運行時數據區的一部分,也不是java虛擬機規范中的內存區域。但是也被頻繁使用,會出現有拋出OutOfMemoryError的現象。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容