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 |
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3e651bf65c4cfb182d245bf1fc1a5c99.jpeg)
三、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_ |
-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日志的新生代、老年代名称判断
参考