JVM加載流程和運行時數據區以下圖所示:java
方法區
用於存儲已經被加載的類信息、常量、靜態變量、編譯後的代碼以及 運行時常量池
等。算法
堆
主要存放一些數據,好比對象實例、數組等。數組
堆內存會劃分爲年輕代和老年代,年輕代又會分爲Eden和Servivor區,Survivor也會分爲FromPlace和ToPlace。安全
虛擬機棧
描述的是JVAV方法執行的內存模型。每一個方法被執行的時候同時都會建立一個棧幀
,用於存儲局部變量表
,操做數棧
,動態連接
,方法出口
等信息,不存在垃圾回收問題,只要線程結束,該棧就釋放。性能
和棧做用相似,可是本地方法棧執行的是native方法。線程
程序計數器
能夠看作是當前線程所執行的行號指示器。3d
這些對象不會被GC所回收,可是卻一直佔用內存。code
當一個類收到加載請求時,它不會先本身去嘗試加載,而是委派給父類去完成。cdn
做用:爲了解決類載入過程當中的安全性問題。對象
java.lang.Object
的類,想借此欺騙JVM。如今他要使用自定義 ClassLoader
來加載本身編寫的 java.lang.Object
類。BootstrapClassLoader
的路徑下找到 java.lang.Object
類,並載入它。YGC和FGC表示什麼?
咱們經常使用的垃圾回收器通常採用分代收集算法。
算法分爲標記和清除兩個階段,首先標記出全部須要回收的對象,在標記完成後統一回收全部標記的對象。
首先先標記須要回收的對象,而後讓全部存活的對象都向一端移動,最終清理掉端邊界之外的內存。
將可用內存劃分爲大小相等的兩塊,每次用掉其中的一塊。當着一塊的內存用完了,就將還存活的對象複製到另一塊上面,而後再把已使用的內存空間一次清理掉。
將JAVA堆分爲新生代和老年代,這樣就能夠根據各個年代的特色採用最適合的收集算法。
CMS收集器
,CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間爲目標的收集器。標記-清除
算法,會致使大量的空間碎片的產生。G1(Garbage-First)是一款面向服務端的垃圾收集器,主要針對配備多顆處理器及大容量內存的機器,具有極高機率知足GC停頓的同時,還具有高吞吐量性能特徵。
Serial
收集器,是最古老,最穩定以及效率高的串行收集器。