怎么判断垃圾回收器类型 和 大对象阈值

怎么判断垃圾回收器类型 和 大对象阈值

针对正在运行的 Java 程序(不重启),可以通过 JVM 自带工具 直接查看 垃圾回收器类型大对象阈值。以下是实战中最常用、最可靠的方法。

一、判断正在使用的垃圾回收策略(GC)

✅ 方法 1:jcmd(最推荐 )

jcmd <pid> VM.flags

示例输出(G1):

-XX:+UseG1GC
-XX:MaxHeapSize=4096m

常见 GC 标志对照表:

GC 类型

JVM 参数

G1 GC

-XX:+UseG1GC

Parallel GC

-XX:+UseParallelGC

CMS

-XX:+UseConcMarkSweepGC

ZGC

-XX:+UseZGC

Shenandoah

-XX:+UseShenandoahGC

Serial GC

-XX:+UseSerialGC

这是生产环境最安全、最准确的方式

✅ 方法 2:jinfo

jinfo -flags <pid>

如果看到:

  • UseG1GC→ G1

  • UseZGC→ 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

如果没有显示,说明使用的是默认值,可通过最大堆推算:

最大堆

Region Size

≤ 4GB

1MB

≤ 8GB

2MB

≤ 16GB

4MB

≤ 32GB

8MB

≤ 64GB

16MB

> 64GB

32MB

📌 大对象阈值 = 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 无大对象阈值概念

在java中,什么是大对象,多大的对象算是大对象 2026-05-20
使用Lego生成ssl证书 2026-05-22

评论区