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做併發收集。
相關文章
- 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
- jstat命令檢視jvm的GC情況 (以Linux為例)JSJVMGCLinux
- 一次JVM_OLD區佔用過高、頻繁Full GC的解決過程JVMGC
- 系統執行緩慢,CPU 100%,以及Full GC次數過多問題的排查思路GC
- 案例分享-full gc導致k8s pod重啟GCK8S
- JVM之GC趣解JVMGC
- JVM的GC日誌JVMGC
- 線上排查:記憶體異常使用導致full gc頻繁記憶體GC
- 聊一聊 JVM 的 GCJVMGC
- “阿里架構師”的JVM之GC詳解阿里架構JVMGC
- 探探Java之 JVM GC與調優JavaJVMGC
- JVM相關 - 深入理解 System.gc()JVMGC
- 深入理解jvm記憶體模型以及gc原理JVM記憶體模型GC
- JVM GC日誌解析JVMGC
- JVM記憶體GC的騙局JVM記憶體GC
- 聊聊JVM的垃圾回收機制GCJVMGC
- JVM的四種GC演算法JVMGC演算法
- JVM 系列文章之 GC 演算法淺析JVMGC演算法
- JVM GC 日誌詳解JVMGC
- JVM記憶體-GC策略JVM記憶體GC
- JVM(六)——GC 演算法JVMGC演算法
- JVM 虛擬機器 GCJVM虛擬機GC
- JVM+GC 面試題JVMGC面試題
- 【JVM第八篇--垃圾回收】GC和GC演算法JVMGC演算法
- Buffer Cache以及buffer busy waits/gc相關事件AIGC事件
- MySQL 之 only_full_group_byMySql
- JVM中記憶體和GC的介紹JVM記憶體GC
- 使用 jstat 命令檢視 JVM 的GC資訊JSJVMGC
- JVM調優筆記(一)--Nacos GC引發的服務批次下線問題JVM筆記GC
- Java虛擬機器:Jvm概念和原理詳解以及GC機制的分析Java虛擬機JVMGC
- GC(Allocation Failure)引發的一些JVM知識點梳理GCAIJVM