Java 虛擬機運行時數據區介紹

引言

Java 虛擬機(Virtual Machine)在執行 Java 程序時, 會將它所管理的內存劃分爲不同的數據區,這些分塊有不同的功能,理解它們各自的特點,對於深入理解java程序運行機制和調優Java代碼,具有重要意義。其實個人覺得,理解 Java 虛擬機的原理,也沒想象中的複雜(也許我的想法有點天真啊^_^),它的運行機制,就像一個小型操作系統,這也許就是虛擬機的來源吧。


Java VM運行時數據區結構圖


運行時數據區域解釋

本地方法棧

該區域所發揮的作用與虛擬機棧類似,只不過它是爲執行 Native 方法服務,而虛擬機棧爲執行 Java 方法(即字節碼)服務的,見下文的解釋。

虛擬機棧

描述 Java 方法執行的內存模型,每個方法執行時都會創建一個棧幀(Stack Frame)用於存儲局部變量表、操作棧、動態鏈接、方法返回地址等信息。

若線程請求棧的深度超過 VM 所規定的最大深度,將拋出 StackOverflowError異常。若內存動態擴展時申請內存失敗,將拋出 OutOfMemoryError異常。

程序計數器

類似於計算機體系結構中的 PC(Program Counter,也叫程序計數器),作用也非常相似,就是指示當前線程所執行的字節碼指令。分支、循環、跳轉、異常處理、線程恢復等都需要它來完成。

若當前線程正在執行 Java 的方法,則程序計數器的值記錄的是正在執行的虛擬機字節碼指令;若執行的是 Native 方法,則值爲空(Undefined)。

此內存區域爲 唯一在Java VM 規範文檔中沒有規定任何 OutOfMemoryError情況的內存區域。

是VM所管理的內存中最大的一塊區域,被所有線程共享,在VM啓動時創建,幾乎所有的對象實例都在該區域分配內存。該區域的內存在邏輯上是連續的,但在物理上不一定是連續的內存空間。(怎麼看都怎麼像操作系統的內存管理機制啊,呵呵。)

方法區

用於存儲已被VM加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼、運行時常量池等數據。


總結

仔細觀察 Java 虛擬機各模塊的作用,再對比操作系統的內存分配原理和機制,發現二者非常相似,這也是“大道三千,殊途同歸”的詮釋啊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章