目录
参数分类
JVM标准参数:- 开头;例如:-server
JVM非标准参数:-X开头;不一定所有JVM都支持,不保证向后兼容性;用 java -X 命令来查
看当前 JVM 支持的非标准参数。例如:-Xmixed
设置系统属性的参数:-D开头;例如:-Dfile.encoding=UTF-8
非稳定参数:–XX开头,和JVM版本相关,可能会在下个版本取消。
-XX:+-booleanFlag 例如:-XX:+UseG1GC
-XX:key=value 例如:-XX:MaxPermSize=512M
系统属性参数
例如:-Dfile.encoding=UTF-8
运行模式参数
-server:JVM 使用 server 模式,启动速度比较慢,运行时性能和内存管理效率很高,适用
于生产环境。64位的JDK默认启用该模式,忽略 -client 参数。
-client:JDK7 之前在32位的 x86 机器上的默认值是 -client 选项。设置 JVM 使用 client 模
式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或者
PC 应用开发和调试。
HotSpot版本的JDK内置了多个即时编译器:C1、C2 和 Graal,便于在编译时间和生成代码
的执行效率之间进行取舍。
C1又叫做Client编译器,面向的是对启动性能有要求的客户端 GUI 程序,采用的优化手段相
对简单,因此编译时间较短。
C2又叫做Server编译器,面向的是对峰值性能有要求的服务器端程序,采用的优化手段相对
复杂,因此编译时间较长,但同时生成代码的执行效率较高。
从 Java 7 开始,HotSpot 默认采用分层编译的方式:热点方法首先会被 C1 编译,而后热点
方法中的热点会进一步被 C2 编译。即时编译是放在额外的编译线程中进行的,不干扰应用的正常
运行。
JDK 会根据 CPU 的数量设置编译线程的数目,并且按 1:2 的比例配置给 C1 及 C2 编译器。
在计算资源充足的情况下,字节码的解释执行和即时编译可同时进行。编译完成后的机器码会在下
次调用该方法时启用,以替换原本的解释执行。
-Xint:设置字节码在解释模式下运行;启动速度快,执行速度慢;
-Xcomp:设置字节码在编译模式下运行;启动速度慢,执行速度快;
-Xmixed:设置字节码在混合模式下运行;热点代码使用编译模式,常规代码使用解释模式;
堆内存设置参数

-Xmx:指定最大堆内存。 如 -Xmx4g。
-Xms: 指定堆内存空间的初始大小。 如 -Xms4g。
指定的内存大小,并不是操作系统实际分配的初始值,而是GC先规划好,用到才分配。
专用服务器上需要保持 –Xms 和 –Xmx 一致,否则应用刚启动可能就有好几个 FullGC。当两
者配置不一致时,堆内存扩容可能会导致性能抖动。
-Xmn:青年带大小; 等价于 -XX:NewSize,使用 G1 垃圾收集器 不应该 设置该选项,在其
他的某些业务场景下可以设置。官方建议设置为 -Xmx 的 1/2 ~1/4。
-XX:MaxPermSize=size, 持久代大小;
JDK8之前,方法区由永久代实现,存放已被加载的类信息、常量、静态变量;永久代和堆使
用的物理内存是连续的,虽然逻辑上是隔离的,但是永久代和老年代是一起做垃圾回收的,只要有
一边满了,就会触发永久代和老年代的垃圾收集。
JDK8之后使用元数据区替代了永久代,此参数无效。
-Xss:设置每个线程栈的大小,影响栈的深度。 例如 -Xss1m 指定线程栈为1MB,与-
XX:ThreadStackSize=1m 等价;
GC 设置参数
-XX:+UseG1GC:使用 G1 垃圾回收器
-XX:+UseConcMarkSweepGC:使用 CMS 垃圾回收器
-XX:+UseSerialGC:使用串行垃圾回收器
-XX:+UseParallelGC:使用并行垃圾回收器
// Java 11+
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC:解锁实验参数,使用ZGC;
// Java 12+
-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC:解锁实验参数,使用
ShenandoahGC;
分析诊断参数
-XX:+-HeapDumpOnOutOfMemoryError: 堆内存溢出时,自动Dump文件。
-XX:HeapDumpPath: 指定dump文件的目录,和HeapDumpOnOutOfMemoryError配合使用;
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9090,远程调试(jdk1.8及之后)。
debug:通知JVM工作在debug模式下;
runjdwp:通知JVM使jdwp用(java debug wire protocol)来运行调试环境;
transport:监听Socket端口连接方式
suspend:suspend=y表示启动时就进入调试模式,一般用于被动连接;