我們經常會聽到許多垃圾回收的術語,例如:Minor GC、Major GC、Young GC、Old GC、Full GC、Stop-The-World 等。但這些 GC 術語到底指的是什么,它們之間的區別到底是什么?今天我們就來詳細說說。
Minor GC
從年輕代空間回收內存被稱為 Minor GC,有時候也稱之為 Young GC。對於 Minor GC,你需要知道的一些點:
- 當 JVM 無法為一個新的對象分配空間時會觸發 Minor GC,比如當 Eden 區滿了。所以 Eden 區越小,越頻繁執行 Minor GC。
- 當年輕代中的 Eden 區分配滿的時候,年輕代中的部分對象會晉升到老年代,所以 Minor GC 后老年代的占用量通常會有所升高。
- 質疑常規的認知,所有的 Minor GC 都會觸發 Stop-The-World,停止應用程序的線程。對於大部分應用程序,停頓導致的延遲都是可以忽略不計的,因為大部分 Eden 區中的對象都能被認為是垃圾,永遠也不會被復制到 Survivor 區或者老年代空間。如果情況相反,即 Eden 區大部分新生對象不符合 GC 條件(即他們不被垃圾回收器收集),那么 Minor GC 執行時暫停的時間將會長很多(因為他們要JVM要將他們復制到 Survivor 區或老年代)。
Major GC
從老年代空間回收內存被稱為 Major GC,有時候也稱之為 Old GC。
許多 Major GC 是由 Minor GC 觸發的,所以很多情況下將這兩種 GC 分離是不太可能的。
Minor GC 作用於年輕代,Major GC 作用於老年代。 分配對象內存時發現內存不夠,觸發 Minor GC。Minor GC 會將對象移到老年代中,如果此時老年代空間不夠,那么觸發 Major GC。因此才會說,許多 Major GC 是由 Minor GC 引起的。
Full GC
Full GC 是清理整個堆空間 —— 包括年輕代、老年代和永久代(如果有的話)。因此 Full GC 可以說是 Minor GC 和 Major GC 的結合。
當准備要觸發一次 Minor GC 時,如果發現年輕代的剩余空間比以往晉升的空間小,則不會觸發 Minor GC 而是轉為觸發 Full GC。因為JVM此時認為:之前這么大空間的時候已經發生對象晉升了,那現在剩余空間更小了,那么很大概率上也會發生對象晉升。既然如此,那么我就直接幫你把事情給做了吧,直接來一次 Full GC,整理一下老年代和年輕代的空間。
另外,即在永久代分配空間但已經沒有足夠空間時,也會觸發 Full GC。
Stop-The-World
Stop-The-World,中文一般翻譯為全世界暫停,是指在進行垃圾回收時因為標記或清理的需要,必須讓所有執行任務的線程停止執行任務,從而讓垃圾回收線程回收垃圾的時間間隔。
在 Stop-The-World 這段時間里,所有非垃圾回收線程都無法工作,都暫停下來。只有等到垃圾回收線程工作完成才可以繼續工作。可以看出,Stop-The-World 時間的長短將關系到應用程序的響應時間,因此在 GC 過程中,Stop-The-World 的時間是一個非常重要的指標。
參考資料
如果只是看,其實無法真正學會知識的。為了幫助大家更好地學習,我建了一個虛擬機群,專門討論學習 Java 虛擬機方面的內容,每周針對我所發文章進行討論答疑。如果你有興趣,關注「Java技術精選」公眾號,通過右下角菜單「入群交流」加我好友,小助手會拉你入群。
JVM系列目錄
- JVM基礎系列開篇:為什么要學虛擬機?
- JVM基礎系列第1講:Java 語言的前世今生
- JVM基礎系列第2講:Java 虛擬機的歷史
- JVM基礎系列第3講:到底什么是虛擬機?
- JVM基礎系列第4講:從源代碼到機器碼,發生了什么?
- JVM基礎系列第5講:字節碼文件結構
- JVM基礎系列第6講:Java虛擬機內存結構
- JVM基礎系列第7講:JVM類加載機制
- JVM基礎系列第8講:JVM 垃圾回收機制
- JVM基礎系列第9講:JVM垃圾回收器
- JVM基礎系列第10講:垃圾回收的幾種類型
- JVM基礎系列第11講:JVM參數之堆棧空間配置
- JVM基礎系列第12講:JVM參數之查看JVM參數
- JVM基礎系列第13講:JVM參數之追蹤類信息
- JVM基礎系列第14講:JVM參數之GC日志配置
- JVM基礎系列第15講:JDK性能監控命令