Important JVM Options
Heap Memory
-XX:MetaspaceSize
Metaspace 空间初始大小,如果不设置的话,默认是20.79M。这个初始大小是触发首次 Metaspace Full GC 的阈值,例如 -XX:MetaspaceSize=128M
-XX:MaxMetaspaceSize
Metaspace 最大值,默认不限制大小,但是线上环境建议设置,例如 -XX:MaxMetaspaceSize=512M
GC
-Xnoclassgc
表示关闭JVM对类的垃圾回收,缺省情况下,当一个类没有任何活动实例时,JVM 就会从内存中卸装该类,但是这样会使性能下降。如果关闭类垃圾回收,就可以消除由于多次装入和卸装同一个类而造成的开销
-XX:+UseParNewGC
设置年轻代为并行收集
-XX:MaxTenuringThreshold
控制新生代需要经历多少次GC晋升到老年代中的最大阈值,默认值 15
-XX:+CMSParallelRemarkEnabled
CMS收集算法步骤如下:初始标记 -> 并发标记 -> 重新标记 -> 标记清除。 其中 初始标记和重新标记都需要STW,即暂停用户线程。 CMSParallelRemarkEnabled参数可以让重新标记阶段进行并行重新标记,减少暂停时间
-XX:SurvivorRatio
设置 Eden、S0、S1 分配比例,默认值是 8
-XX:SurvivorRatio=5 表示 Eden 占 50%,S0、S1 平分剩余空间
-XX:+UseCompressedOops
In short, don’t turn it on, use a version which has it on by default.
-XX:+DisableExplicitGC
禁止 System.gc()
触发 GC 操作,当没有开启 DisableExplicitGC 这个参数时,你会发现JVM每个小时会执行一次Full GC,这是因为JVM在做分布式GC,为RMI服务的,
可以通过 sun.rmi.dgc.server.gcInterval 这个参数来修改 GC 间隔,默认是一个小时
-Dsun.rmi.dgc.server.gcInterval=7200000
-Dsun.rmi.dgc.client.gcInterval=7200000
使用了 DirectByteBuffer 的不要使用此参数
-XX:ParallelGCThreads
并行 GC 线程的数量,建议和 CPU 数量相当
-XX:+PrintGCDetails
开启 GC 日志
CMS
-XX:+UseConcMarkSweepGC
使用CMS垃圾回收器
-XX:CMSInitiatingOccupancyFraction
CMS垃圾收集器,当老年代达到 N% 时,触发CMS垃圾回收
-XX:+UseCMSInitiatingOccupancyOnly
用设定 CMSInitiatingOccupancyFraction 参数永久有效,否则只在第一次生效
-XX:+UseCMSCompactAtFullCollection
是否在 Full GC 时压缩
-XX:+CMSFullGCsBeforeCompaction
在上一次CMS并发GC执行过后,到底还要再执行多少次 Full GC才会做压缩。默认是0
-XX:+CMSClassUnloadingEnabled
GC也会扫描PermGen,并删除不再使用的类
-XX:+ExplicitGCInvokesConcurrent
使用 CMS 收集器来触发 Full GC
GC LOG
-XX:+UseGCLogFileRotation
开启GC日志滚动记录功能,要求必须设置 -Xloggc参数
-XX:NumberOfGCLogFiles
设置滚动日志文件的个数,必须大于等于1
-XX:GCLogFileSize
设置滚动日志文件的大小,必须大于8k
-XX:+PrintGCDetails
输出详细日志
-XX:+PrintGCTimeStamps
JVM启动的时候的相对时间
-XX:+PrintGCDateStamps
打印具体的时间