-xx:+printflagsfinal 显示 jvm 启动后最终生效的所有参数值,含自动推导项,格式为 {type} {name} = {value} {kind},其中 kind 为 product/manageable(可配)、default(未显式修改)、vm_default(硬编码不可改);需配合 -version 使用,输出数值单位为字节,须用 grep 过滤,且仅 jdk 7u40+ 支持。

用 -XX:+PrintFlagsFinal 看默认 JVM 参数值
这个参数能列出所有 JVM 启动后最终生效的参数(包括被自动推导、隐式设置的),但输出极长,且默认不带单位、不区分用户显式设置和 JVM 自动设定的值。
实操建议:
- 加
-XX:+PrintFlagsFinal一定要配合-version或一个最小化类(比如java -XX:+PrintFlagsFinal -version),否则会卡在等待主类; - 输出里每行格式是
{type} {name} = {value} {kind},其中{kind}是关键:如果显示product或manageable,说明是可配置项;default表示未被显式修改过;vm_default是 JVM 内部硬编码值,改不了; - 别直接人眼扫——用
grep过滤,比如查堆内存:java -XX:+PrintFlagsFinal -version | grep -i "heapsize"; - 注意数值单位:整数默认是字节,
K/M/G后缀只在命令行参数里有效,PrintFlagsFinal输出里不会自动换算,MaxHeapSize显示的是字节数(比如4294967296就是 4G)。-XX:+PrintFlagsInitial和PrintFlagsFinal的区别在哪前者只展示 JVM 初始化时“读到”的参数值(还没做任何自适应调整),后者才是真实生效的终态值。两者差异往往出现在内存相关参数上。
常见错误现象:- 用
PrintFlagsInitial查InitialHeapSize,发现它等于0,误以为没设初始堆——其实 JVM 会根据物理内存自动计算,这个值在PrintFlagsFinal里才变成具体数字; - 某些平台(如容器环境)下,
PrintFlagsInitial显示的MaxRAMPercentage是默认 25.0,但PrintFlagsFinal里MaxHeapSize可能远低于预期——说明容器内存限制没被正确识别,得加-XX:+UseContainerSupport; -
PrintFlagsInitial不显示 CMS、G1 等 GC 相关的派生参数(比如G1HeapRegionSize),它们只在PrintFlagsFinal中出现。为什么加了
-XX:+PrintFlagsFinal却没输出或报错最常见原因是 JVM 版本不支持,或者参数拼写/大小写错了。
使用场景与兼容性影响:- OpenJDK 7u40+ 和 Oracle JDK 7u40+ 才支持,JDK 6 及更早版本会直接报错
Unrecognized VM option; - 注意是
PrintFlagsFinal,不是PrintFlagFinal(少个 s)或PrintFlagsFinals(多 s),大小写也必须全小写; - 某些精简版 JRE(如部分嵌入式或 Android ART)完全不支持这些诊断参数;
- 如果用了
-Xloggc或其他日志参数,可能干扰输出流,建议单独测试,不要混用调试类参数。想快速定位某个参数是否生效,别只靠肉眼扫
人工翻几千行输出效率极低,而且容易漏掉被覆盖或重置的值。
实操建议:- 用
grep加-A1或-B1查上下文,比如java -XX:+PrintFlagsFinal -version | grep -A1 "UseG1GC",能同时看到该参数值和它的{kind}标记; - 想确认是不是被命令行显式覆盖,对比两次输出:
java -XX:+PrintFlagsFinal -versionvsjava -XX:+UseG1GC -XX:+PrintFlagsFinal -version,再用diff看差异; - 注意有些参数名带下划线,比如
MaxMetaspaceSize,别写成MaxMetaSpaceSize(空格或大小写错就搜不到); - 输出中同一参数可能出现多次(比如不同 GC 类型下派生出的不同值),以最后一行为准——因为 JVM 是按顺序解析并覆盖的。
立即学习“Java免费学习笔记(深入)”;
JVM 参数的“最终值”不等于“你写的值”,中间有平台适配、内存推导、GC 策略联动等多层覆盖逻辑。真正要验证一个参数是否起效,唯一可靠的方式是结合PrintFlagsFinal和实际运行时行为(比如 GC 日志、jstat 输出)交叉比对。
- 用
- OpenJDK 7u40+ 和 Oracle JDK 7u40+ 才支持,JDK 6 及更早版本会直接报错
- 用










