jvm 4種常用的垃圾收集器
並行回收和序列回收:
序列回收: JDK1.5前的預設演算法 缺點是隻有一個執行緒,執行垃圾回收時程式停止的時間比較長(單執行緒)
並行回收: 多個執行緒執行垃圾回收適合於吞吐量的系統,回收時系統會停止執行(多執行緒)適用於高併發專案
serial收集器(序列):
序列收集器是最古老,最穩定以及效率高的收集器,可能會產生較長的停頓,只使用一個執行緒去回收。
一個單執行緒的收集器,在進行垃圾收集時候,必須暫停其他所有的工作執行緒直到它收集結束。新生代、老年代都使用序列回收。
特點:CPU利用率最高,停頓時間即使用者等待時間比較長。
適用場景:小型應用
通過JVM引數-XX:+UseSerialGC
ParNew收集器(序列,並行)
ParNew收集器其實就是Serial收集器的多執行緒版本。新生代並行(新生代回收頻率高),老年代序列;新生代複製演算法、老年代標記-壓縮。
引數控制:-XX:+UseParNewGC
parallel收集器(並行)
Parallel Scavenge收集器類似ParNew收集器,Parallel收集器更關注系統的吞吐量。可以通過引數來開啟自適應調節策略,虛擬機器會根據當前系統的執行情況收集效能監控資訊,動態調整這些引數以提供最合適的停頓時間或最大的吞吐量;也可以通過引數控制GC的時間不大於多少毫秒或者比例;新生代複製演算法、老年代標記-壓縮。
特點:停頓時間短,回收效率高,對吞吐量要求高。
適用場景:大型應用,科學計算,大規模資料採集等
通過JVM引數 -XX:+UseParallelGC
cms收集器
CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。
目前很大一部分的Java應用都集中在網際網路站或B/S系統的服務端上,這類應用尤其重視服務的響應速度,希望系統停頓時間最短,以給使用者帶來較好的體驗。
採用“標記-清除”演算法實現,使用多執行緒的演算法去掃描堆,對發現未使用的物件進行回收
特點:響應時間優先,減少垃圾收集停頓時間
適應場景:大型伺服器等。
通過JVM引數 -XX:+UseConcMarkSweepGC設定
g1收集器
在cms上,做改進,用的最多的收集器。
在G1中,堆被劃分成 許多個連續的區域(region)。採用G1演算法進行回收,吸收了CMS收集器特點。
特點:支援很大的堆,高吞吐量
--支援多CPU和垃圾回收執行緒
--在主執行緒暫停的情況下,使用並行收集
--在主執行緒執行的情況下,使用併發收集
實時目標:可配置在N毫秒內最多隻佔用M毫秒的時間進行垃圾回收
通過JVM引數 -XX:+UseG1GC 使用G1垃圾回收器