jvm minor gc 為什麽比 full gc 快很多
1.minor gc 也需要STW,只不過正常情況下 minor gc STW時間非常短,所以很多人誤以為沒有STW. 這裏的正常情況是,Eden 區產生的新對象大部分被回收了,不需要拷貝。
2.Minor GC 采用的是標記復制算法,具體過程如下圖:
3.為什麽minor gc 比full gc 快?
minor gc 只針對 young 區, full gc 針對所有區,包括young gen、old gen、perm gen.
minor gc 和 full gc 都是從 gc root 開始掃描的.
minor gc root 是指:當前線程stack+ Dirty cards.
full gc root 是指:當前線程stack+ Perm Gen .
full gc 掃描stack 時候會遞歸掃描整個所有對象以及他們引用,是全量掃描。
minor gc 掃描對象時候和full gc 類似,只不過當遍歷的對象是old 區的對象就停止進一步遍歷了,這樣就就跳過了所有old 對象掃描,掃描數量大大減少(只是young 區的),但這樣會產生一個問題:
就是如果young 區的某個對象只被old 應用,那麽該對象就掃描不到成了需要被回收的。這時候Dirty cards 排上了用場,dirty card 裏面記錄了old 區所有引用了young 區的對象,所以掃描
一次dirty card 問題就解決了。
總結一下:就是minor gc 需要掃描的對象很少,掃描後需要復制有效對象也很少,所以速度很快。full gc 需要做全量掃描標記清除,很耗時。
參考資料:
http://blog-archive.griddynamics.com/2011/06/understanding-gc-pauses-in-jvm-hotspots.html?view=sidebar
https://stackoverflow.com/questions/19154607/how-actually-card-table-and-writer-barrier-works
https://plumbr.io/handbook/garbage-collection-in-java/minor-gc-major-gc-full-gc/minor-gc
jvm minor gc 為什麽比 full gc 快很多