Full GC 频繁怎么办:从回收效果分清泄漏和分配压力
线上一旦开始频繁 Full GC,监控群里几乎总会立刻冒出几个熟悉判断:是不是堆太小了、是不是该换 GC、要不要先把参数调大一点。
Java
这里按页继续往后翻,仍然围绕接口变慢、数据库等待、线程池、JVM 与线上问题排查这些问题。
线上一旦开始频繁 Full GC,监控群里几乎总会立刻冒出几个熟悉判断:是不是堆太小了、是不是该换 GC、要不要先把参数调大一点。
Java 出现内存问题时,很多人第一反应是:是不是堆不够了,是不是 GC 参数不合适,是不是流量上来了。这些方向当然都有可能,但如果服务表现出一种更典型的状态——内存越来越高、Full GC 越来越频繁、回收之后还是降不下来——那就要开始认真怀疑另一个方向: 是不是出现了内存泄漏。
线上最容易把人带乱的告警之一,就是 Java 服务 CPU 持续 90%+ 。
线上服务一旦 OOM,现场通常都很乱:实例重启、接口报错、报警连着响,大家也很容易马上分成两派,一派先扩内存,一派先抓泄漏。这两种动作都不算离谱,但如果类型没分清,后面很容易忙了一圈还没摸到根。
线程池打满不是一个配置名词,而是一种执行层拥塞信号。监控里看到 active 顶满、queue 往上爬、reject 开始冒出来时,大家很容易立刻去调 maximumPoolSize、换拒绝策略,或者把队列再垫高一点。
jstack、jmap、jstat 这三个名字,做 Java 的人基本都见过。
分页查询几乎是后台系统里最常见的需求之一,所以很多项目在一开始都会很自然地写出类似这样的 SQL:
做 SQL 优化时,EXPLAIN 几乎总会最先被贴出来。