06-GC参数汇总

文章目录

  • JVM参数
    • 一、参数说明
    • 二、内存相关
    • 三、GC收集器相关
      • CMS/G1通用参数
      • CMS重要参数
      • G1 重要参数
    • 四、日志输出相关
    • 五、其他
      • 5.1 类加载相关
      • 5.2 TLAB相关
      • 5.3 其他
      • 5.4 小问题
    • 参考

JVM参数

一、参数说明

java启动参数共分为三类

  • 第一类是标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
  • 第二类是非标准参数(-X):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
  • 第三类是非Stable参数(-XX):此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;

二、内存相关

JVM参数名称 参数功能 配置示例 默认值 注意事项
-Xmx 堆内存最大值 -Xmx2g
-Xms 初始堆大小 -Xms2g 1/64 RAM 建议与-Xmx一致避免堆内存扩缩抖动
-Xmn 年轻代内存大小(Eden+2*survivor ) -Xmn256m 整堆=年轻代 + 年老代 +永久代,使用G1收集器不建议设置该值
-Xss 线程栈大小 -Xss256k -Xss1M JDK5.0 后默认1M
-XX:SurvivorRatio 年轻代中Eden与Survivor的比值 -XX:SurvivorRatio=8 默认值为8 Survivor默认占年轻代1/10,Eden默认占8/10
-XX:MetaspaceSize 初始元空间大小 -XX:MetaspaceSize=512M 20M JDK8
-XX:MaxMetaspaceSize=512M 最大元空间大小 -XX:MaxMetaspaceSize=512M 无限制 JDK8
-XX:MaxDirectMemorySize 最大堆外内存大小 -XX:MaxDirectMemorySize=40M 默认和Xmx相等 JDK8
-XX:PermSize 永久代初始大小 -XX:PermSize=256m 1/64 RAM JDK7
-XX:MaxPermSize 永久代最大值 -XX:MaxPermSize=256m 1/4 RAM JDK7

06-GC参数汇总_第1张图片

三、GC收集器相关

  • java -XX:+PrintCommandLineFlags -version : 查看使用什么垃圾收集器
JVM参数名称 参数功能 注意事项
-XX:+UseSerialGC 在新生代和老年代中使用串行器
-XX:+UseParNewGC 在新生代使用并行收集器 新生代并行,老年代串行,使用 -XX:ParallelGCThreads 限制线程数量
-XX:+UseParallelOldGC 老年代使用并行回收收集器
-XX:GCTimeRatio 设置吞吐量大小,(0,100) 假设GCTimeRatio的值为N,那么系统将花费不超过1/(1+n)的时间用于垃圾收集
-XX:UseAdaptiveSizePolicy 打开自适应GC策略 该模式下,新生代的大小,eden和survivior的比例,晋升老年代的年龄等参数会自动调整,以达到在堆大小,吞吐量和停顿时间之间的平衡点

CMS/G1通用参数

JVM参数名称 参数功能 配置示例 默认值 注意事项
-XX:MaxTenuringThreshold=15 GC晋升年龄阈值 -XX:MaxTenuringThreshold=15 缺省默认值为15
-XX:PretenureSizeThreshold=1M 直接在老年代分片的大小阈值 -XX:PretenureSizeThreshold=1M 默认0 默认表示所有对象都先在年轻代(Eden)分片
-XX:+DisableExplicitGC 忽略手动调用GC, System.gc()的调用就会变成一个空调用,不触发GC -XX:+DisableExplicitGC 不建议设置,部分框架(比如Netty)会通过该参数触发FullGC清理堆外内存
-XX:+ParallelRefProcEnabled 开启尽可能并行处理Reference对象 -XX:+ParallelRefProcEnabled 建议开启
-XX:ParallelGCThreads 并行垃圾收集器在 STW 期间GC线程数 -XX:ParallelGCThreads=10 STW 期间GC线程数
-XX:ConcGCThreads 垃圾收集器在应用线程并发执行标记处理(非STW阶段)时的线程数 -XX:ConcGCThreads=10 非STW 期间GC线程数

CMS重要参数

