JVM启动参数的格式
JVM的启动参数大概有1000多个,可以分成下面几种格式:
- 以-开头:标准参数。所有JVM都要实现这些参数,且向后兼容。如:-server。
- 以-D开头:设置系统属性。例如:-Dfile.encoding=UTF-8。
- 以-X开头:非标准参数。基本都是传递给JVM使用的,默认JVM实现这些参数的功能,但并不保证所有JVM都满足,且不保证向后兼容。例如:-Xmx4g、-Xms2g。可以使用java -X命令来查看当前JVM支持的非标准参数。
以-XX开头:非稳定参数。专门用于控制JVM的行为,跟具体的JVM实现有关,随时可能会在下个版本取消。
- -XX:+-Flags形式:+-是对布尔值进行开关。例如:-XX:+UseG1GC。
- -XX:key=value形式:指定具体某个选项的值。例如:-XX:NewRatio=2。
JVM启动参数的类型
按照JVM启动参数的特点和作用,可以划分为下面几类:
- 系统属性参数
- 运行模式参数
- 堆内存设置参数
- GC设置参数
- 分析诊断参数
- JavaAgent参数
1、系统属性参数
通过-D开头的JVM启动参数来配置系统属性
,例如:
-Dfile.encoding=UTF-8
-Duser.timezone=GMT+08
-Dmaven.test.skip=true
-Dio.netty.eventLoopThreads=8
-Da=A100
通过JVM启动参数来配置系统属性的标准格式为:-Dargname=argvalue。多个参数之间用空格隔开,如果参数值中间有空格,则用引号括起来。
系统参数可以分为两种类型:
Java 默认
。此类参数由 JVM 虚拟机自动识别并生效,例如,-Dfile.encoding=UTF-8 用于指定文件编码格式。用户自定义
。例如,-Da=A100,程序中可以读取该参数值,执行相关逻辑。
系统属性参数是系统级全局变量,在程序中任何位置都可以访问到。可以通过下面的方式,在程序中获取配置的系统属性:
String a=System.getProperty("a");
也可以通过System.setProperty方法在程序中配置系统属性。例如:System.setProperty("a","A100");
2、运行模式参数
JVM运行模式:
- -server:设置 JVM 使用 server 模式,特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境。
64 位JDK 下默认启用该模式,而忽略 -client 参数
。 - -client :JDK1.7 之前在32位的 x86 机器上的默认值是 -client 选项。设置 JVM 使用 client 模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或者 PC 应用开发和调试。此外,
我们知道 JVM 加载字节码后,可以解释执行,也可以编译成本地代码再执行,所以可以配置 JVM 对字节码的处理模式
:
- -Xint:解释模式(interpreted mode)。会强制 JVM 解释执行所有的字节码,这当然会降低运行速度,通常低10倍或更多。
- -Xcomp:编译模式。-Xcomp 参数与-Xint 正好相反,JVM 在第一次使用时会把所有的字节码编译成本地代码,从而带来最大程度的优化。(实际使用时要注意预热)
- -Xmixed:混合模式,将解释模式和编译模式进行混合使用,这是
JVM 的默认模式,也是推荐模式
。 我们使用 java -version 可以看到 mixed mode 等信息。
3、堆内存设置参数
下面只列出了几个常用的堆内存设置参数:
- -Xmx<size>:指定最大堆内存, 如 -Xmx4g。只是限制堆内存,不包括栈内存,也不包括堆外使用的内存。如果一个4G的机器只部署一个Java程序,那设置-Xmx为3G比较合适。
- -Xms<size>:指定堆内存空间的初始大小。 如 -Xms4g。 而且指定的内存大小,并不是操作系统实际分配的初始值,而是GC先规划好,用到才分配。 专用服务器上需要保持 –Xms 和 –Xmx 一致,否则应用刚启动可能就有好几个 FullGC。当两者配置不一致时,堆内存扩容可能会导致性能抖动。
- -XX:MaxMetaspaceSize=size:Java8 默认为-1,即不限制 Meta 空间,一般不允许设置该选项。
4、GC相关
- -XX:+UseSerialGC:使用串行垃圾回收器(serial + serial old)
- -XX:+UseParallelGC:使用并行垃圾回收器(parallel savenge + parallel old)
- -XX:+UseConcMarkSweepGC:使用ParNew收集器(新生代)+ CMS收集器(老年代)的GC组合
- -XX:+UseG1GC:使用 G1 垃圾回收器
- -XX:+UnlockExperimentalVMOptions -XX:+UseZGC :JDK11上要先解锁才能使用ZGC。
- -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC:JDK12上要先解锁才能使用ShenandoahGC。
5、分析诊断参数
- -XX:+-HeapDumpOnOutOfMemoryError :当 OutOfMemoryError 产生,即
内存溢出时,自动 Dump 堆内存
。示例:java -XX:+HeapDumpOnOutOfMemoryError -Xmx256m JavaApp。 - -XX:HeapDumpPath:与 HeapDumpOnOutOfMemoryError 搭配使用,指定内存溢出时 Dump 文件的目录。如果没有指定则默认为启动 Java 程序的工作目录。示例:java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/ JavaApp。
- -XX:OnError:发生致命错误时(fatal error)执行的脚本。例如, 写一个脚本来记录出错时间, 执行一些命令,或者 curl 一下某个在线报警的 url。
- -XX:OnOutOfMemoryError:抛出 OutOfMemoryError 错误时执行的脚本。
- -XX:ErrorFile=filename:致命错误的日志文件名,绝对路径或者相对路径。
- 开启
远程调试
:需要多个参数,下面示例表示暴露8888为远程debug端口:java -Djavax.net.debug=ssl -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888 -jar springboot-1.0.jar。
6、JavaAgent参数
JavaAgent是JVM里面的一项黑科技,它的原理是额外提供一个Agent库,配置在我们的命令行启动参数里面 ,JVM启动了以后,在加载所有的类文件之前,会先加载Agent库,可以用Agent内置的一些逻辑,对我们加载的所有类文件进行一个预处理,可以对它们进行增强或者转换。那么就可以在不改动原先的jar包和class文件的情况下,对原有的所有的类,在运行期加载的方式做一个增强。所以这是一种非侵入式的方式,来实现对现有程序功能的增强
。
设置 agent 的语法如下:
- -agentlib:libname[=options]:启用 native 方式的 agent。
- -agentpath:pathname[=options]:启用 native 方式的 agent。
- -javaagent:jarpath[=options]:启用外部的 agent 库,比如 pinpoint.jar 等等。
- -Xnoagent 则是禁用所有 agent。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。