go tool pprof -alloc_objects heap.out go tool pprof -http=:8080 heap.out go test -bench=. -benchmem -memprofile=heap.out
CPU 只有四成,接口却总在高并发时抖动,heap profile 的 inuse 看不出问题,切到 alloc_objects 才发现某个序列化函数占了七成对象数,单次分配量却小到容易被忽略。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:每次请求都在循环里拼字符串和装箱小对象,单次量小但调用极频繁,堆上留不住,GC 却要反复扫描大量短命对象,压力全落在分配速率而不是常驻内存上。
这次卡住的地方就在「分配对象热点」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。监控和日志的时间要对上,时区不一致会多绕很大一圈。
处理上按这个顺序:按累计对象数排序而不是只看常驻内存占用;把循环内的字符串拼接改成预分配的缓冲区;复查日志打印和序列化编码处的临时对象分配。
确认没问题再收工,同一压测下该函数的对象分配数下降一半,回收次数同步减少。
