常见参数列表
-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
// 其他不变。。。。