jvm有很多参数可供用户配置 记肯定是不现实,而且不同的版本还有些不一样 只需记住几个比较重要的参数就行

HotSport参数格式分类

  • 标准 -号开头 如 java -version
  • 非标准 -X 开头 特定的版本支持 实验性参数 如 java -Xms
  • 不稳定 -XX开头 后续版本可能不被支持 如 java -XX:+UseSerialGC

-XX:+PrintFlagsInitial 打印所有的默认参数设置

-XX:+PrintFlagsFinal 打印最终值,如果某个默认值被新值覆盖,显示新值 如果是覆盖的值赋值运算符号为:=

java -XX:+PrintFlagsInitial |grep G1

-XX:+PrintCommandLineFlags 打印那些被新值覆盖的项

不区分垃圾回收器常用的共用参数

-Xms128m JVM初始分配堆内存

-Xmx512m JVM最大允许分配的堆内存,按需分配

Serial
-XX:+UseSerialGC

表示年轻代使用 serialGC 老年代使用 serial old 组合

ParNew
-XX:+UseParNewGC

新生代使用 ParNew GC 老年代默认还是Serial Old GC ,如果要使用cms 作为老年代回收器 -XX:+UseConcMarkSweepGC

Parallel Scavenge

ps与parNew的功能区别上 ps支持吞吐量优先策略。

-XX:UseParallelGC

使用 Parallel Scavenge GC + Parallel Old GC 组合策略 是jdk8中的默认组合,单独使用 -XX:UseParallelOldGC 参数 新生代默认也会使用Parallel Scavenge,它两差不多

-XX:ParallelGCThreads 设置年轻代 Parallel Scavenge GC 线程数

-XX:MaxGCPauseMillis 设置垃圾回收器最大停顿时间(即 STW 的时间),单位是毫秒

-XX:+UseAdaptiveSizePolicy 设置Parallel Scavenge GC 具有自适应调节策略。在这种模式下,年轻代的大小、Eden 和 Survivor 的比例、晋升老年代的对象年龄等参数会被自动调整,已达到在堆大小、吞吐量和停顿时间之间的平衡点。

CMS
-XX:+UseConcMarkSweepGC

启用cms垃圾回收 此参数默认组合为 parNew + cms+ serial old 老年版的串行回收是因为cms在回收的时候用户线程内存不足会启用serial old来回收

-XX:CMSInitiatingOccupanyFraction 内存使用率阈值,一旦超过该阈值,便开始回收

-XX:+UseCMSCompactAtFullCollection 指定在执行完 Full GC 后对内存进行压缩整理,以避免内存碎片的产生

-XX:CMSFullGCBeforeCompaction 设置在执行多少次 Full GC 后对内存空间进行压缩整理

-XX:ParallelCMSThread 设置CMS 线程数,默认 (ParallelGCThreads + 3) / 4

G1

G1不分代了 参数就简单很多 一般情况下一个启用参数就够用了,用G1回收一般不建议去指定年轻代的大小 让它自己调整更好。

-XX:+UseG1GC

-XX:InitiatingHeapOccupancyPercent 触发GC周期的Java 堆占用率阈值,超过此值,触发 GC。默认 45

-XX:G1HeapReagionSize 设置region的大小 必须是2的次幂

-XX:MaxGCPauseMillis 期望达到的最大GC 停顿时间 默认是200ms Parallel Scavenge GC中也有类似的参数 JVM会根据这个参数来优先回收有价值的region。

-XX:ParalledGCThread 设置 STW 工作线程数,最大为 8

-XX:ConcGCThreads 设置并发标记线程数,一般设置为 ParalledGCThread 的 1/4 左右

另外就是生产环境一般会设置GC日志和堆信息相关的参数 就是怕万一内存溢出等异常情况能拿到异常时的堆内存以及GC日志来分析问题。

-XX:+PrintGCDetails 打印GC详情

-XX:+PrintGCDateStamps 打印GC时间戳

-XX:+PrintHeapAtGC 打印GC日志的时候输出堆信息

-Xloggc:logs/gc.log 生成GC日志文件

-XX:+UseGCLogFileRotation 开启滚动生成日志

-XX:NumberOfGCLogFiles=5 滚动GC日志文件数,默认0,不滚动

-XX:GCLogFileSize=20M GC文件滚动大小,需开启UseGCLogFileRotation

-XX:+HeapDumpOnOutOfMemoryError 发生内存错误的时候导出堆信息

-XX:HeapDumpPath=logs/1.dump 发生内存错误的时候导出堆信息的路径 一般和HeapDumpOnOutOfMemoryError 配合使用。