一,概述
java虛擬機運行時資料區模型圖:
主要包括:程式計數器,java虛擬機堆疊,本地方法堆疊,java 堆,方法區(元空間),
其中堆和方法區由所有執行緒共享的資料區;程式計數器,java虛擬機堆疊,本地方法堆疊是執行緒隔離的資料區,

二,程式計數器
程式計數器是一塊較小的記憶體空間,可以看做是當前執行緒所執行的位元組碼的行號指示器,在java概念模型中,位元組碼解釋器就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,
每條執行緒的計數器都是獨立的,互不影響,獨立存盤,我們稱這類記憶體區域為“執行緒私有”的記憶體,
通俗來講,例如:就是一個A方法(執行緒)運行到第10行代碼,這個時候有一個B執行緒獲取了CPU資源,這個時候在A的位元組碼處做一個標記,下次再輪到A的時候就不需要再重復執行之前的代碼,不過這些都是在位元組碼(.class檔案)層面,在此處只是通俗打個比方,
三,堆疊
堆疊是執行緒私有的,在每個方法執行的時候,會同步創建一個堆疊幀,用于存盤區域變數表,運算元堆疊,動態連接,方法出口等資訊,
在大部分的情況下,我們說的“堆疊”指的是就是區域變數表部分,區域變數表存放了編譯前的java基本資料型別,物件參考和returnAddress 型別
堆疊區域出現例外的情況:
1.如果執行緒請求的堆疊深度大于虛擬機所應許的深度,將拋出StackOverflowError 例外,
2.如果java虛擬機堆疊容量可以動態擴展,當堆疊擴展時無法申請到足夠的記憶體會拋出OutOfMemoryError 例外,
四,本地方法堆疊
本地方法堆疊與堆疊發揮的作用差不多,堆疊是為 java方法(位元組碼) 服務,而本地方法堆疊是為虛擬機使用到的本地(Native)方法服務,
本地方法堆疊區域出現例外的情況:本地方法堆疊也會在堆疊深度和堆疊擴展失敗的時候分別拋出:StackOverflowError 和 OutOfMemoryError 例外,
五,java 堆
1,java堆是記憶體共享的,也是虛擬機所管理記憶體最大的一塊,java世界里 “幾乎” 所有的物件實體都是在這記憶體中進行分配
2, java 堆是垃圾收集器管理的記憶體區域,因此也被稱為 “GC堆”
3,從分配記憶體的角度看,所有的執行緒共享的java 堆 可以劃分為許多執行緒私有分配緩沖區,以提高物件分配時的效率,
4,java 堆可以在物理上記憶體空間是不連續的,但在邏輯上應該是被視為連續的,
5,java 堆可以被固定為現成大小,也可以進行擴展
堆疊區域出現例外的情況:
1.如果在 java 堆中沒有記憶體完成實體的分配,并且堆也無法進行擴展時,java 虛擬機會拋出 OutOfMemoryError 例外,
六,方法區
概念:方法區也是執行緒共享的記憶體區域,它用于存盤被虛擬機加載的型別資訊,常量,靜態變數,即時編譯器編譯后的代碼快取等資料,
方法區可以像堆一樣,可以進行擴展和在物理上不連續,還可以選擇不實作垃圾收集,
方法區出現例外的情況:
1.如果方法區無法滿足新的記憶體分配需求時,將拋出 OutOfMemoryError 例外,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/429246.html
標籤:Java
上一篇:Java基礎-續
下一篇:Redis小秘密
