標籤:分配 檔案 多線程 reads core thread 參數 client 公式
在介紹三種垃圾收集演算法之前,先說下三種GC的區別:
MinorGC:年輕代空間回收
MajorGC:老年代空間回收
FullGC:整個堆空間回收
垃圾收集演算法分類
1.Serial Collector
JVM在client模式下的預設GC方式.通過JVM配置參數:-XX:+UseSerialGC指定GC使用該收集演算法.我們建立的所有對象都在Eden區建立,如果Eden區空間不足就會觸發MinorGC.不過每次MinorGC之前會查看之前每次晉陞對象大小是否超過了Old區的剩餘空間,如果大於則觸發一次FullGC,如果小於,則要看HandlePromotionFailure參數(-XX:-HandlePromotionFailure)的值,如果為true,僅觸發MinorGC,否則再觸發一次FullGC.
2.Parallel Collector
Parallel GC根據Minor GC和Full GC的不同,分為三種.
1)ParNewGC
通過-XX:UseParNewGC參數指定,它的對象分配和回收策略與Serial Collector類似,只是回收的線程是多線程並行回收.
2)ParallelGC
在Server下預設的GC方式,通過-XX:UseParallelGC參數來強制指定,並行回收的線程數可以通過-XX:ParallelGCThreads來制定,這個值有個計算公式,如果CPU和核心數小於8,線程數和核心數一樣,如果大於8,值為 3+(cpu core*5)/8
3)ParallelOldGC
通過-XX:UseParallelOldGC參數來強制指定,與上面的類似,並行回收的線程數可以通過-XX:ParallelGCThreads來制定,這個值有個計算公式,如果CPU和核心數小於8,線程數和核心數一樣,如果大於8,值為 3+(cpu core*5)/8
3.CMS Collector
可以通過-XX:UseConcMarkSweepGC來指定,並發的線程數預設為4(並行GC線程數+3),也可通過ParallelCMSThreads來指定.CMS GC是基於MinorGC和FullGC之間的一種GC,它的觸發規則是檢查Old區或者Perm區的使用率,當達到一定比例時就觸發CMS GC,觸發時會回收Old區的記憶體空間.觸發CMSGC回收的只是Old區和Perm區的垃圾對象,在回收時和之前的MinorGC,FullGC基本沒有關係.
觸發FullGC的兩種情況:
A.Eden分配失敗,觸發MinorGC後分配到To Space,To Space不夠再分配到Old區,Old區不夠則觸發Full GC.
B.當CMS GC進行中向Old區申請記憶體失敗則會直接觸發Full GC.
4.組合使用者三種GC
5.三種GC的優缺點
6.GC日誌輸出參數
- -verbose:gc,可以輔助輸出一些詳細的GC資訊.
- -XX:+PrintGCDetails,輸出GC的詳細資料.
- -XX:+PrintGCApplicationStoppedTime,輸出GC造成應用程式暫停時間.
- -XX:+PrintGCDateStamps,GC發生的時間資訊.
- -XX:+PrintHeapAtGC,在GC前後輸出堆中各個地區的大小.
- -Xloggc:[file],將GC資訊輸出到單獨的檔案中.
Java記憶體管理3-讀書筆記