JVM內存結構小結

JVM按照運行時數據的存儲結構來劃分內存結構,JVM在運行Java程序時,將它們劃分爲幾種不同格式的數據,分別存儲在不同的區域,這些數據統一稱爲運行時數據(Runtime Data)

1.PC寄存器

PC寄存器嚴格來說是一個數據結構,它用於保存當前正常執行的程序的內部地址

同時Java程序是多線程執行的,所以不可能一直按照線性執行下去,當有多個線程交叉執行時,被中斷線程的程序當前執行到哪條語句對應的內存地址必然要保存下來,以便於它被恢復執行時再按照被中斷時的指令地址繼續執行下去。


2.Java棧

Java棧總是和線程關聯在一起的,每當創建一個線程時,JVM就會爲線程創建一個對應的Java棧,在這個Java棧中又會含有多個棧幀(Frames),這些棧幀是與線程中每個方法關聯的,每運行一個方法就會創建一個棧幀,每個棧幀會含有一些內部變量(方法內定義的局部基本類型變量)、操作棧和方法返回值等信息。

非基本類型的變量在JVM棧上僅存在一個指向堆上的指針(引用)。所以,Java中基本類型變量是值傳遞,引用類型變量是引用傳遞。

每當一個方法執行完成時,這個棧幀就會彈出棧幀的元素作爲這個方法的返回值,並清除這個棧幀,Java棧的棧頂的棧幀就是當前正在執行的活動棧,也就是當前正在執行的方法,PC寄存器也會指向這個地址。只有這個活動棧中的本地變量可以被操作棧使用。

由於Java棧是與Java線程對應起來的,這個數據不是線程共享的,所以我們不用關心它的數據一致性問題,也不存在同步鎖的問題。


運行Java程序時可以用-Xss 來指定棧的大小。


3.Java堆

用來存儲Java對象實例和數組值的地方,它是JVM管理Java對象的核心存儲區域。它是我們的應用程序與內存關係最密切的存儲區域。

堆是被所有Java線程所共享的,所以對它的訪問要注意同步問題,方法和對應的屬性都需要保持一致性。

運行Java程序時可以用-Xmx -Xms 來指定堆的大小。


4.方法區

JVM方法區是用來存儲類的結構信息的地方,包括了類的信息(類名、修飾符)、類中的靜態變量、常量池(包括了用final定義的常量等)、構造函數等。

方法區這個存儲區域其實也是Java堆中的一部分,也就是常說的Java堆中的永久區(持久代)。


5.運行時常量池

它也就是前面方法區中提到的常量池,它是方法區的一部分。


6.本地方法棧

爲JVM運行Native方法準備的空間,它和前面介紹的Java棧的作用類似。




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