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規範中方法區的實現。
不過元空間與永久代之間最大的區別在於:元空間並不在虛擬機中,而是使用本地內存。
元空間的大小僅受本地內存限制,能夠經過如下參數來指定元空間大小:
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. 其它相關
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. 摘抄自