4 回答

TA貢獻1864條經驗 獲得超6個贊
根據文檔。
串行收集器使用單個線程來執行所有垃圾收集工作,這使得它相對高效,因為線程之間沒有通信開銷。
它最適合單處理器計算機,因為它無法利用多處理器硬件,盡管它在具有小數據集(最多大約 100 MB)的應用程序的多處理器上很有用。
我假設文檔中的處理器=核心(以及你的問題)。雖然文檔說串行收集器對于多核機器來說不是一個好的選擇,但它并沒有說其他收集器對于單核機器來說是不好的。
不過,其他收集器確實傾向于使用多線程,并且您無法在單核環境中獲得這些線程的全部好處。
那么為什么會看到使用G1GC呢?也許沒有別的原因,只是因為它是最新的。然而,如果有原因的話,很可能是 G1 提供的更短的 GC 暫停:
如果響應時間比總體吞吐量更重要,并且垃圾收集暫停必須保持在大約一秒以內,則使用 -XX:+UseG1GC 或 -XX:+UseConcMarkSweepGC 選擇大多數并發收集器。
最好的情況是,在這些情況下,他們使用不同的收集器測量性能并選擇提供最佳結果的收集器。
還要考慮評論中提到的字符串去重 Holger。這是一種特定的內存優化,可能是使用 G1GC 的原因。畢竟,如果您有一個核心,您可能也沒有太多內存可供使用。

TA貢獻1842條經驗 獲得超13個贊
你想優化什么?您是否希望始終能夠極快地回答問題或擁有更好的整體表現?在第一種情況下,您應該以較短的 GC 暫停為目標,在第二種情況下,應以所有 GC 暫停的總和較低為目標。
您還需要考慮其他因素(即應用程序重新啟動的頻率),因此在我看來,最好的方法是數據驅動的方法。使用GC easy或GC 查看器分析每個應用程序的性能并采取相應措施。
請記住,GC 調整并不總是需要的,因此如果您不知道要實現什么目標,您可能會過早地進行優化。
一般來說:
對于暫停時間要求不低并且在資源較少的環境中運行的應用程序使用串行GC
如果您有更多資源或需要快速回答,請使用G1 垃圾收集器(記得測量更改前后的性能)

TA貢獻1802條經驗 獲得超10個贊
作為更一般性的評論,不要假設因為您只有一個核心/CPU,所以使任務成為多線程不會有任何好處。根據所涉及的任務(在本例中為 GC),很可能存在一個線程被阻塞的情況(例如,等待 IO 完成),這允許執行另一部分任務的其他線程使用處理器并完成有用的工作。盡管一次只能運行一個線程,但總體性能得到了提高。

TA貢獻1828條經驗 獲得超6個贊
本線程中未提及的一件重要事情是 G1GC 可以將內存返回(取消提交)給操作系統,因此如果其他應用程序正在服務器上運行,它們可以使用它。
我在從單 vCPU 服務器切換到 2 vCPU 服務器時注意到了這一點,因為 java 默認情況下對單 CPU 使用 SerialGC,對多 CPU 使用 G1GC(至少對于 JDK 11 是這樣)
添加回答
舉報