【问题标题】:GC settings for single threaded application单线程应用程序的 GC 设置
【发布时间】:2013-04-09 19:48:37
【问题描述】:

单线程消除了多线程应用程序中涉及的许多复杂性。

我想知道是否有可以利用单线程应用程序的垃圾收集器配置?

现在我在 Java 运行时环境版本中使用 UseConcMarkSweepGC,incrementalMode GC 设置:Java 1.6.0_22-b04

【问题讨论】:

  • 不确定它是否真的有所作为? GC 调优是非常特定于应用程序的,线程不一定相关。您目前有 GC 问题吗?什么问题?你的对象模型是什么样的?等等......所有这些东西都比单线程与多线程更重要。
  • @Taylor 问题:进行分析我看到堆生成了很多字符串。我在想如果我增加 ParallelGCThreads 那么 GC 在 CMS 的 ConcurrentMarkingPhase 期间总体上会占用 cpu 而不是应用程序,但可以减少 GC 时间。因此,对于单线程应用程序,这可能是一个问题,对吧?在这个思路中,我在想有没有适合单个线程应用程序的好的设置
  • 你需要那些字符串吗?重新创建相同的字符串?也许可以保留一些弱引用或像 whirly 这样的自动丢弃地图?

标签: java memory-management garbage-collection single-threaded


【解决方案1】:

如果JVM在单线程机器上启动,它不会使用多核所需的复杂内存屏障,从而节省一些CPU周期。

但是 JVM 本质上是多线程的,即使你只有一个线程,仍然有其他线程支持 JVM。

所以答案是否定的,没有针对单线程应用程序优化的 GC 算法。

【讨论】:

  • 同意会有 JVM 线程(如果不是 gui,至少是主线程),但大部分操作将在用户线程中。一个
  • @tgkprog GC 调整对于每个应用程序都是单独的,多线程不是一个重要因素。如果您寻求 GC 调优方面的帮助,请发布您想要实现的 GC 日志和状态目标(例如最大暂停持续时间)
【解决方案2】:

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/

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多