直接通过gc日志中humongous关键字(如g1 humongous allocation、humongous allocation failed等)定位大对象分配行为,结合停顿时间、hu指标趋势及对象尺寸分布四点交叉验证即可精准识别问题。

直接看 GC 日志里带关键词的记录,就能快速定位 Humongous 分配行为。重点不是“有没有”,而是“是否高频、是否集中、是否伴随停顿”。
看日志中明确出现的 Humongous 关键字
GC 日志里只要出现以下任意一种,就说明发生了大对象分配:
-
G1 Humongous Allocation(最常见,表示成功分配) -
Humongous region allocation failed或Attempt to allocate humongous object(分配失败,极可能触发 Full GC 或 OOM) -
Humongous Start/Humongous Continuation(出现在堆内存布局类日志中,如-Xlog:gc+heap=debug) -
promotion failed有时也与大对象绕过年轻代有关,需结合上下文判断
关注停顿类型和时间点是否吻合
不是所有 Humongous 记录都致命,关键看它是否对应真实业务卡顿:
- 检查
Pause Young (G1 Humongous Allocation)这类 STW 停顿是否密集出现,且时间戳和监控中的毛刺完全重叠 - 若某分钟内出现十几次
G1 Humongous Allocation,同时应用响应延迟飙升,基本可锁定为根因
结合日志里的内存指标交叉验证
单看关键字容易误判,要搭配数值变化看趋势:
-
HU=字段(Humongous used)在jstat -gc <pid></pid>输出中持续阶梯式上涨(如 42 → 108 → 196),而老年代OU增长平缓,说明不是老年代满了,是大对象在占坑 - 日志中紧跟着出现
Concurrent Mark Abort或G1 Compaction Pause,代表并发标记被压垮,已开始降级
用高精度日志确认对象大小分布
默认日志不显示具体分配尺寸,需开启细粒度输出:
- 加参数
-Xlog:gc+humongous=debug或-Xlog:gc+heap=debug,能打印每次请求的大对象原始大小(例如Allocating humongous object of 3145728 bytes) - 如果多数集中在 2–4MB 区间,说明当前 Region 大小(比如默认 2MB)正卡在临界点,大量对象刚好跨过 50% 阈值
基本上就这些。不需要逐行扫日志,盯住关键词 + 停顿时间 + HU 趋势 + 尺寸分布,四点对上,问题就清晰了。










