【JVM】记一次生产内存溢出问题

文章描述了在处理大量推送回执时,MongoDB数据库CPU使用率过高,内存溢出导致服务瘫痪的问题。作者通过统计JVMGC情况、堆栈分析和MongoDB官方反馈,发现PowerOfTwoBufferPool内存泄漏和代码优化问题。给出了相应的解决方案和改进措施。
摘要由CSDN通过智能技术生成
背景

推送了大量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后,依然没有得到释放,长期占用内存;

解决

解决方案
解决方案二
Mongo官方回复

同时分析了回执处理代码,中间也存在很多问题,比如一次查询很多无用数据,使用大量串行化处理

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值