关于jvm:JVM启动参数简述

56次阅读

共计 3127 个字符,预计需要花费 8 分钟才能阅读完成。

JVM 启动参数的格局

JVM 的启动参数大略有 1000 多个,能够分成上面几种格局:

  • 以 - 结尾:规范参数。所有 JVM 都要实现这些参数,且向后兼容。如:-server。
  • 以 - D 结尾:设置零碎属性。例如:-Dfile.encoding=UTF-8。
  • 以 - X 结尾:非标准参数。根本都是传递给 JVM 应用的,默认 JVM 实现这些参数的性能,但并不保障所有 JVM 都满足,且不保障向后兼容。例如:-Xmx4g、-Xms2g。能够应用 java - X 命令来查看以后 JVM 反对的非标准参数。
  • 以 -XX 结尾:非稳固参数。专门用于管制 JVM 的行为,跟具体的 JVM 实现无关,随时可能会在下个版本勾销。

    1. -XX:+-Flags 模式:+- 是对布尔值进行开关。例如:-XX:+UseG1GC。
    2. -XX:key=value 模式:指定具体某个选项的值。例如:-XX:NewRatio=2。

JVM 启动参数的类型

依照 JVM 启动参数的特点和作用,能够划分为上面几类:

  1. 零碎属性参数
  2. 运行模式参数
  3. 堆内存设置参数
  4. GC 设置参数
  5. 剖析诊断参数
  6. 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。多个参数之间用空格隔开,如果参数值两头有空格,则用引号括起来。

零碎参数能够分为两种类型:

  1. Java 默认。此类参数由 JVM 虚拟机自动识别并失效,例如,-Dfile.encoding=UTF-8 用于指定文件编码格局。
  2. 用户自定义。例如,-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。

正文完
 0