1. 程式人生 > >jvm minor gc 為什麽比 full gc 快很多

jvm minor gc 為什麽比 full gc 快很多

root rst 跳過 http 速度 ide perm overflow 問題:

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 快很多