能动态修改,但仅限 JVM 标记为 {manageable} 的参数,如 PrintGC、PrintGCDetails、HeapDumpOnOutOfMemoryError 等;-Xms、-Xmx、-XX:+UseZGC 等内存与 GC 算法类参数启动后不可更改。

可以做到,但必须满足两个前提:目标参数是 {manageable} 类型,且你有对应 Java 进程的 PID 和执行权限。
哪些 JVM 参数能动态改?
不是所有参数都支持运行时修改。JVM 明确将部分参数标记为 {manageable},只有它们才能用 jinfo 热更新。常见可调参数包括:
- GC 日志开关:PrintGC、PrintGCDetails、PrintGCDateStamps、PrintGCTimeStamps
- 堆转储控制:HeapDumpOnOutOfMemoryError、HeapDumpPath
- 诊断类开关:PrintClassHistogram、PrintConcurrentLocks
- 部分 CMS/G1 内部阈值(如 CMSWaitDuration、G1HeapRegionSize 等,需查具体版本标记)
像 -Xms、-Xmx、-XX:MaxMetaspaceSize、-Xss、-XX:+UseZGC 这类决定内存结构或 GC 算法的参数,启动后完全锁定,jinfo 无法修改。
确认方法:运行 java -XX:+PrintFlagsFinal -version | grep manageable,输出中带 {manageable} 的才是安全可调项。
怎么查看当前进程的参数状态?
先用 jps -l 找到目标 Java 进程 PID,再执行以下命令:
- jinfo -flag PrintGC <pid> → 查看是否已开启 GC 日志基础开关
- jinfo -flag PrintGCDetails <pid> → 查看详细 GC 日志是否启用
- jinfo -sysprops <pid> → 查看所有 Java 系统属性(如 file.encoding、user.dir)
- jinfo -flags <pid> → 查看所有非默认 JVM 启动参数
注意:PrintGCDetails 单独开启无效,必须配合 PrintGC 才能输出日志。
如何实时开启 GC 日志输出?
这是最典型、最安全的实战场景。按顺序执行三步即可立即生效:
- jinfo -flag +PrintGC <pid>
- jinfo -flag +PrintGCDetails <pid>
- jinfo -flag +PrintGCDateStamps <pid>
执行后,应用标准输出或指定日志文件(如 -Xloggc:/path/to/gc.log)会立刻开始打印带时间戳的详细 GC 记录。无需重启,不中断请求,变更即时生效。
修改字符串类参数(如 HeapDumpPath)
对需要赋值的参数,语法是 -flag name=value:
- jinfo -flag HeapDumpPath=/data/dumps/ <pid> → 设定 OOM 时堆转储路径
- jinfo -flag HeapDumpOnOutOfMemoryError <pid> → 先确认当前值是否为 false
- jinfo -flag +HeapDumpOnOutOfMemoryError <pid> → 再开启开关
这类组合操作适合提前布防——在问题尚未爆发前,就让 JVM 具备自动抓取现场的能力。


















