如何優化Java垃圾回收機制
阿新 • • 發佈:2019-05-07
我為GC優化歸納了兩個目的:
- 一個是將轉移到老年代的物件數量降到最少
- 另一個是減少Full GC的執行時間
將轉移到老年代的物件數量降到最少
按代的GC機制由Oracle JVM提供,不包括可以在JDK7以及更高版本中使用的G1 GC。換句話說,物件被建立在伊甸園空間,而後轉化到倖存者空間,最終剩餘的物件被送到老年代。某些比較大的物件會在被建立在伊甸園空間後,直接轉移到老年代空間。老年代空間上的GC處理會新生代花費更多的時間。因此,減少被移到老年代物件的資料可以顯著地減少Full GC的頻率。減少被移到老年代空間的物件的數量,可能被誤解為將物件留在新生代。但是,這是不可能的。取而代之,你可以調整新生代空間的大小。
減少Full GC執行時間
Full GC的執行時間比Minor GC要長很多。因此,如果Full GC花費了太多的時間(超過1秒),一些連線的部分可能會發生超時錯誤。
- 如果你試圖通過消減老年代空間來減少Full GC的執行時間,可能會導致OutOfMemoryError 或者 Full GC執行的次數會增加。
- 與之相反,如果你試圖通過增加老年代空間來減少Full GC執行次數,執行時間會增加。
因此,你需要將老年代空間設定為一個“合適