深入理解JVM結構

jopen 9年前發布 | 15K 次閱讀 JVM Java開發

JVM結構探究----

1.JVM結構示意圖

深入理解JVM結構

2.JVM運行時數據區

1)程序計數器(Program Counter Register)

程序計數器是用于存儲每個線程下一步將執行的JVM指令,如該方法為native的,則程序計數器中不存儲任何信息

2)JVM棧(JVM Stack)

JVM棧是線程私有的,每個線程創建的同時都會創建JVM棧,JVM棧中存放的為 當前線程中局部基本類型的變量 (java中定義的 八種基本類型 :boolean、char、byte、short、int、long、float、double)、部分的返回結果以及Stack Frame,非基本類型的對象在JVM棧上僅存放一個指向堆上的地址

3)堆(heap)

它是JVM用來存儲對象實例以及數組值的區域,可以認為Java中所有通過new創建的對象的內存都在此分配,Heap中的對象的內存需要等待GC進行回收。

(1)堆是JVM中所有線程共享的,因此在其上進行對象內存的分配均需要進行加鎖,這也導致了new對象的開銷是比較大的

(2)Sun Hotspot JVM為了提升對象內存分配的效率,對于所創建的線程都會分配一塊獨立的空間 TLAB (Thread Local Allocation Buffer),其大小由JVM根據運行的情況計算而得,在TLAB上分配對象時不需要加鎖,因此 JVM在給線程的對象分配內存時會盡量的在TLAB上分配,在這種情況下JVM中分配對象內存的性能和C基本是一樣高效的,但如果對象過大的話則仍然是直 接使用堆空間分配

(3)TLAB僅作用于新生代的Eden Space,因此在編寫Java程序時,通常多個小的對象比大的對象分配起來更加高效。

4)方法區(Method Area)

(1)在Sun JDK中這塊區域對應的為PermanetGeneration,又稱為持久代。

(2)方法區域存放了所加載的類的信息(名稱、修飾符等)、類中的靜態變量、類中定義為final類型的常量、類中的Field信息、類中的方法 信息,當開發人員在程序中通過Class對象中的getName、isInterface等方法來獲取信息時,這些數據都來源于方法區域,同時方法區域也 是全局共享的,在一定的條件下它也會被GC,當方法區域需要使用的內存超過其允許的大小時,會拋出OutOfMemory的錯誤信息。

5)本地方法棧(Native Method Stacks)

JVM采用本地方法棧來 支持native方法的執行 ,此區域用于存儲每個native方法調用的狀態。

6)運行時常量池(Runtime Constant Pool)

存放的為類中的固定的常量信息、方法和Field的引用信息等, 其空間從方法區域中分配 。JVM在加載類時會 為每個class分配一個獨立的常量池 ,但是運行時常量池中的 字符串常量池是全局共享的

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!