Skip to content

场景:大促凌晨订单接口 TPS 掉到 10%,监控显示 FGC 每 30 秒一次。
步骤:

  1. 打开 GC 日志:-Xlog:gc*(JDK11)

  2. 在线 jstat -gcutil pid 1s → Old 区 99%、FGC 计数狂飙

  3. jmap -dump:live,format=b,file=heap.hprof

  4. MAT 打开 → Histogram 发现 com.xxx.OrderDTO 占 1.8 G

  5. 代码定位:查询订单列表时一次性把 30 天数据全塞到 List,没有做分页。
    优化:
    • 分页查询 + 流式处理(MyBatis Cursor)
    • 调整 -Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200
    结果:Old 区降到 30%,FGC 消失,接口 TPS 恢复到 3000+。