Jdk1.8 垃圾收集器分類及垃圾收集器選擇思路
根據(jù)運(yùn)行方式Java HotSpot VM 包括三種不同類型的收集器分別是串行收集器、并行收集器和并發(fā)收集器,每種收集器具有不同的性能特征。
串行收集器使用單個(gè)線程來執(zhí)行所有垃圾收集工作,這使得它相對(duì)高效,因?yàn)榫€程之間沒有通信開銷。它最適合于單處理器計(jì)算機(jī),因?yàn)樗鼰o法利用多處理器硬件,盡管它在多處理器上對(duì)于具有較小數(shù)據(jù)集(最大約 100 MB)的應(yīng)用程序非常有用。默認(rèn)情況下,在某些硬件和操作系統(tǒng)配置上會(huì)選擇串行收集器,也可以使用選項(xiàng) 顯式啟用串行收集器。-XX:+UseSerialGC
并行收集器(也稱為吞吐量收集器)并行執(zhí)行次要回收,這可以顯著降低垃圾回收開銷。它適用于在多處理器或多線程硬件上運(yùn)行的具有中型到大型數(shù)據(jù)集的應(yīng)用程序。默認(rèn)情況下,在某些硬件和操作系統(tǒng)配置上會(huì)選擇并行收集器,也可以使用選項(xiàng) 顯式啟用并行收集器。-XX:+UseParallelGC
?Parallel compaction 是一項(xiàng)功能,它使 parallel collector 能夠并行執(zhí)行主要回收。如果沒有并行壓縮,則使用單個(gè)線程執(zhí)行主要集合,這可能會(huì)嚴(yán)重限制可伸縮性。如果指定了該選項(xiàng),則默認(rèn)情況下會(huì)啟用 Parallel compaction。將其關(guān)閉的選項(xiàng)是 。-XX:+UseParallelGC-XX:-UseParallelOldGC
并發(fā)收集器,大多數(shù)并發(fā)收集器并發(fā)執(zhí)行其大部分工作(例如,當(dāng)應(yīng)用程序仍在運(yùn)行時(shí))以保持垃圾回收暫停時(shí)間較短。它專為具有大中型數(shù)據(jù)集的應(yīng)用程序而設(shè)計(jì),在這些數(shù)據(jù)集中,響應(yīng)時(shí)間比整體吞吐量更重要,因?yàn)橛糜谧畲笙薅鹊販p少暫停的技術(shù)會(huì)降低應(yīng)用程序性能。Java HotSpot VM 提供了兩個(gè)主要并發(fā)收集器并發(fā)標(biāo)記清除(CMS)收集器和垃圾優(yōu)先垃圾回收器提供選擇;使用選項(xiàng)啟用 CMS 收集器或啟用 G1 收集器。-XX:+UseConcMarkSweepGC -XX:+UseG1GC、 -XX:+CMSIncrementalMode
垃圾收集器選擇思路
除非應(yīng)用程序具有相當(dāng)嚴(yán)格的暫停時(shí)間要求,否則請(qǐng)首先運(yùn)行應(yīng)用程序并允許 VM 選擇收集器。如有必要,請(qǐng)調(diào)整堆大小以提高性能。如果性能仍未達(dá)到目標(biāo),請(qǐng)使用以下準(zhǔn)則作為選擇垃圾收集器的起點(diǎn)。
如果應(yīng)用程序具有較小的數(shù)據(jù)集(最大約 100 MB),則選擇帶有選項(xiàng) 的 serial collector 。-XX:+UseSerialGC
如果應(yīng)用程序?qū)⒃趩蝹€(gè)處理器上運(yùn)行,并且沒有暫停時(shí)間要求,則讓 VM 選擇收集器,或使用選項(xiàng) .-XX:+UseSerialGC
如果應(yīng)用程序性能峰值是第一要?jiǎng)?wù),并且沒有暫停時(shí)間要求或 1 秒或更長(zhǎng)時(shí)間的暫停是可接受的,則讓 VM 選擇收集器,或使用 選擇并行收集器。-XX:+UseParallelGC
如果響應(yīng)時(shí)間比總體吞吐量更重要,并且垃圾回收暫停時(shí)間必須短于大約 1 秒,則使用或選擇并發(fā)回收器。-XX:+UseConcMarkSweepGC -XX:+UseG1GC
這些準(zhǔn)則僅提供了選擇收集器的起點(diǎn),因?yàn)樾阅苋Q于堆的大小、應(yīng)用程序維護(hù)的實(shí)時(shí)數(shù)據(jù)量以及可用處理器的數(shù)量和速度。暫停時(shí)間對(duì)這些因素特別敏感,因此前面提到的1秒閾值只是近似值:在許多數(shù)據(jù)大小和硬件組合上,并行收集器的暫停時(shí)間將超過 1 秒;相反,對(duì)于某些組合,并發(fā)收集器可能無法將暫停時(shí)間縮短到1秒。
如果建議的收集器未達(dá)到所需的性能,請(qǐng)首先嘗試調(diào)整堆大小和生成大小以滿足所需的目標(biāo)。如果性能仍然不足,請(qǐng)嘗試使用其他收集器:使用并發(fā)收集器來減少暫停時(shí)間,并使用并行收集器來提高多處理器硬件上的整體吞吐量。
以上來自于對(duì) Java 平臺(tái)、標(biāo)準(zhǔn)版 HotSpot 虛擬機(jī)垃圾回收調(diào)優(yōu)指南第五章翻譯摘抄

浙公網(wǎng)安備 33010602011771號(hào)