2

JVM启动参数简述

 2 years ago
source link: https://segmentfault.com/a/1190000041114158
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK