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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM