上一章節主要是Java記憶體分區與記憶體溢出的基礎講解,着篇主要講解一些政策與GC等等,我的知識更新也是按照《深入了解Java虛拟機》來進行的,不足之處多鞭打。
根據記憶體模型,虛拟機棧、本地方法、程式計數器都是線程私有的,在建立之初棧深度等已經确定,方法結束的時候就回收。是以主要讨論的是Java堆與方法區(雖然JDK8沒有方法了)。
Java堆中注意存儲對象,我們關心的結果是對象是否已經“死去”。如下圖JVM是通過是否可達Reachability Analysis分析。
提示:标記兩次就“死亡”。

Java 語言中,GC Root的對象有以下幾種:
虛拟機棧中(幀棧中的本地變量表)引用的對象 方法區(1.8堆)中類靜态屬性引用的對象 方法區(1.8堆)常量引用的對象 方法的native(1.8本地記憶體)引用的對象
引用對象定義:
強引用Strong Reference,主要存在就不會回收對象。
軟引用Soft Reference,一些有非必需的對象。記憶體溢之前進行軟引用回收。
弱引用weekReference是非必需對象,比軟引用更弱。下一次記憶體回收,回收掉弱引用。
虛引用PhantomReference,設定虛引用就是為了得到一個回收通知。
标記需要回收的空間。缺點:是空間不連續,效率也很低下。
将記憶體分為兩塊,每次隻使用其中一塊,清理複制到另一塊記憶體,一般采用這種算法(新生代對象%98“朝生夕死”)。缺點:記憶體變小
記憶體劃分為Eden空間(大80%)、Sruvivor空間2塊(小10%)。模式比例8:1;每次新生代為90%。
所有存活對象向一端移動,清理另一端。
1、記錄一下記憶體偏移量進入OopMap,記錄點不能是全部的全局性引用、執行上下文,應該是一些safepoiont ,這個安全點主要是方法調用、循環跳轉、異常跳轉等。
2、虛拟機采用voluntary suspension 主動式中斷,主動輪詢到安全點,主動挂起進行枚舉Gc root。
3、safe region 安全區域是安全點的擴充,離開安全區域進行枚舉Gc Root。
1、“[GC” 與 “[Full GC”為這次垃圾回收的停頓類型,如果有Full表示發送了“stop-the-world”
2、[GC (System.gc())為調用了System.gc()
3、接下來表示垃圾收集器“[DefNew”=“Default New Generation”----》用的是serial收集器
"[Parnew"="Paraller New Genneration"---》用的是Parnew收集器
“[PsYoungGen”==》用的 是Parallel Scavenge 收集器
3.1 緊接着的”9339K->800K(76288L)“=="GC前記憶體使用容量->GC後記憶體使用容量(該記憶體區域總容量)",
4、方括号後面”9339->808K(251392)“=="GC前Java堆使用容量->GC後Java堆使用容量(Java堆總容量)"
5、”0.0014161“==”該區域GC所占用的時間,機關為秒“
6、"[Times: user=0.00 sys=0.00, real=0.00 secs]"=="使用者消耗的CPU時間,核心消耗的CPU時間,真正從頭到尾的時間"
參 數
描 述
UseSerialGC
虛拟機運作在Client 模式下的預設值,打開此開關後,使用Serial +Serial Old 的收集器組合進行記憶體回收
UseParNewGC
打開此開關後,使用ParNew + Serial Old 的收集器組合進行記憶體回收
UseConcMarkSweepGC
打開此開關後,使用ParNew + CMS + Serial Old 的收集器組合進行記憶體
回收。Serial Old 收集器将作為CMS 收集器出現Concurrent Mode Failure失敗後的後備收集器使用
UseParallelGC
虛拟機運作在Server 模式下的預設值,打開此開關後,使用Parallel
Scavenge + Serial Old(PS MarkSweep)的收集器組合進行記憶體回收
UseParallelOldGC
打開此開關後,使用Parallel Scavenge + Parallel Old 的收集器組合進行記憶體回收
SurvivorRatio
新生代中Eden 區域與Survivor 區域的容量比值, 預設為8, 代表
Eden :Survivor=8∶1
PretenureSizeThreshold
直接晉升到老年代的對象大小,設定這個參數後,大于這個參數的對象
将直接在老年代配置設定
MaxTenuringThreshold
晉升到老年代的對象年齡。每個對象在堅持過一次Minor GC 之後,年
齡就加1,當超過這個參數值時就進入老年代
UseAdaptiveSizePolicy
動态調整Java 堆中各個區域的大小以及進入老年代的年齡
HandlePromotionFailure
是否允許配置設定擔保失敗,即老年代的剩餘空間不足以應付新生代的整個
Eden 和Survivor 區的所有對象都存活的極端情況
ParallelGCThreads
設定并行GC 時進行記憶體回收的線程數
GCTimeRatio
GC 時間占總時間的比率,預設值為99,即允許1% 的GC 時間。僅在
執行個體代碼:
GC資訊:
如果對象在Eden出生到一次Minor GC新生代GC之後仍然存活,并且在Survivor中容納,移到Survivor,這個時候年齡1歲,預設閥值為15歲,就會移動到老年代。
示例代碼:
GC結果 :XX:MaxTenuringThreshold=0
GC結果 :XX:MaxTenuringThreshold=15
相同年齡對象記憶體之和大于Survivor的一半,年齡大于或者等于該年齡的對象,直接進入老年代。
上面代碼蔣年齡限制設定1-15之間,你會發現,對象直接進入老年代。
1.6之後,老年代的連續空間大于新生代的對象的總大小,或者曆次晉升的平均大小,進行Minor GC ,否則full GC。意思就是老年代大于新生代或進行一次Minor GC。
主要講解垃圾回收器的特點和運作原理,驗證了一些虛拟機 配置設定原則。