JVM参数名称 参数功能 默认值 注意事项
-XX:+UseConcMarkSweepGC 使用 CMS (并发标记清除)收集器
-XX:CMSInitiatingOccupancyFraction 老年代触发CMS GC的内存使用阈值比率 68 范围1~100需要和UseCMSInitiatingOccupancyOnly一起使用才生效
-XX:UseCMSCompactAtFullCollection CMS清理垃圾后进行一次内存整理 默认开启 过程无法并发,清理了空间碎片但停顿时间会变长
-XX:CMSFullGCsBeforeCompaction 在几次CMS垃圾收集后,触发一次内存整理 默认值为0(推荐) 默认每次CMS过后都进行空间整理
-XX:+UseCMSInitiatingOccupancyOnly 设置CMS 按照CMSInitiatingOccupancyFraction参数阈值触发CMS GC false false时JVM仅在第一次使用设定值,后续则自动调整,建议设置
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses 保证调用System.gc()触发的是一个并发GC,而不是Full GC 建议开启
-XX:+CMSClassUnloadingEnabled CMS GC时触发类卸载 推荐开启
-XX:+CMSScavengeBeforeRemark 在CMS第三阶段(重新标记阶段)之前执行年轻代Young GC,可相当部分的需要标记的对象,减少CMS重新标记的开销(会STW) 建议开启
-XX:ParallelCMSThreads 设定CMS的线程数量
-XX:+CMSParallelRemarkEnabled CMS第三阶段(重新标记阶段)会STW,启用并行标记,可以降低停顿,减少暂停时间,如果还是很长,可以开启CMSScavengeBeforeRemark

G1 重要参数

JVM参数名称 参数功能 默认值 注意事项
-XX:+UseG1GC 使用G1
-XX:MaxGCPauseMillis=200 期望达到的最大GC停顿时间指标 JVM会尽力实现,但不保证达到
-XX:G1HeapRegionSize=2M 设置G1 Region区域大小 当G1因为频繁分配巨型对象失败导致Full GC,可以尝试增大该参数
-XX:InitiatingHeapOccupancyPercent=45 启动并发GC周期时的堆内存占用百分比 45 G1是基于整个堆的使用率触发并发GC周期,而不只是年轻代或老年代的内存的使用比, 0 表示一直执行GC循环
-XX:G1ReservePercent=10 预留内存占堆内存比值 默认10 默认值表示使用10%的堆内存为预留内存,当Survivor区域不足以容纳新晋升对象时会尝试使用预留内存

四、日志输出相关

JVM参数名称 参数功能 注意事项
-Xloggc 指定GC日志文件的输出路径 …/log/gc.log
-verbose:gc 开启输出JVM GC日志 -verbose:gc
-verbose:class 查看类加载信息明细 -verbose:class
-XX:+PrintGC 输出GC日志 -XX:+PrintGC
-XX:+PrintGCDetails 输出GC详细日志 -XX:+PrintGCDetails
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) -XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-XX:+PrintGCApplicationStoppedTime 输出GC造成应用暂停的时间 -XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime 输出GC之间运行了多少时间 -XX:+PrintGCApplicationConcurrentTime
-XX:+HeapDumpOnOutOfMemoryError 表示当JVM发生OOM时,自动生成DUMP文件 未指定目录时,JVM 会创建一个名称为 java_pidPID.hprof 的堆 dump 文件在JVM的工作目录下
-XX:HeapDumpPath=D:/data/log 指定OOM时堆内存转储快照位置 也可以指定文件名称,如果不指定文件名,默认为:java__heapDump.hprof。
-XX:+PrintTenuringDistribution 打印MinorGC 各个Age的对象分布
-XX:+PrintTLAB 打印TLAB(线程本地分配缓存区)空间使用情况
-XX:+PrintClassHistogramBeforeFullGC Full GC前后打印跟踪类视图
-XX:+PrintClassHistogramAfterFullGC Full GC前后打印跟踪类视图

五、其他

5.1 类加载相关

JVM参数名称 参数功能 配置示例 默认值 注意事项
-Xnoclassgc 禁用类的垃圾回收,性能会高一点

5.2 TLAB相关

JVM参数名称 参数功能 注意事项
-XX:+UseTLAB 开启TLAB分配
-XX:+PrintTLAB 打印TLAB相关分配信息
-XX:TLABSize 设置TLAB大小
-XX:+ResizeTLAB 自动调整TLAB大小

5.3 其他

JVM参数名称 参数功能 配置示例 默认值 注意事项
-server 服务器模式

5.4 小问题

  • 如何查看使用哪一种垃圾收集器
java -XX:+PrintCommandLineFlags -version : 查看默认设置收集器类型
-XX:+PrintGCDetails: 通过打印的GC日志的新生代、老年代名称判断
  • 关于GC的选择,参考: 垃圾收集器和内存分配策略

参考

  • [1] CMS GC启动参数优化配置
  • [2] Java 1.8 常用GC参数速查表
  • [3] 深入浅出 JVM GC(4)常用 GC 参数介绍
  • [4] 常用的GC参数
  • [5] GC参数
  • [6] GC参数配置及优化
  • [7] 最全JVM7.8分析和优化

你可能感兴趣的:(JVM)