search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

深入理解JVM結構

1.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分配一個獨立的常量池 ,但是運行時常量池中的 字元串常量池是全局共享的 。

    學習Java的同學注意了!!!

    學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:392216227我們一起學Java!



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