1

單線程消除了多線程應用程序中涉及的許多複雜問題。單線程應用程序的GC設置

我想知道是否有可以利用單線程應用程序的垃圾收集器配置?

現在我使用的是UseConcMarkSweepGC,incrementalMode GC上的Java運行時環境建設設置:Java的1.6.0_22-B04

+0

不確定它是否真的有所作爲? GC調整非常適用於特定應用程序,並且線程不一定相關。你目前是否有GC問題?什麼問題?你的對象模型是什麼樣的?等等......所有這些東西都比單線程和多線程更重要。 – Taylor 2013-04-09 20:49:19

+0

@泰勒問題:做剖析我看到堆生成了很多字符串。我在考慮如果增加ParallelGCThreads,那麼在CMS的ConcurrentMarkingPhase期間,GC總體上會佔用cpu而不是應用程序,但GC時間可以減少。所以對於單個線程應用程序來說,這可能是個問題吧?在這種思路下,我想有沒有適合單個Threaded應用程序的良好設置 – 2013-04-09 21:53:09

+0

你需要這些字符串嗎?相同的字符串創建?也許可以保留一些弱引用或自動丟棄地圖,如旋轉? – tgkprog 2013-04-10 07:54:31

回答

1

如果JVM是單線程的機器上啓動時,它不會使用複雜的記憶障礙多核所需,從而節省一些CPU週期。

但是JVM本質上是多線程的,即使你只有一個線程還有其他線程支持JVM。

因此回答不是,沒有爲單線程應用程序優化的GC算法。

+0

同意會有JVM線程(至少主要是它的非gui),但大部分操作將在用戶線程中。 a – tgkprog 2013-04-10 07:52:37

+0

@tgkprog GC調優對於每個應用程序都是單獨的,而多線程並不是一個重要因素。如果您尋求GC調整方面的幫助,請發佈您想要實現的GC日誌和狀態目標(例如,最大暫停持續時間) – 2013-04-10 11:39:13

0

GC策略並不取決於您如何對應用程序進行編碼,而是取決於您擁有的硬件。

舉例來說,如果你只有一個CPU,那麼你不應該有兩個原因使CMS:

  • 它會竊取這隻CPU時間與您的應用程序,這樣你將有STW暫停
  • 這意味着開銷併發,這意味着您的應用程序將停止更長時間

在這種情況下,您應該啓用SerialGC(或ParallelGC,在單個CPU計算機上無關緊要)。現在

,如果你有N核心使用,但您的應用程序只使用一個,你可以設置-XX:ConcGCThreads=N-1-XX:ParallelGCThreads=N-1(取決於您使用GC),從而使JVM充分利用你的硬件。

請注意,在設置任何標誌之前,應該使用-Xloggc:gc.log -XX:+PrintGCDetails啓用GC日誌,並在每個新配置之後檢查它是否改善了應用程序響應時間/吞吐量。

來源:http://jvm-options.tech.xebia.fr/