能动态修改,但仅限 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
→ 查看是否已开启 GC 日志基础开关 -
jinfo -flag PrintGCDetails
→ 查看详细 GC 日志是否启用 -
jinfo -sysprops
→ 查看所有 Java 系统属性(如 file.encoding、user.dir) -
jinfo -flags
→ 查看所有非默认 JVM 启动参数
注意:PrintGCDetails 单独开启无效,必须配合 PrintGC 才能输出日志。
如何实时开启 GC 日志输出?
这是最典型、最安全的实战场景。按顺序执行三步即可立即生效:
- jinfo -flag +PrintGC
- jinfo -flag +PrintGCDetails
- jinfo -flag +PrintGCDateStamps
执行后,应用标准输出或指定日志文件(如 -Xloggc:/path/to/gc.log)会立刻开始打印带时间戳的详细 GC 记录。无需重启,不中断请求,变更即时生效。
修改字符串类参数(如 HeapDumpPath)
对需要赋值的参数,语法是 -flag name=value:
-
jinfo -flag HeapDumpPath=/data/dumps/
→ 设定 OOM 时堆转储路径 -
jinfo -flag HeapDumpOnOutOfMemoryError
→ 先确认当前值是否为 false -
jinfo -flag +HeapDumpOnOutOfMemoryError
→ 再开启开关
这类组合操作适合提前布防——在问题尚未爆发前,就让 JVM 具备自动抓取现场的能力。










