參考:堆外內存使用分析html
Java何時用堆外內存java
摘自:Full GC有關問題學習分析(轉載)併發
GC,尤爲是Full GC,每次都會致使JVM暫停工做,處理垃圾回收任務,短期內沒法響應用戶請求,大量的Full GC會致使系統響應速度下降,並且引來OOM的巨大風險。
jvm
當一個對象到GC Roots沒有任何引用鏈相連時,則證實對象須要被回收.
性能
Java可做爲GC Roots的對象包括下面幾種:學習
虛擬機棧(棧楨中的本地變量表)中的引用的對象 spa
方法區中類靜態屬性引用的對象.net
方法區中常量引用的對象線程
本地方法棧中JNI引用的對象
回收算法相關內容轉自https://youzhixueyuan.com/detailed-explanation-of-jvm-g1.html
過程:
優勢: 併發,低停頓
缺點:
特色:
1) G1堆內存結構
- 堆內存會被切分紅爲不少個固定大小區域(Region),每一個是連續範圍的虛擬內存。
- 堆內存中一個區域(Region)的大小能夠經過-XX:G1HeapRegionSize參數指定,大小區間最小1M、最大32M,總之是2的冪次方。
- 默認把堆內存按照2048份均分。
2) G1堆內存分配
- 每一個Region被標記了E、S、O和H,這些區域在邏輯上被映射爲Eden,Survivor和老年代。
- 存活的對象從一個區域轉移(即複製或移動)到另外一個區域。區域被設計爲並行收集垃圾,可能會暫停全部應用線程。
- 如上圖所示,區域能夠分配到Eden,survivor和老年代。此外,還有第四種類型,被稱爲巨型區域(Humongous Region)。Humongous區域是爲了那些存儲超過50%標準region大小的對象而設計的,它用來專門存放巨型對象。若是一個H區裝不下一個巨型對象,那麼G1會尋找連續的H分區來存儲。爲了能找到連續的H區,有時候不得不啓動Full GC。
1)G1執行的第一階段:初始標記(Initial Marking )
這個階段是STW(Stop the World )的,全部應用線程會被暫停,標記出從GC Root開始直接可達的對象。
2)G1執行的第二階段:併發標記
從GC Roots開始對堆中對象進行可達性分析,找出存活對象,耗時較長,這一階段耗時較長但能與用戶線程併發運行。
3)最終標記(標記那些在併發標記階段發生變化的對象,將被回收)
最終標記階段須要吧Remembered Set Logs的數據合併到Remembered Set中,這階段須要停頓線程,但可並行執行。
4)篩選回收(首先對各個Regin的回收價值和成本進行排序,根據用戶所期待的GC停頓時間指定回收計劃,回收一部分Region)
這一過程一樣是須要停頓線程的
最後,G1中提供了兩種模式垃圾回收模式,Young GC和Mixed GC,兩種都是Stop The World(STW)的。
1. YoungGC年輕代收集
在分配通常對象(非巨型對象)時,當全部eden region使用達到最大閥值而且沒法申請足夠內存時,會觸發一次YoungGC。每次younggc會回收全部Eden以及Survivor區,而且將存活對象複製到Old區以及另外一部分的Survivor區。
YoungGC的回收過程以下:
- 根掃描,跟CMS相似,Stop the world,掃描GC Roots對象。
- 處理Dirty card,更新RSet.
- 掃描RSet,掃描RSet中全部old區對掃描到的young區或者survivor去的引用。
- 拷貝掃描出的存活的對象到survivor2/old區
- 處理引用隊列,軟引用,弱引用,虛引用
2. mixed gc
當愈來愈多的對象晉升到老年代old region時,爲了不堆內存被耗盡,虛擬機會觸發一個混合的垃圾收集器,即mixed gc,該算法並非一個old gc,除了回收整個young region,還會回收一部分的old region,這裏須要注意:是一部分老年代,而不是所有老年代,能夠選擇哪些old region進行收集,從而能夠對垃圾回收的耗時時間進行控制。
G1沒有fullGC概念,須要fullGC時,調用serialOldGC進行全堆掃描(包括eden、survivor、o、perm)
一、解析(resolve)就是將一個符號引用轉換成直接引用的一個過程。
當一個java文件編譯成class以後,方法都是以符號引用的方式保存。而在加載類時,部分符合條件的符號引用會被轉換成「直接引用」,這個過程咱們稱之爲「解析(Resolution)」。