最近线上
有个java服务,启动的时候限制堆内存为512M,但当运行一段时间后,使用内存达到512M报io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s) of direct memory (used: 520093703, max: 536870912),服务不能正常工作,初步怀疑内存泄漏导致。临时解决方案,先写脚本检查内存是否达到512M,达到512M重启进程。
具体脚本如下:
-
file=test.log
-
-
#1、查找进程,获取进程id
-
ret=`ps -ef |grep sa-test | grep -v grep`
-
#echo $ret
-
-
pid=`echo $ret|awk '{print $2}' `
-
#echo $pid
-
-
#2、获取进程堆内存信息
-
jmap -heap $pid |grep -E "capacity|used" |grep = >$file
-
{
-
# 读取一行内容,并将读取的内容存入变量line1中
-
read line1
-
# 读取一行内容,并将读取的内容存入变量line2中
-
read line2
-
# 将这个代码块的标准输入指向变量file的值所代表的的文件
-
} < $file
-
-
echo $line1;
-
echo $line2;
-
total=`echo $line1|awk '{print $3}'`
-
used=`echo $line2|awk '{print $3}'`
-
echo $total $used
-
val=`expr $total - $used`
-
diff=10485760
-
#3、比较剩余内存是否小10M
-
if [ $val -lt $diff ]
-
then
-
echo 'restart'
-
cd /sa-test
-
sh sa-test-jar.sh restart
-
else
-
echo 'ok'
-
fi
阅读(10096) | 评论(0) | 转发(0) |