jvm hotspot的minor major full gc之間的關係,以及哪些情況下會觸發full gc
知乎大佬回答:https://www.zhihu.com/question/41922036
作者:RednaxelaFX
針對HotSpot VM的實現,它裡面的GC其實準確分類只有兩大種:
Partial GC:並不收集整個GC堆的模式
Young GC:只收集young gen的GC
Old GC:只收集old gen的GC。只有CMS的concurrent collection是這個模式
Mixed GC:收集整個young gen以及部分old gen的GC。只有G1有這個模式
Full GC:收集整個堆,包括young gen、old gen、perm gen(如果存在的話)等所有部分的模式。
Major GC通常是跟full GC是等價的,收集整個GC堆。但因為HotSpot VM發展了這麼多年,外界對各種名詞的解讀已經完全混亂了,當有人說“major GC”的時候一定要問清楚他想要指的是上面的full GC還是old GC。
最簡單的分代式GC策略,按HotSpot VM的serial GC的實現來看,觸發條件是:
young GC:當young gen中的eden區分配滿的時候觸發。注意young GC中有部分存活物件會晉升到old gen,所以young GC後old gen的佔用量通常會有所升高。
full GC:當準備要觸發一次young GC時,如果發現統計資料說之前young GC的平均晉升大小比目前old gen剩餘的空間大,則不會觸發young GC而是轉為觸發full GC(因為HotSpot VM的GC裡,除了CMS的concurrent collection之外,其它能收集old gen的GC都會同時收集整個GC堆,包括young gen,所以不需要事先觸發一次單獨的young GC);或者,如果有perm gen的話,要在perm gen分配空間但已經沒有足夠空間時,也要觸發一次full GC;或者System.gc()、heap dump帶GC,預設也是觸發full GC。
HotSpot VM裡其它非併發GC的觸發條件複雜一些,不過大致的原理與上面說的其實一樣。
當然也總有例外。Parallel Scavenge(-XX:+UseParallelGC)框架下,預設是在要觸發full GC前先執行一次young GC,並且兩次GC之間能讓應用程式稍微執行一小下,以期降低full GC的暫停時間(因為young GC會盡量清理了young gen的死物件,減少了full GC的工作量)。控制這個行為的VM引數是-XX:+ScavengeBeforeFullGC。這是HotSpot VM裡的奇葩嗯。可跳傳送門圍觀:JVM full GC的奇怪現象,求解惑? - RednaxelaFX 的回答
併發GC的觸發條件就不太一樣。以CMS GC為例,它主要是定時去檢查old gen的使用量,當使用量超過了觸發比例就會啟動一次CMS GC,對old gen做併發收集。
相關文章
- Minor GC、Major GC以及Full GC的介紹及對比GC
- JVM 系列文章之 Full GC 和 Minor GCJVMGC
- 總結Minor GC、Full GC觸發條件GC
- 觸發JVM進行Full GC的情況及應對策略JVMGC
- JVM垃圾回收——新生代,老年代,永久代,Minor GC,Full GCJVMGC
- [Inside HotSpot] Serial垃圾回收器Full GCIDEHotSpotGC
- Full GC (Metadata GC Threshold)GC
- 每日一個知識點:什麼時候會觸發Full GCGC
- [Inside HotSpot] Serial垃圾回收器 (二) Minor GCIDEHotSpotGC
- Java GC專家系列4:Apache的MaxClients設定及其對Tomcat Full GC的影響JavaGCApacheclientTomcat
- JVM系列之GCJVMGC
- Java虛擬機器6:記憶體溢位和記憶體洩露、並行和併發、Minor GC和Full GC、Client模式和Server模式的區別Java虛擬機記憶體溢位記憶體洩露並行GCclient模式Server
- 一次JVM_OLD區佔用過高、頻繁Full GC的解決過程JVMGC
- 從一次 FULL GC 卡頓談對服務的影響GC
- jstat命令檢視jvm的GC情況 (以Linux為例)JSJVMGCLinux
- JVM之GC趣解JVMGC
- 案例分享-full gc導致k8s pod重啟GCK8S
- 系統執行緩慢,CPU 100%,以及Full GC次數過多問題的排查思路GC
- JVM的GC日誌JVMGC
- 聊一聊 JVM 的 GCJVMGC
- 深入淺出之JVM GC篇JVMGC
- 線上排查:記憶體異常使用導致full gc頻繁記憶體GC
- Java Hotspot G1 GC的一些關鍵技術JavaHotSpotGC
- “阿里架構師”的JVM之GC詳解阿里架構JVMGC
- Android GC,JVM MinorGC/ MajorGC/ FullGC,GC目的AndroidGCJVM
- 《Java效能優化權威指南》的邊邊角(1)——如果你發現日誌中只有Full GCJava優化GC
- 探探Java之 JVM GC與調優JavaJVMGC
- JVM相關 - 深入理解 System.gc()JVMGC
- 深入理解jvm記憶體模型以及gc原理JVM記憶體模型GC
- JVM+GC 面試題JVMGC面試題
- JVM GC日誌解析JVMGC
- jvm系列:Java GC 分析JVMJavaGC
- JVM的四種GC演算法JVMGC演算法
- JVM記憶體GC的騙局JVM記憶體GC
- 聊聊JVM的垃圾回收機制GCJVMGC
- SDK、JDK、JRE 和JVM 之間的關係JDKJVM
- JVM 虛擬機器 GCJVM虛擬機GC
- JVM GC 日誌詳解JVMGC