jvm minor gc 爲何比 full gc 快不少

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 須要作全量掃描標記清除,很耗時。

 

參考資料:

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

相關文章
相關標籤/搜索