JVM之启动参数

本文详细介绍了JVM的各种启动参数,包括标准参数、系统属性、运行模式、堆内存、非堆内存、垃圾收集器以及分析诊断参数的设置。重点讲解了-Xmx、-Xms、-Xmn、-XX:UseG1GC等参数的作用,以及如何调整以优化Java应用的性能。同时提到了在内存溢出时的Dump文件生成和分析工具的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVM启动参数格式种类

以 - 开头

以 - 开头为标准参数,所有的 JVM 都要实现这些参数,并且向后兼容
例如:-server

以-D开头

-D 设置系统属性
例如:-Dfile.encoding=UTF-8

以 -X 开头

以 -X 开头为非标准参数, 基本都是传给 JVM 的,默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容。 可以使用 java -X 命令来查看当前 JVM 支持的非标准参数

以 –XX:开头

以 –XX:开头为非稳定参数, 专门用于控制 JVM的行为,跟具体的 JVM 实现有关,随时可能会在下个版本取消

  1. -XX:±Flags 形式, ± 是对布尔值进行开关
  2. -XX:key=value 形式, 指定某个选项的值

例如:
-XX:+UseG1GC 表示打开使用G1 GC的开关、 -XX:MaxPermSize=256m 表示设置永久代最大为256M、-XX:-UseAdaptiveSizePolicy表示关闭堆内存自适应(默认打开)

设置当前Java进程的启动参数

添加JVM启动参数

JVM启动参数功能分类

系统属性参数

系统属性参数主要为程序运行提供环境变量和传递一些系统内需要的开关或数值,与操作系统当中配置的环境变量相当,不同的是作用范围,前者作用于当前进程,后者作用于整个系统

通过命令行设置系统属性参数时,当前被设置的进程以设置的值为准,否则以系统中的环境变量值为准
系统属性参数

运行模式参数

  1. -server:设置 JVM 使用 server 模式,特点是启动速度比较慢,但运行时性能和内存管理效率
    很高,适用于生产环境。在具有 64 位能力的 JDK 环境下将默认启用该模式,而忽略 -client 参
    数。
  2. -client :JDK1.7 之前在32位的 x86 机器上的默认值是 -client 选项。设置 JVM 使用 client 模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或者 PC 应用开发和调试

JVM 加载字节码后,可以解释执行,也可以编译成本地代码再执行,所以可以配置 JVM 对字节码的处理模式

  1. -Xint:在解释模式(interpreted mode)下运行,-Xint 标记会强制 JVM 解释执行所有的字节码,这当然会降低运行速度,通常低10倍或更多
  2. -Xcomp:-Xcomp 参数与-Xint 正好相反,JVM 在第一次使用时会把所有的字节码编译成本地机器码,从而带来最大程度的优化。【注意预热,将所有字节码编译成本地代码并缓存,需要较多的时间】
  3. -Xmixed:-Xmixed 是混合模式,将解释模式和编译模式进行混合使用,有 JVM 自己决定,这是 JVM 的默认模式,也是推荐模式。 我们使用 java -version 可以看到 mixed mode 等信息

对于多次使用的热点代码(HotSpot)一般会编译成本地机器码,使用较少的代码一般不会变成本地代码,从而降低了编译成本

堆内存设置参数

堆内和堆外

设置堆内

  • -Xmx, 指定最大的堆内内存。 如 -Xmx4g,这只是限制了 Heap 部分的最大值为4g。这个内存不包括栈内存,也不包括堆外使用的内存
  • -Xms, 指定堆内存空间的初始大小。 如 -Xms4g, 而且指定的内存大小,并不是操作系统实际分配的初始值,而是GC先规划好,用到才分配, 专用服务器上需要保持 –Xms 和 –Xmx 一致,否则应用刚启动可能就有好几个 FullGC且当两者配置不一致时,堆内存扩容可能会导致性能抖动
  • -Xmn, 等价于 -XX:NewSize,设置堆内内存中的年轻代大小,使用 G1 垃圾收集器不应该设置该选项,在其他的某些业务场景下可以设置。官方建议设置为 -Xmx 的 1/2 ~ 1/4

设置非堆

  • -XX:MaxPermSize=size, 这是 JDK1.7 之前使用的,之后被Java8 默认允许的Meta空间所替代,Meta空间使用的是本地内存无大小限制,此参数无效
  • -XX:MaxMetaspaceSize=size, Java8 默认不限制 Meta 空间,一般不允许设置该选项

设置堆外

  • -XX:MaxDirectMemorySize=size,系统可以使用的最大堆外内存,又被称为直接内存,直接使用的是我们系统的内存,这个参数跟 -Dsun.nio.MaxDirectMemorySize 效果相同,不受GC管理
  • -Xss, 设置每个线程栈的字节数,影响栈的深度。 例如 -Xss1m 指定线程栈为1MB,与-XX:ThreadStackSize=1m 等价

GC 设置参数

  • -XX:+UseG1GC:使用 G1 垃圾回收器
  • -XX:+UseConcMarkSweepGC:使用 CMS 垃圾回收器
  • -XX:+UseSerialGC:使用串行垃圾回收器
  • -XX:+UseParallelGC:使用并行垃圾回收器
  • -XX:+UnlockExperimentalVMOptions -XX:+UseZGC // Java 11+才能用
  • -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC // Java 12+ 才能用

分析诊断参数

  • -XX:±HeapDumpOnOutOfMemoryError 当 OutOfMemoryError 产生,即内存溢出(堆内存或持久代) 时,自动 Dump 堆内存

示例用法: java -XX:+HeapDumpOnOutOfMemoryError -Xmx256m ConsumeHeap

  • -XX:HeapDumpPath 与 HeapDumpOnOutOfMemoryError 搭配使用,指定内存溢出时 Dump文件的目录

如果没有指定则默认为启动 Java 程序的工作目录
示例用法: java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/ConsumeHeap
自动 Dump 的 hprof 文件会存储到 /usr/local/ 目录下

  • -XX:OnError 发生致命错误时(fatal error)执行的脚本

例如, 写一个脚本来记录出错时间, 执行一些命令,或者 curl 一下某个在线报警的 url
示例用法:java -XX:OnError=“gdb - %p” MyApp
可以发现有一个 %p 的格式化字符串,表示进程 PID

  • -XX:OnOutOfMemoryError 抛出 OutOfMemoryError 错误时执行的脚本
  • -XX:ErrorFile=filename 致命错误输出到指定的绝对路径或者相对路径下的日志文件
  • -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1506,远程调试

JavaAgent 参数

Agent 是 JVM 中的一项黑科技,可以通过无侵入方式来做很多事情,比如注入 AOP 代码,执行统计等,权限非常大
这里简单介绍一下配置选项,设置 agent 的语法如下:

  • -agentlib:libname[=options] 启用 native 方式的 agent,参考 LD_LIBRARY_PATH 路径
  • -agentpath:pathname[=options] 启用 native 方式的 agent
  • -javaagent:jarpath[=options] 启用外部的agent 库,比如 pinpoint.jar 等
  • -Xnoagent 则是禁用所有 agent

以下示例开启 CPU 使用时间抽样分析:
JAVA_OPTS=“-agentlib:hprof=cpu=samples,file=cpu.samples.log”

常用参数

  • 罗列当前JVM启动时的启动参数 -XX:+PrintCommandLineFlags -version
    在这里插入图片描述
  • 开启压缩指针 -xx:+UseCompressedClassPointers
### 设置JVM启动参数教程 #### 了解默认的JVM选择机制 对于服务器类机器检测以及默认JVM的选择,可以参考官方文档说明[^1]。这有助于理解不同环境下的配置需求。 #### 使用命令行设置JVM参数 当通过命令行启动Java应用程序时,可以在`java`命令后面加上各种选项来指定JVM的行为: ```bash java -Xms512m -Xmx1024m -XX:+UseG1GC MyApplication ``` 上述例子设置了初始堆大小为512MB (`-Xms`) 和最大堆大小为1GB (`-Xmx`) ,并启用了G1垃圾收集器(`-XX:+UseG1GC`)。 #### 修改IDE中的运行配置 如果是在集成开发环境中(如Eclipse或IntelliJ IDEA),则可以通过项目属性或运行配置界面来进行相应的调整。通常会有一个专门用于输入虚拟机参数的地方,在那里可以直接填入所需的参数字符串。 #### 配置文件方式设定 某些应用框架允许将这些参数写入特定位置的配置文件中。例如Tomcat服务端容器支持在`setenv.sh` (Linux) 或 `setenv.bat`(Windows) 文件里定义`JAVA_OPTS`变量从而影响整个实例范围内的所有Web应用: ```shell export JAVA_OPTS="-server -Dfile.encoding=UTF-8" ``` 需要注意的是,针对时间敏感型的应用程序比如高频交易系统,在考虑性能平衡的同时也要谨慎对待垃圾回收(GC)相关参数的选择[^4]。 #### 调试用途的线程转储功能 为了便于调试目的,还可以利用SIGQUIT信号让JVM输出当前正在执行的所有线程的信息到标准错误流上;这对于分析死锁等问题非常有用[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值