JVM调优-CMS常见参数、线程计算与推荐配置

常见参数列表

-XX:+UseConcMarkSweepGC

打开 CMS GC 收集器。JVM 在 1.8 之前默认使用的是 Parallel GC,9 以后使用 G1 GC。

-XX:UseParNewGC

当使用 CMS 收集器时,默认年轻代使用多线程并行执行垃圾回收(UseConcMarkSweepGC 开启后则默认开启)。

-XX:+CMSParallelRemarkEnabled

采用并行标记方式降低停顿(默认开启)。

-XX:+CMSConcurrentMTEnabled

被启用时,并发的 CMS 阶段将以多线程执行(因此,多个 GC 线程会与所有的应用程序线程并行工作)。(默认开启)

-XX:ConcGCThreads

定义并发 CMS 过程运行时的线程数。

-XX:ParallelGCThreads

定义 CMS 过程并行收集的线程数。

-XX:CMSInitiatingOccupancyFraction

该值代表老年代堆空间的使用率,默认值为 68。当老年代使用率达到此值之后,并行收集器便开始进行垃圾收集,该参数需要配合 UseCMSInitiatingOccupancyOnly 一起使用,单独设置无效。

-XX:+UseCMSInitiatingOccupancyOnly

该参数启用后,参数 CMSInitiatingOccupancyFraction 才会生效。默认关闭。

-XX:+CMSClassUnloadingEnabled

相对于并行收集器,CMS 收集器默认不会对永久代进行垃圾回收。如果希望对永久代进行垃圾回收,可用设置 - XX:+CMSClassUnloadingEnabled。默认关闭。

-XX:+CMSIncrementalMode

开启 CMS 收集器的增量模式。增量模式使得回收过程更长,但是暂停时间往往更短。默认关闭。

-XX:CMSFullGCsBeforeCompaction

设置在执行多少次 Full GC 后对内存空间进行压缩整理,默认值 0。

-XX:+CMSScavengeBeforeRemark

在 cms gc remark 之前做一次 ygc,减少 gc roots 扫描的对象数,从而提高 remark 的效率,默认关闭。

-XX:+ExplicitGCInvokesConcurrent

该参数启用后 JVM 无论什么时候调用系统 GC,都执行 CMS GC,而不是 Full GC。

-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses

该参数保证当有系统 GC 调用时,永久代也被包括进 CMS 垃圾回收的范围内。

-XX:+DisableExplicitGC

该参数将使 JVM 完全忽略系统的 GC 调用(不管使用的收集器是什么类型)。

-XX:+UseCompressedOops

这个参数用于对类对象数据进行压缩处理,提高内存利用率。(默认开启)

-XX:MaxGCPauseMillis=200

这个参数用于设置 GC 暂停等待时间,单位为毫秒,不要设置过低。

CMS 的线程数计算公式

区分 young 区的 parnew gc 线程数和 old 区的 cms 线程数,分别为以下两参数:

  • -XX:ParallelGCThreads=m // STW 暂停时使用的 GC 线程数,一般用满 CPU
  • -XX:ConcGCThreads=n // GC 线程和业务线程并发执行时使用的 GC 线程数,一般较小

ParallelGCThreads

其中 ParallelGCThreads 参数的默认值是:

  • CPU 核心数 <= 8,则为 ParallelGCThreads=CPU 核心数,比如我的那个旧电脑是 4
  • CPU 核心数 > 8,则为 ParallelGCThreads = CPU 核心数 * 5/8 + 3 向下取整
  • 16 核的情况下,ParallelGCThreads = 13
  • 32 核的情况下,ParallelGCThreads = 23
  • 64 核的情况下,ParallelGCThreads = 43
  • 72 核的情况下,ParallelGCThreads = 48

ConcGCThreads

ConcGCThreads 的默认值则为:

ConcGCThreads = (ParallelGCThreads + 3)/4 向下去整。

  • ParallelGCThreads = 1~4 时,ConcGCThreads = 1
  • ParallelGCThreads = 5~8 时,ConcGCThreads = 2
  • ParallelGCThreads = 13~16 时,ConcGCThreads = 4

推荐配置

8C16G 下的参数配置

综上所述,8C16G 下,推荐使用如下的参数设置:

-Xmx12g -Xms12g
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=2
-XX:+UseConcMarkSweepGC
-XX:+CMSClassUnloadingEnabled
-XX:+CMSIncrementalMode
-XX:+CMSScavengeBeforeRemark
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:CMSFullGCsBeforeCompaction=5
-XX:MaxGCPauseMillis=100  // 按业务情况来定
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps

4C8G 下的参数配置

如果是 4C8G 配置下,推荐

-Xmx6g -Xms6g
-XX:ParallelGCThreads=4
-XX:ConcGCThreads=1
// 其他不变。。。。

2C4G 下的参数配置

如果是 2C4G 配置下,推荐

-Xmx3g -Xms3g
-XX:ParallelGCThreads=2
-XX:ConcGCThreads=1
// 其他不变。。。。

猜你喜欢

转载自blog.csdn.net/agonie201218/article/details/131842634
今日推荐