一、问题场景
在一个短信平台的项目中,设置了一个下发节点的Xmx为16G,但是出现了内存撑满,导致CPU过高的情况。当时的具体情况是,该应用内存占用16G,该应用CPU占用1400%(16核),服务器负载15左右。进入应用的实时日志,发现日志每打印四五秒后,会暂停一分多钟。这代表着由于内存耗尽,导致cpu高负载,最终导致应用程序不能正常运行,断断续续。严重影响生产环境的运行速率。
二、解决方案
1、线上救急的临时方案:
(1)让运营停止审核,即停止继续往堵塞应用中送数据。
内存队列中的数据让它慢慢下放,经过几个小时的下放后,断断续续由每次四五秒到十几秒最终到几十秒,当内存队列中的数据全部清空后,断断续续仍然存在,但是要好了很多,基本是正常半分钟,暂停半分钟。这时候内存占用仍然没有明显的下降。
(2)重启服务,内存当即释放掉,所有问题得到了临时解决。
(3)将应用的Xmx由16G调高到52G,服务器是64G内存的。
(4)时刻关注这台服务器的内存cpu占用,每晚凌晨重启。
(1)输入命令:top -c,查看占用内存过高的进程信息
(2)输入命令:jmap -histo:live PID > xxx.log,vim查看内存中的存活对象统计,找出业务相关的类名
(3)如果第(2)步仍然不能定位到代码中的具体对象,输入命令:jmap -dump:live,format=b,file=xxx.hprof PID
这个命令会将内存里的所有信息都输出&