一、问题
这几天将项目上线,但总是过一会儿要么redis挂掉,要么是mysql挂掉,要么是我的java项目挂掉。使用 top 命令发现,2G的内存只是用了1.2G,但是 free 内存就只有几十兆,大部分的内存都在 buff/cache 区域。
二、解决办法
1.释放内存脚本 freemem.sh
:
used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`
echo "===========================" >> /home/freemem/logs/mem.log
date >> /home/freemem/logs/mem.log
echo "Memory usage before | [Use:${used}MB][Free:${free}MB]" >> /home/freemem/logs/mem.log
if [ $free -le 150 ] ; then
sync && echo 1 > /proc/sys/vm/drop_caches
sync && echo 2 > /proc/sys/vm/drop_caches
sync && echo 3 > /proc/sys/vm/drop_caches
used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`
free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`
echo "Memory usage after | [Use:${used_ok}MB][Free:${free_ok}MB]" >> /home/freemem/logs/mem.log
echo "OK" >> /home/freemem/logs/mem.log
else
echo "Not required" >> /home/freemem/logs/mem.log
fi
exit 1
2.为脚本 freemem.sh
设置可执行权限
chmod u+x freemem.sh
3、使用crontab -e命令编辑当前用户的crontab
#编辑定时任务脚本
crontab -e
#每隔30分钟执行一下清理内存脚本
*/30 * * * * /home/freemem/freemem.sh
4、重启crond服务
/sbin/service crond restart
5、查看crond服务是否重启成功
/sbin/service crond status
参见Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案