Java内存溢出的真实案例

2019年5月6日11:02:17 发表评论 10,687 views
广告也精彩

阳光明媚,昨日完成上线,本想安然入睡,又临时处理问题,弄的失眠,早晨刚到公司就得知,内存溢出,【微服务刚上线,监控还在完善】,上去一看进程还在,日志产生大量报错,与开发简短沟通后,重启服务,业务临时恢复,过了几分钟又出现error,顺势添加进程管理器,形成监控图表,发现内存有溢出现象,当前设定的最大内存参数已无法支持,业务运行,与老大沟通,提升内存到1G,目前正常,接下来就是来聊聊这次时间背后,我们运维应该做写什么???

一、添加java进程的监控{CPU 内存 }

[root@Micro-service01 ~]# ps -aux|grep "mx1024m"|grep "notify"
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root      1344  7.6  2.1 4788412 716492 ?      Ssl  10:40   1:12 java -Xms128m -Xmx1024m -jar fuqinfinance-service-notify.jar

Java内存溢出的真实案例

可以写个shell 脚本,只要内存大于设定阈值 1024M (1048576 kb) 就报警

二、添加进程管理器

2.1 添加监控

Java内存溢出的真实案例

2.2 监控阈值调整

Java内存溢出的真实案例

三、添加微信报警推送功能

上面的shell脚本,可以配置zabbix进行监控,如果觉得麻烦,可以直接掉用微信的api接口,进行发送告警。
企业微信报警配置方法

配置上面的shell脚本判断内存,拟写了下面的脚本

#!/bin/bash
#---------------------------------------------------------
# $Name:         check.sh
# $Version:      v1.0
# $Author:       qiuyuetao
# $organization: www.dgstack.cn
# $Create Date:  2019-5-6
# $Description:  Check Queue, Yepay Call, DB Lock
#---------------------------------------------------------
DATE=`date +%F-%H-%M`
#source ~/.bash_profile 
source /etc/profile
export PATH=/www/jdk1.8.0_60/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
#WeiXin ENV-------------------------------------------------------------------------------------
CropID='wx3ac3fe****de'
Secret='-RhtEtW1hU-0D46***7lNmWv2MRkCvIc'
APIURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
TOKEN=$(/usr/bin/curl -s -G $APIURL | awk -F\" '{print $10}')
POSTURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$TOKEN"

##WeiXin body--------------------------------------------------------------------------------------
function body() {
        local int AppID=1000006
        local UserID=用户id名
        local PartyID=2
        printf '{\n'
        printf '\t"touser": "'"$UserID"\"",\n"
        printf '\t"toparty": "'"$PartyID"\"",\n"
        printf '\t"msgtype": "text",\n'
        printf '\t"agentid": "'"$AppID"\"",\n"
        printf '\t"text": {\n'
        printf '\t\t"content": "'"$Msg"\""\n"
        printf '\t},\n'
        printf '\t"safe":"0"\n'
        printf '}\n'
        }


##Check Queue--------------------------------------------------------------------------------------
function ckqueue() {
CKLIST="/server/scripts/check-vfw-mem/cklist.txt"
PIDLOG="/server/scripts/check-vfw-mem/ckqulog.txt"
LOG="/server/scripts/check-vfw-mem/log.txt"


for line in `cat $CKLIST`
 do
    ps aux|grep -w $line|grep "Xmx1024"|grep -v "grep"|awk '{print $6}'> $PIDLOG
     if [ `cat $PIDLOG` -gt 81920  ]; then
         echo "---------------------------------------"
         echo "微服务01-"$line"-"$DATE"-内存使用率过高,为防止内存异常,请人为介入检查" >>$LOG
         echo "---------------------------------------"
         sleep 1
       Msg="service-notify Memory user  High-$DATE "
         echo  "$(body guozhiheng0123 $2 )" $POSTURL
         /usr/bin/curl --data-ascii "$(body guozhiheng0123 $2)" $POSTURL
     fi 
done
}

##Main--------------------------------------------------------------------------------------
main(){
      ckqueue;
}
main

3.2 测试报警接收

Java内存溢出的真实案例

3.3 定时任务

手动执行脚本没问题,在添加定时任务即可

####vfs 监控 每10分钟1次 检测内存的使用量###
*/10 * * * *  sh /server/scripts/check-vfw.sh  >/dev/null 2>&1

四、微信推送中文乱码

Java内存溢出的真实案例
Java内存溢出的真实案例

主要是文件的字符编码问题,通过如下步骤进行调整

1,查看当前系统字符集(保证终端、系统、文件字符集统一

[root@Admin ~]# locale
[root@Admin ~]# echo $LANG
zh_CN.UTF-8

如果没有进行安装

2,查看文件编码格式

vim 文件  在最后执行下面命令
:set fileencoding

Java内存溢出的真实案例

3,处理方法:单文件编码转换

:e ++enc=utf-8
#然后wp 保存

Java内存溢出的真实案例

4,网上另外一种方法
3.处理方法二(vim配置文件修改)
vim /etc/vimrc

Java内存溢出的真实案例
强制使用以上编码格式打开文件,一劳永逸

验证结果

Java内存溢出的真实案例

以上是我的方法,如果您有更好的方式,可以告知我,谢谢。
如果是代码问题,请转给开发处理。

  • QQ精品交流群
  • weinxin
  • 微信公众号
  • weinxin
广告也精彩
admin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: