理解JVM——JVM的結構


這是理解JVM的第一篇文章,這篇文章主要介紹JVM的總體結構和每一個部分的功能。內容比較少,對於每一個部分詳細的內容,放到后面的文章中,逐步展開。這個系列總結完,應該會對JVM有一個整體且深入的認識了。

JVM運行時數據區

center

這是網上的一個JVM結構的示意圖,還是比較清晰明了的說明了JVM結構。
這篇文章主要介紹運行時數據區,關於類加載器的部分,放到下一篇文章講解。
從這個圖中,可以看出運行時數據區可以細分為5項,分別是:

  • 方法區
  • 虛擬機棧
  • 本地方法區
  • 程序計數器

一般寫程序常見的區域是方法區,虛擬機棧,和堆。但這里,我們按照是否是全局共享的方式來對上述5個區域進行分類。為什么要這樣分類,因為雖然這幾個區域都是屬於運行時數據區,但是這幾個區域的創建時機是不一致的,有的是隨虛擬機啟動而創建的,隨虛擬機銷毀而銷毀。有的是隨線程創建而創建,隨線程銷毀和銷毀。

線程獨享的區域

程序計數器

程序計數器是來指示當前線程正在執行的JVM指令,因此程序計數器是線程獨有的。一個JVM支持多個線程,每一個線程都要自己的程序計數器。
如果線程正在執行的方法是Java方法,則程序計數器保存的是當前線程正在執行的JVM指令,如果正在執行的方法是Native方法,則保存為空(undefined)。

虛擬機棧

虛擬機棧就是常說的棧內存,每一個線程在創建的時候,就會創建一個屬於他的虛擬機棧。
虛擬機棧存儲着棧幀,棧幀中存放的局部變量表,方法部分返回值等,關於棧幀其他內容,后續再說。

本地方法區

本地方法區存儲着native方法的調用狀態,一般會隨着線程創建而針對每一個線程分配。

全局共享的區域

方法區

方法區是可供各個線程共享的內存區域,其主要存儲着所加載的類的結構信息,如名稱、修飾符等、類中的靜態變量、類中定義為final類型的常量、類中的Field信息、類中的方法信息,當開發人員在程序中通過Class對象中的getName、isInterface等方法來獲取信息時,這些數據都來源於方法區域。

運行時常量池

運行時常量池是方法區的一部分,存放着類中固定的常量信息、方法、和field的引用信息。JVM在加載類的時候會為每一個Class分配一個獨立的常量池。

初學Java,聽到的最多的一個內存區域,簡單來說就是存儲着所有類實例和數組對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM