4 回答

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

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

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

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