Java8虛擬機內存模型

1.  Java虛擬機運行時數據區html

在JDK1.8以前,JVM運行時數據區分爲堆、虛擬機棧、本地方法棧、方法區、程序計數器。以下圖所示:數組

虛擬機棧:線程私有,隨線程建立而建立。棧裏面是一個一個「棧幀」,每一個棧幀對應一次方法調用。棧幀中存放了局部變量表(基本數據類型變量和對象引用)、操做數棧、方法出口等信息。當棧調用深度大於JVM所容許的範圍,會拋出StackOverflowError的錯誤。工具

本地方法棧:線程私有,這部分主要與虛擬機用到的Native方法相關,通常狀況下,並不須要關心這部分的內容。spa

程序計數器:也叫PC寄存器,JVM支持多個線程同時運行,每一個線程都有本身的程序計數器。假若當前執行的是 JVM 的方法,則該寄存器中保存當前執行指令的地址;假若執行的是native方法,則PC寄存器中爲空。(PS:線程執行過程當中並不都是一口氣執行完,有可能在一個CPU時鐘週期內沒有執行完,因爲時間片用完了,因此不得不暫停執行,當下一次得到CPU資源時,經過程序計數器就知道該從什麼地方開始執行).net

方法區:方法區存放類的信息(包括類的字節碼,類的結構)、常量、靜態變量等。字符串常量池就是在方法區中。雖然Java虛擬機規範把方法區描述爲堆的一個邏輯部分,可是它卻有一個別名叫作Non-Heap(非堆),目的是與Java堆區分開來。不少人都更願意把方法區稱爲「永久代」(Permanent Generation)。從jdk1.7已經開始準備「去永久代」的規劃,jdk1.7的HotSpot中,已經把本來放在方法區中的靜態變量、字符串常量池等移到堆內存中。線程

運行時常量池(Runtime Constant Pool)是方法區的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池(Constant Pool Table),用於存放編譯期生成的各類字面量和符號引用,這部份內容將在類加載後進入方法區的運行時常量池中存放。htm

:堆中存放的是數組(PS:數組也是對象)和對象。當申請不到空間時會拋出OutOfMemoryError。對象

2.  PermGen(永久代)blog

「方法區」是JVM的規範,而「永久代」是方法區的一種實現,而且只有HotSpot纔有「PermGen space」,而對於其餘類型的虛擬機並無「PermGen space」。接口

在JDK1.8中,HotSpot已經沒有「PermGen space」這個區間了,取而代之是Metaspace(元空間)

3.  Metaspace(元空間)

在JDK1.8中,永久代已經不存在,存儲的類信息、編譯後的代碼數據等已經移動到了MetaSpace(元空間)中,元空間並無處於堆內存上,而是直接佔用的本地內存(NativeMemory)。

元空間的本質和永久代相似,都是對JVM規範中方法區的實現。

不過元空間與永久代之間最大的區別在於:元空間並不在虛擬機中,而是使用本地內存

元空間的大小僅受本地內存限制,能夠經過如下參數來指定元空間大小:

  • -XX:MetaspaceSize,初始空間大小,達到該值就會觸發垃圾收集進行類型卸載,同時GC會對該值進行調整:若是釋放了大量的空間,就適當下降該值;若是釋放了不多的空間,那麼在不超過MaxMetaspaceSize時,適當提升該值
  • -XX:MaxMetaspaceSize,最大空間,默認是沒有限制的
  • -XX:MinMetaspaceFreeRatio,在GC以後,最小的Metaspace剩餘空間容量的百分比,減小爲分配空間所致使的垃圾收集
  • -XX:MaxMetaspaceFreeRatio,在GC以後,最大的Metaspace剩餘空間容量的百分比,減小爲釋放空間所致使的垃圾收集

4.  堆內存劃分

在JDK1.7以及其前期的JDK版本中,堆內存一般被分爲三塊區域:Young Generation、Old Generation、Permanent Generation for VM Matedata

在JDK1.8中把存放元數據中的永久內存從堆內存中移到了本地內存中,JDK1.8中JVM堆內存結構就變成了以下:

Minor GC 和 Full GC的區別?
(1)新生代GC(Minor GC):指發生在新生代的垃圾收動做,由於Java對象大多都具有朝生夕滅的特性,因此Minor GC很是頻繁,通常回收速度也很快
(2)老年代GC(Major GC/Full GC):指發生在老年代的GC,出現了Major GC常常會伴隨至少至少一次的Minor GC(但非絕對,在Parallel Scavenge收集器的收集策略裏就有直接進行Major GC的策略選擇過程),Major GC的速度比Minor GC慢10倍以上。

5.  堆統計信息

6.  其它相關

利用jmap和MAT等工具查看JVM運行時堆內存

7.  參考

https://blog.csdn.net/qq_31337311/article/details/78799262

http://www.javashuo.com/article/p-fdtgegxz-hk.html

https://blog.csdn.net/zwrlj527/article/details/79399715

8. 摘抄自 

https://www.cnblogs.com/cjsblog/p/9850300.html

相關文章
相關標籤/搜索