答案是:查看jvm参数需分阶段——启动前用-xx:+printflagsinitial/final和-xx:+printcommandlineflags查默认值与终态值;启动后用jinfo、jps -v、jcmd vm.flags查运行时参数;仅manageable参数支持jinfo -flag动态修改。

查看和修改 JVM 运行时的默认参数配置,核心在于区分“启动时参数”“运行中参数”和“JVM 内部默认值”。不同场景对应不同命令,不能混用。重点不是记住所有命令,而是清楚每种命令适用的阶段和权限边界。
一、启动前:查默认值与最终生效值
这类操作不依赖进程,适用于验证配置逻辑或排查参数是否被覆盖。
- java -XX:+PrintFlagsInitial -version:列出所有参数的初始默认值(未被任何配置影响的状态),适合了解 JVM 底层基线。
- java -XX:+PrintFlagsFinal -version:显示所有参数的最终值,含 JVM 自动推导或用户显式设置的结果。输出中 = 表示未修改的默认值,:= 表示已被修改(如通过 -Xmx 或 -XX:MaxHeapSize)。
- java -XX:+PrintCommandLineFlags -version:只打印 JVM 启动时自动添加的隐式参数(比如根据物理内存推算出的 -XX:InitialHeapSize 和 -XX:MaxHeapSize),非常实用,尤其在没传 -Xms/-Xmx 时能看清真实生效值。
二、启动后:查正在运行的 Java 进程参数
适用于已上线服务的实时诊断,需先用 jps -l 或 ps -ef | grep java 获取 PID。
-
jinfo -flags
:显示该进程所有 JVM 参数(含用户设置项和部分默认项),最常用、最直观。 -
jinfo -flag
:精准查询单个参数,例如 jinfo -flag MaxHeapSize 12345,返回字节数,可直接换算成 MB 或 GB。 -
jcmd
VM.flags :功能与 jinfo -flags 类似,但输出格式更简洁,且支持部分额外命令(如触发 GC、dump 线程)。 - jps -v:快速列出所有 Java 进程及其启动时显式指定的参数(-Xmx、-XX:+UseG1GC 等),不包含 JVM 自动补全的隐式参数。
三、运行时:有限修改参数
并非所有参数都支持动态修改,仅限标记为 manageable 的参数(可通过 jinfo -flags 输出中的 manageable 字样识别)。
- jinfo -flag +:启用布尔型参数,例如 jinfo -flag +PrintGCDetails 12345。
- jinfo -flag :设置数值型参数,例如 jinfo -flag MaxHeapSize=4294967296 12345(注意单位是字节)。
- 修改后建议立即用 jinfo -flag 验证是否生效,部分参数需配合 GC 触发才体现效果。
四、辅助工具:补充查看堆与系统属性
有些信息不属于“参数”,但对理解运行态至关重要。
-
jinfo -sysprops
:查看 JVM 系统属性(如 java.version、user.dir),常用于确认环境变量或 Spring Boot 配置来源。 -
jmap -heap
:显示当前堆的实际配置(NewSize、MaxHeapSize、GC 算法等),比参数更反映真实内存布局。 -
jstat -gc
:观察 GC 实际行为(YGC、FGC 次数、各区域使用率),参数只是配置,jstat 才是结果。











