查找未使用的對象,釋放內存,並壓縮堆,避免內存碎片java
一個java程序,有執行應用程序邏輯的線程和執行GC的線程組。當GC跟蹤對象引用,或在內存中移動對象,它必須確保應用程序線程沒有使用這些對象。 尤爲如此在GC移動對象:在該操做期間對象的內存位置發生變化,所以沒有應用程序線程能夠訪問該對象。全部應用程序線程中止時的暫停叫作 stop-the-world 暫停.算法
全部GC算法在收集年輕代時都會 stop-the-world pauses服務器
隨着對象被移動到老年代,最終它也將填滿,JVM將須要在老年代中找到再也不使用的任何對象並丟棄它們。這是GC算法最大的區別。 這最簡單算法是中止全部應用程序線程,找到未使用的對象並釋放內存,而後壓縮堆。此過程稱爲 full GC,它一般會致使應用程序線程的長暫停。併發
另外一方面,有可能 - 雖然計算複雜 - 找到不使用的對象在應用程序線程運行時; CMS和G1都採用這種方法。由於掃描未使用對象的階段能夠在不中止應用程序線程的狀況下發生,CMS和G1稱爲併發收集器。 他們也是稱爲低暫停(有時是不正確的,沒法暫停)的收集器,由於它們最小化須要中止全部應用程序線程。 併發收集器也有不一樣壓縮老年代的方法。線程
使用CMS或G1收集器時,應用程序一般會更少(和更短暫)停頓。 權衡是應用程序將使用更多的CPU對象
在任何狀況下都須要權衡利弊。在測量單獨響應時間的應用程序(如Java EE服務器)中,請考慮如下幾點:內存
相似地,批處理應用程序中垃圾收集器的選擇由如下指導權衡:io