1.minor gc 也須要STW,只不過正常狀況下 minor gc STW時間很是短,因此不少人誤覺得沒有STW. 這裏的正常狀況是,Eden 區產生的新對象大部分被回收了,不須要拷貝。html
2.Minor GC 採用的是標記複製算法,具體過程以下圖:java
3.爲何minor gc 比full gc 快?算法
minor gc 只針對 young 區, full gc 針對全部區,包括young gen、old gen、perm gen.jvm
minor gc 和 full gc 都是從 gc root 開始掃描的.ide
minor gc root 是指:當前線程stack+ Dirty cards.線程
full gc root 是指:當前線程stack+ Perm Gen .htm
full gc 掃描stack 時候會遞歸掃描整個全部對象以及他們引用,是全量掃描。對象
minor gc 掃描對象時候和full gc 相似,只不過當遍歷的對象是old 區的對象就中止進一步遍歷了,這樣就就跳過了全部old 對象掃描,掃描數量大大減小(只是young 區的),但這樣會產生一個問題:blog
就是若是young 區的某個對象只被old 應用,那麼該對象就掃描不到成了須要被回收的。這時候Dirty cards 排上了用場,dirty card 裏面記錄了old 區全部引用了young 區的對象,因此掃描遞歸
一次dirty card 問題就解決了。
總結一下:就是minor gc 須要掃描的對象不多,掃描後須要複製有效對象也不多,因此速度很快。full gc 須要作全量掃描標記清除,很耗時。
參考資料:
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