检查java进程占用内存

9960阅读 0评论2020-06-16 zpf1218
分类:系统运维

     最近线上有个java服务,启动的时候限制堆内存为512M,但当运行一段时间后,使用内存达到512M报io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s) of direct memory (used: 520093703, max: 536870912),服务不能正常工作,初步怀疑内存泄漏导致。临时解决方案,先写脚本检查内存是否达到512M,达到512M重启进程。
具体脚本如下:


点击(此处)折叠或打开

  1. file=test.log
  2. #1、查找进程,获取进程id
  3. ret=`ps -ef |grep sa-test | grep -v grep`
  4. #echo $ret
  5. pid=`echo $ret|awk '{print $2}' `
  6. #echo $pid
  7. #2、获取进程堆内存信息
  8. jmap -heap $pid |grep -E "capacity|used" |grep = >$file
  9. {
  10. # 读取一行内容,并将读取的内容存入变量line1中
  11. read line1
  12. # 读取一行内容,并将读取的内容存入变量line2中
  13. read line2
  14. # 将这个代码块的标准输入指向变量file的值所代表的的文件
  15. } < $file

  16. echo $line1;
  17. echo $line2;
  18. total=`echo $line1|awk '{print $3}'`
  19. used=`echo $line2|awk '{print $3}'`
  20. echo $total $used
  21. val=`expr $total - $used`
  22. diff=10485760
  23. #3、比较剩余内存是否小10M
  24. if [ $val -lt $diff ]
  25. then
  26. echo 'restart'
  27. cd /sa-test
  28. sh sa-test-jar.sh restart
  29. else
  30. echo 'ok'
  31. fi


上一篇:FastDFS同步机制(三)新增节点同步流程
下一篇:kafka消费者提交offset失败分析