首頁 >Java >Java基礎 >java什麼時候觸發gc

java什麼時候觸發gc

angryTom
angryTom原創
2019-11-18 09:46:064397瀏覽

java什麼時候觸發gc

java什麼時候觸發gc

#一、記憶體回收策略與常見概念

常見記憶體回收策略可以從以下幾個維度來理解:

1 序列&並行 

序列:單執行緒執行記憶體回收工作。十分簡單,無需考慮同步等問題,但耗時較長,不適合多cpu。

並行:多執行緒並發進行回收工作。適合多CPU,效率高。

2 並發& stop the world 

stop the world:jvm裡的應用執行緒會掛起,只有垃圾回收執行緒在工作進行垃圾清理工作。簡單,無需考慮回收不乾淨等問題。
並發:在垃圾回收的同時,應用也在跑。保證應用程式的回應時間。會存在回收不乾淨需要二次回收的情況。

3 壓縮&非壓縮© 

壓縮:在進行垃圾回收後,會通過滑動,把存活對象滑動到連續的空間裡,清理碎片,保證剩餘的空間是連續的。

非壓縮:保留碎片,不進行壓縮。

copy:將存活物件移到新空間,老空間全部釋放。 (需要較大的記憶體。)

一個垃圾回收演算法,可以從上面幾個維度來考慮和設計,而最終產生具有不同特性適合不同場景的垃圾回收器。

二、JVM的YGC&FGC

YGC :對新生代堆進行GC。頻率比較高,因為大部分物體的存活壽命較短,在新生代裡被回收。性能耗費較小。

FGC :全堆範圍的GC。預設堆空間使用到達80%(可調整)的時候會觸發FGC。以我們生產環境為例,一般比較少會觸發FGC,有時10天或一週左右會有一次。

三、何時會觸發YGC,何時觸發FGC?

#● YGC的時機:

edn空間不足

#● FGC的時機:

1.old空間不足;

2.perm空間不足;

3.顯示呼叫System.gc() ,包括RMI等的定時觸發;

4.YGC時的悲觀策略;

5.dump live的記憶體資訊時(jmap –dump:live)。

對YGC的觸發時機,相當的顯而易見,就是eden空間不足, 這時候就一定會觸發ygc

對於FGC的觸發時機, old空間不足, 和perm的空間不足, 呼叫system.gc()這幾個都比較顯而易見,就是在這種情況下, 通常會觸發GC。

最複雜的是所謂的悲觀策略,它觸發的機制是在首先會計算之前晉升的平均大小,也就是從新生代,通過ygc變成新生代的平均大小,然後如果舊生代剩餘的空間小於晉升大小,那麼就會觸發一次FullGC。 sdk考慮的策略是, 從平均和長遠的情況來看,下次晉升空間不夠的可能性非常大, 與其等到那時在fullGC 不如悲觀的認為下次肯定會觸發FullGC, 直接先執行一次FullGC。而且從實際使用過程中來看, 也達到了較穩定的效果。

php中文網,大量的免費Java入門教學,歡迎線上學習! 

以上是java什麼時候觸發gc的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn