Java程序启动参数由JVM进程启动时通过命令行传入,必须置于-jar或主类名之前,否则被当作程序参数;常见参数包括内存(-Xms/-Xmx)、GC(-XX:+UseG1GC)、系统属性(-D)和调试(-XX:+HeapDumpOnOutOfMemoryError)等。

Java程序启动参数不是写在代码里的,而是由JVM进程启动时通过命令行或启动脚本传入的;配错参数可能导致OutOfMemoryError、类加载失败、GC行为异常,甚至JVM直接拒绝启动。
怎么传启动参数给Java程序
核心就是用java命令加参数再跟主类或JAR路径。顺序不能乱:JVM参数必须在-jar或主类名之前,否则会被当成程序参数传给main(String[])方法。
-
java -Xmx512m -XX:+UseG1GC -Dfile.encoding=UTF-8 -jar app.jar✅ 正确:JVM参数在-jar前 -
java -jar app.jar -Xmx512m❌ 错误:-Xmx512m变成程序参数,JVM完全忽略 - IDE(如IntelliJ)里要填在「Run Configuration」→「VM options」栏,不是「Program arguments」
常见必须知道的JVM参数分类
参数分三类:标准(-X开头)、非标准(-XX:开头)、预览/实验性(需显式启用)。生产环境尤其注意-XX:参数的版本兼容性——比如-XX:+UseZGC在JDK 11+才稳定,JDK 8不识别会直接报错退出。
- 内存相关:
-Xms(初始堆)、-Xmx(最大堆)、-XX:MetaspaceSize(元空间初始大小) - GC相关:
-XX:+UseG1GC、-XX:+UseZGC、-XX:MaxGCPauseMillis=200 - 系统属性:
-Duser.timezone=Asia/Shanghai、-Dspring.profiles.active=prod - 调试诊断:
-XX:+HeapDumpOnOutOfMemoryError、-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
Spring Boot应用的特殊处理
Spring Boot打包成fat jar后,仍走标准JVM参数机制,但部分配置(如spring.*)可通过-D或外部application.properties覆盖。注意优先级:命令行-D > application.properties > 默认值。
立即学习“Java免费学习笔记(深入)”;
- 想指定配置文件:
java -Dspring.config.location=file:/opt/conf/application-prod.yml -jar app.jar - 避免踩坑:
-D参数里有空格或特殊字符(如=)必须用引号包裹,例如-Dlogging.level.com.example=DEBUG - 不要混淆:
--server.port=8081是Spring Boot的「程序参数」,不是JVM参数,必须放在-jar之后
最常被忽略的是参数作用域——-Xmx只管堆内存,不影响直接内存(-XX:MaxDirectMemorySize)、线程栈(-Xss)或元空间;线上OOM时,得先看日志里报的是哪块内存溢出,再对症调参。









