使用 Java Flight Recorder 分析微信 API 服务的 GC 行为与内存泄漏
在高并发微信 API 服务中,频繁的对象创建(如 JSON 解析、HTTP 请求封装)易引发 Full GC 或内存泄漏。传统工具如 jstat、jmap 仅提供静态快照,难以定位瞬时问题。Java Flight Recorder(JFR)是 JDK 内置的低开销事件记录器,可连续采集 GC、线程、锁、对象分配等运行时数据。本文以 wlkankan.cn 微信消息网关为例,演示如何通过 JFR 诊断内存异常。
1. 启用 JFR 并配置录制参数
在启动脚本中开启 JFR:
java -XX:+FlightRecorder -XX:StartFlightRecording=duration=300s,filename=wx-api-gc.jfr,settings=profile -jar wx-gateway.jar
或通过 JCMD 动态开启:
jcmd <pid> JFR.start name=wx_gc_recording settings=profile duration=600s filename=wx-api-600s.jfr
profile 配置包含 GC、TLAB 分配、对象存活信息等关键事件。
2. 模拟内存泄漏场景
在 wlkankan.cn.wx.api.service.MessageCacheService 中构造缓存未清理问题:
package wlkankan.cn.wx.api.service;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
// 错误示例:无过期策略的全局缓存
public class MessageCacheService {
private static final ConcurrentHashMap<String, Object> CACHE = new ConcurrentHashMap<>();
public void cacheMessage(String msgId, Object payload) {
// 问题:未设置 TTL,消息永久驻留
CACHE.put(msgId, payload);
}
public Object getMessage(String msgId) {
return CACHE.get(msgId);
}
}
配合高频调用:

