针对正在运行的 Java 程序(不重启),可以通过 JVM 自带工具 直接查看 垃圾回收器类型 和 大对象阈值。以下是实战中最常用、最可靠的方法。
一、判断正在使用的垃圾回收策略(GC)
✅ 方法 1:jcmd(最推荐 )
jcmd <pid> VM.flags
示例输出(G1):
-XX:+UseG1GC
-XX:MaxHeapSize=4096m
常见 GC 标志对照表:
这是生产环境最安全、最准确的方式
✅ 方法 2:jinfo
jinfo -flags <pid>
如果看到:
UseG1GC→ G1UseZGC→ ZGC没有任何 GC 参数 → 使用 JDK 默认 GC
✅ 方法 3:通过 GC 日志(如果有开启)
jcmd <pid> VM.log what=gc*
或直接查看日志中的关键字:
[GC (G1 Evacuation Pause)
[CMS-concurrent-mark
[ZGC
二、查看大对象阈值(重点)
✅情况 1:G1 GC(最常见)
G1 的“大对象”是 Humongous Object,阈值 = Region 大小 × 50%
① 查看 Region 大小
jcmd <pid> VM.flags | grep G1HeapRegionSize
如果没有显示,说明使用的是默认值,可通过最大堆推算:
📌 大对象阈值 = RegionSize / 2
✅ 情况 2:Parallel / CMS GC
查看是否设置了 PretenureSizeThreshold:
cmd <pid> VM.flags | grep PretenureSizeThreshold
示例:
-XX:PretenureSizeThreshold=10485760
👉 表示 > 10MB 为大对象
⚠️ 如果没设置,说明 JVM 自行决定,没有固定阈值。
✅ 情况 3:ZGC / Shenandoah
jcmd <pid> VM.flags | grep -E "UseZGC|UseShenandoah"
✅ 这两种 GC 没有传统意义上的大对象阈值
它们支持任意大小对象,无需特别关注。
三、快速判断清单(一步到位 )
# 1. 查 PID
jps -l
# 2. 查 GC 类型
jcmd <pid> VM.flags | grep Use
# 3. 查大对象阈值
jcmd <pid> VM.flags | egrep "G1HeapRegionSize|PretenureSizeThreshold"
四、实战示例(真实线上)
$ jcmd 12345 VM.flags
12345:
-XX:MaxHeapSize=8192m
-XX:+UseG1GC
-XX:G1HeapRegionSize=4m
✅ 结论:
使用 G1 GC
Region = 4MB
大对象阈值 = 2MB
任何 > 2MB 的连续对象 都是 Humongous Object
五、补充:实时观察是否有大对象产生
查看 GC 日志中的 Humongous Allocation
grep "Humongous" gc.log
典型日志:
[GC pause (G1 Humongous Allocation) ...]
📌 如果频繁出现,说明:
大对象过多
可能导致 Full GC
需要优化对象设计
六、一句话总结
不用重启 JVM:
✅ 用
jcmd <pid> VM.flags看 GC 类型✅ G1 看
G1HeapRegionSize ÷ 2✅ CMS/Parallel 看
PretenureSizeThreshold✅ ZGC/Shenandoah 无大对象阈值概念