java內存區域初窺

運行時數據區域

jvm.png

程序計數器

程序計數器 (Program Counter Register) 是一塊較小的內存空間,可以看做是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型(各種虛擬機可能會通過更高效的字節碼去實現)里,字節碼解釋器工作時就是通過改變這個計算器的值來選取 下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。

  • 每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲。線程私有。
  • 線程執行的是一個java方法,計數器記錄的是正在執行的虛擬機字節碼制定地址。
  • 線程執行的是一個native方法,這個計數器值則為空(undefined)。
  • 唯一一個不會出現OutOfMemoryError情況的區域。

java虛擬機棧

java虛擬機棧 (Java Virtual Machine Stacks) 描述的是java方法執行的內存模型,每個方法在執行的同時都會創建一個棧幀用于存儲局部變量表、操作數棧、動態連接、方法出口等。

  • 線程私有,生命周期與線程相同
  • 如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常
  • 如果虛擬機棧可以動態擴展,如果擴展時無法申請到足夠的內存,則將拋出OutOfMemoryError異常

本地方法棧

與java虛擬機棧所發揮的作用非常相似,本地方法棧 (Native Method Stack) 是為虛擬機所使用的native方法服務。

java堆

一般來說,java堆 (Java Heap) 是java虛擬機所管理的內存最大的一塊,此區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。

  • 所有線程共享的內存區域
  • 垃圾收集器管理的主要區域(GC堆),還可以細分為新生代和老年代或者Eden空間、From Survivor空間和to Survivor空間
  • java堆可以處于物理上不連續的內存空間中,只要邏輯上連續的即可(可通過-Xmx和-Xms控制大小)

方法區

方法區(Method Area)是用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。

  • 線程共享

運行時常量

運行時常量是方法區的一部分,Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用于存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載后進入方法區的運行時常量池中存放。

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

推薦閱讀更多精彩內容