jps -v 是最轻量直接查看 jvm 实际启动参数的方式,显示真实传入的 -x、-d、-xx 参数,但不包含自动推导或未生效参数;jinfo -flags 可查最终生效的 vm 标志(不含 -d),需启用 attach;代码中用 managementfactory.getruntimemxbean().getinputarguments() 最可靠。

用 jps -v 快速看进程实际加载的 JVM 参数
这是最直接、最轻量的方式,适用于所有已启动的 Java 进程。它不依赖外部工具或权限,只要能执行命令就能看到真实传入的启动参数。
运行 jps -v,输出类似:
12345 MyApp.jar -Xms512m -Xmx2g -XX:+UseG1GC -Dfile.encoding=UTF-8
注意:这里显示的是 JVM 实际解析并使用的参数,包括 -X、-D、-XX 类型,但不包含环境变量或配置文件里写的“未被读取”的参数。
- 如果没看到你加的参数(比如
-XX:+PrintGCDetails),说明它根本没传进 JVM 启动命令里 -
jps -v不会显示自动推导参数(如-XX:InitialHeapSize),那是-XX:+PrintCommandLineFlags的职责 - 在容器中使用时,确保你进的是应用容器(不是 init 容器),且
jps在 PATH 中(OpenJDK 通常自带)
用 jinfo -flags <pid></pid> 查看完整 VM 启动标志
jinfo -flags 比 jps -v 更权威,它读取 JVM 内部的 VMArguments 结构,能反映最终生效的全部 -X 和 -XX 参数(不含 -D 系统属性)。
执行 jinfo -flags 12345,输出类似:
VM Flags: -XX:InitialHeapSize=536870912 -XX:MaxHeapSize=2147483648 -XX:+PrintGCDetails -XX:+UseG1GC
关键点:
- 这里能看到 JVM 自动推导的堆大小(
InitialHeapSize/MaxHeapSize),但前提是没显式设置-Xms/-Xmx;一旦显式指定,这些推导项可能不出现,或只回显你写的值 -
jinfo在 JDK 11+ 默认禁用 attach 功能,需启动时加-XX:+StartAttachListener才能用(否则报java.lang.AttachNotSupportedException) - 该命令不能查
-Dkey=value,要查系统属性得用jinfo -sysprops <pid></pid>
用 ManagementFactory.getRuntimeMXBean().getInputArguments() 在代码里确认
如果你能改代码或加临时诊断逻辑,这是最可靠的方式——它返回的就是 JVM 启动时收到的原始参数列表,和 jps -v 基本一致,但绕过了 shell 解析、空格转义等干扰。
示例代码片段:
import java.lang.management.ManagementFactory;
import java.util.List;
public class CheckArgs {
public static void main(String[] args) {
List<string> flags = ManagementFactory.getRuntimeMXBean().getInputArguments();
flags.forEach(System.out::println);
}
}</string>
运行后输出:
-Xms512m -Xmx2g -XX:+UseG1GC -Dapp.env=prod
注意:
- 这个 API 返回的是 JVM “认为自己收到了什么”,不会补全自动推导参数,也不会过滤掉无效参数(比如拼错的
-XX:+UseGCGC也会列出来) - 它不包含环境变量(如
JAVA_OPTS)或配置文件内容,只反映真正传给java命令的那些字符串 - 适合嵌入健康检查端点或启动日志,避免运维人员靠猜
为什么 -XX:+PrintCommandLineFlags 单独用容易误判
这个参数常被当作“万能验证工具”,但它只打印 JVM 自动补充的参数,不显示你手动写的 -Xms、-XX:+UseZGC 等——除非你没写,JVM 才按规则推导并输出。
例如:
- 启动命令是
java -Xmx4g -XX:+PrintCommandLineFlags MyApp,输出里可能没有-XX:MaxHeapSize=4294967296,因为它是你显式写的,不是 JVM 推导的 - 但如果你只写
java -XX:+PrintCommandLineFlags MyApp,JVM 就会按物理内存推导出-XX:MaxHeapSize=...并打印出来 - 所以单靠它判断“参数是否生效”极易得出错误结论:你以为没生效,其实只是它不负责显示
真正要确认全貌,必须组合 -XX:+PrintVMOptions(显式参数) + -XX:+PrintCommandLineFlags(自动参数),或者直接用上面三个运行时手段之一。











