Java填坑工程--JVM那些事兒之Java內存區域

Java與C++之間有一堵由內存動態分配和垃圾收集技術所圍成的“高牆”,牆外面的人想進去,牆裏面的人想出來。
-----《深入理解Java虛擬機》

一、運行時數據區域

Java虛擬機在執行java程序的過程中會把它所管理的內存劃分爲若干個不同的數據區域,如下圖所示,包括程序計數器、虛擬機棧、本地方法棧、方法區和堆。其中,方法區和堆是線程共享的數據區;虛擬機棧、本地方法棧和程序計數器是線程私有的數據區。

java虛擬機運行時數據區

程序計數器

程序計數器(Program Counter Register)是一塊較小的空間,它可以看作是當前線程所執行的字節碼的行號指示器。各線程之間獨立存儲,互不影響;

此內存區域是唯一沒有規定任何OutOfMemoryError情況的區域。

虛擬機棧

Java虛擬機棧(Java Virtual Machine Stacks)描述的是Java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀(Stack Frame)用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息,每一個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。棧幀中存放着方法的形參,局部變量,動態鏈接,方法出口等。

局部變量表所需的內存空間在編譯期間完成分配,當進入一個方法時,這個方法需要在棧中分配多大的局部變量是完全確定的,在方法運行期間不會改變局部變量表的大小。

棧裏面存放着各種基本數據類型和對象的引用(-Xss)。一個線程調用多個方法,只會有一個棧。棧的缺省大小爲1M

-Xss:調整JAVA虛擬機棧的。

這個區域規定了兩種異常狀況:如果線程請求的棧深度大於虛擬機所允許的棧的深度,將拋出StackOverflowError異常;如果虛擬機可以動態擴展,擴展時無法申請到足夠的內存,將會拋出OutOfMemoryError異常。

本地方法棧

本地方法棧(Native Method Stack)爲虛擬機使用到的Native Method服務,Native Method就是非java代碼的接口。例如,Java與一些底層系統如操作系統或硬件交換信息,native方法提供了一個非常簡潔的接口,需要在java程序中調用此接口時,在本地方法區進行操作。

同虛擬機棧一樣,本地方法棧也會拋出StackOverflowError 和 OutOfMemoryError異常。

Java 堆(Heap)是java內存中最大的一塊,編程中new對象的時候,就是在堆上分配內存區域,也是垃圾收集器的主要照顧對象。

Java堆還可以按如下細分,無論哪個區域,存儲的都是對象實例,進一步劃分的目的是爲了更好的回收內存和分配內存。每個分區詳細瞭解在垃圾收集器部分詳細瞭解。

在這裏插入圖片描述
和堆相關的命令:

-Xms:設置堆的最小值
-Xmx:設置堆的最大值
-Xmn:設置新生代的大小
-XX:NewSize:設置新生代的最小值
-XX:MaxNewSize:設置新生代的最大值

方法區

方法區(Method Area)用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。很多人願意把方法區稱爲“永久代”。

運行時常量池是方法區的一部分,用於存放編譯器生成的各種字面量和符合引用,這部分內容將在類加載後進入方法區的運行時常量池中存放。

和方法區相關命令:

JDK7及之前
-XX:PermSize;
-XX:MaxPermSize;

JDK8及之後(元數據空間)
-XX:MetaspaceSize;
-XX:MaxMetaspaceSize

二、不同JDK版本–內存區域區別

不同的版本JVM的內存劃分會有所差異,我們來了解一下:

JDK1.7及之前 運行時數據區

java虛擬機運行時數據區
JDK1.7及其以後,字符串常量池從方法區中剝離,存放在堆中;

JDK1.8 運行時數據區

在這裏插入圖片描述
1.8以及之後最大的差異,是取消了方法區(PermGen),增加了元空間(Metaspace)的概念。

類的元數據信息轉移到Metaspace的原因是PermGen很難調整。PermGen中類的元數據信息在每次FullGC的時候可能會被收集,但成績很難令人滿意。而且應該爲PermGen分配多大的空間很難確定,因爲PermSize的大小依賴於很多因素,比如JVM加載的class的總數,常量池的大小,方法的大小等。 方法區從運行時數據區挪到了虛擬機本身管理之外,只受制於物理內存的大小,不再受制於虛擬機的管理內存大小。

元數據區與方法區之間最大的區別在於:元數據空間並不在虛擬機中,而是使用本地內存。

知之爲知之,深知深知。

以上便是Java內存區域的自我認知過程,分享給大家~~

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