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。