Java-jvm的運行時數據區(RuntimeDataArea)

JVM運行時數據區(RuntimeDataArea)

這就是我們常說的JVM的內存了,它主要分爲五個部分

1、堆(Heap):一個java虛擬機實例中只存在一個堆內存空間,被所有線程共享;堆是運行時數據區域,所有類的實例和數組的內存均從此處分配,堆是在java虛擬機啓動時創建的,在堆內存之外的內存成爲非堆內存。對象的堆內存右垃圾回收器自動管理系統回收,堆的大小可以固定,也可以擴大和縮小,堆的內存不需要是連續空間。

      堆內存分配:

  •  JVM初始分配的堆內存有-Xms指定,默認是物理內存的1/64;
  • JVM最大分配的堆內存由-Xmx指定,默認是物理內存的1/4;
  • 默認空餘堆內存小於40%時,JVM就會增大堆直到-Xmx指定的最大限制;
  • 空餘堆內存大於70%時,JVM會減少堆直到-Xms指定的最小限制;
  • 服務器一般可以設置-Xms、-Xmx相等以避免在每次GC後調整堆的大小;
  • 備註:如果-Xmx不指定或者指定偏小,引用可能會導致java.lang.OutOfMemory錯誤,此錯誤來自JVM,不是Throwable的,無法用try...catch捕捉。

      內存設置參數:

  • -Xms:例:-Xms512m,表示JVM初始分配的堆內存大小爲512m(JVM堆內存最小尺寸,初始分配);
  • -Xmx:例:-Xmx1024m,表示JVM最大允許分配的堆內存大小爲1024m,按需分配,默認我物理內存的1/4;
  • -XX:PermSize:例:-XX:PermSize=512M,JVM初始分配的非堆內存;
  • -XX:MaxPermSize:例:-XX:MaxPermSize=1024M,表示JVM最大允許分配的非堆內存,按需分配;
  • -XX:NewSize:表示JVM啓動時YOUNG(年輕代)的內存大小;
  • -XX:MaxNewSize:表示最大可佔用的YOUNG(年輕代)內存大小;
  • -XX:SurvivorRatio:設置YOUNG代中Survivor空間和Eden空間的比例

2、方法區域(MethodArea):方法區與堆一樣,也是被線程共享的區域,被裝載的class的信息存儲在方法去內存中,存儲了每個類的信息,這些信息包括類的名稱、方法信息、字段信息、靜態變量、常量、類型信息以及編譯器編譯後的代碼等。當虛擬機裝載某個類型時,它使用類裝載器定位相應的class文件,然後讀入這個class文件內容並把它傳輸到虛擬機中。

3、棧(JavaStack):每當啓用一個線程時,JVM就爲他分配一個Java棧,棧是以幀爲單位保存當前線程的運行狀態。某個線程正在執行的方法稱爲當前方法,當前方法使用的棧幀稱爲當前幀,當前方法所屬的類稱爲當前類,當前類的常量池稱爲當前常量池。當線程執行一個方法時,它會跟蹤當前常量池。 
每當線程調用一個Java方法時,JVM就會在該線程對應的棧中壓入一個幀,這個幀自然就成了當前幀。當執行這個方法時,它使用這個幀來存儲參數、局部變量、中間運算結果等等。 
Java棧上的所有數據都是私有的。任何線程都不能訪問另一個線程的棧數據。所以我們不用考慮多線程情況下棧數據訪問同步的情況。虛擬機只會直接對棧執行兩種操作,以幀爲單位的壓棧或出棧,參考:https://blog.csdn.net/weixin_38719347/article/details/80889505

4、程序計數器(ProgramCounter):每一個線程都有它自己的PC寄存器,也是該線程啓動時創建的。PC寄存器的內容總是指向下一條將被執行指令的餓地址,這裏的地址可以是一個本地指針,也可以是在方法區中相對應於該方法起始指令的偏移量。

5、本地方法棧(Nativemethodstack):保存native方法進入區域的地址。

最後附上一張JVM內存模型圖

更多關於java jvm的知識請參考:https://www.cnblogs.com/eastday/p/8124580.html

 

 

 

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