背景
推送了大量push信息后,厂商会回调我们的接口,推送回执信息(批量),在使用mongo处理大量回执信息时,mongo数据库CPU使用率100%,回执服务内存溢出,导致服务瘫痪
2024-04-26 11:14:21.616 [http-nio-9201-exec-139] ERROR o.a.c.c.C.[.[.[/xxx-server].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [/pns-server] threw exception [Handler dispatch failed: java.lang.OutOfMemoryError: Java heap space] with root cause
问题处理
统计JVM GC情况
jstat -gc PID 1000 10
导出进程堆栈日志信息
jmap -dump:format=b,file=demo.hprof pid
堆栈分析
经过堆栈数据分析,可以看出PowerOfTwoBufferPool对象,在内存经过FGC后,依然没有得到释放,长期占用内存;
解决
同时分析了回执处理代码,中间也存在很多问题,比如一次查询很多无用数据,使用大量串行化处理