我们知道,用JAVA语言写的网站,都会有GC的机制,其中堆的大小,就是新生代空余内存及老年代的空余内存之和。java程序在运行的时候,他会不断把新生代里无法gc掉的对象丢到老年代里面,但是老年代的内存也是一个固定值的,当新生代的对象丢到老年代后,老年代的空余内存会不断缩小,也许大家会问,老年代不是也有GC么,他full gc后,老年代丢弃不用的对象后,使用内存不就是会减少了吗? 说的很对,但是,full gc中,也会有gc不掉的对象,新生代丢给他10个,老年代gc掉8个,那么还剩下两个,无限循环下去,总有一天,老年代会满的。

当老年代内存占满后。Java就会不断的执行full gc, full gc会导致应用暂停,直接就导致网站打不开了,那么我们如何去监控它呢。让他的老年代的内存,达到总内存的80%之后。就发出告警。好通知 sa进行查看及清理。

下面有两种方法。

一,通过jstat查看gc状态

#jstat -gc 12580 1000 10000 如下图

这个图里面 133312000  就是年老代所有的内存,即OC列, OU列就是年老代目前所占用的内存,我们看到,每 YGC 一次,年老代的内存就会增加,

当然,我们不可能一直盯着这个界面,那么,下面我们就用一个脚本,来实现监控并抱紧。

二,通过脚本来监控FULL GC .

开启日志功能。

在JAVA的启动参数里面,增加 -Xloggc:/var/log/gc.log

例如:

我们先来看一段CMS gc所导出的日志

日志里面记录了YGC及FULL GC的所有状态。

我们需要取出哪些数据呢。

20167.480: [CMS-concurrent-reset-start]

20167.488: [CMS-concurrent-reset: 0.009/0.009 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]

20222.330: [GC 20222.330: [ParNew: 1029046K->15111K(1105920K), 0.0483250 secs] 1555881K->546542K(2437120K), 0.0485950 secs] [Times: user=0.29 sys=0.01, real=0.04 secs]

上面的数据是我复制的一份log日志。其中,我们要取出 15111K 及 546542K(红色标记),即执行full gc后第一次YGC的值。 15111K 是新生代在gc后还占用的内存大小,546542K 是整个堆的大小,我们知道,堆就是JAVA运行所占用的内存总大小,包括新生代占用大小,和 老年代内存占用大小。如果要计算出老年代所占用的大小,就把 总的 减掉 新生代大小就可以。最后和总的进行比对。即下面的脚本:#vim check_gc.sh

#! /bin/bash

#script by yaozhibing

#blog:http://www.yzbing.info/ ;http://yaozb.blog.51cto.com/

#QQ:410018348

datetime=`date -d today +"%Y-%m-%d %T"`

pro="MIC_EN"

network="TEL"

localip=`ifconfig eth0|awk -F"[: ]+" '/inet /{print $4}'`

gc_logpath="/var/log/gc.log"

error="80"

sms_file="/tmp/sms_file"

time_file="/tmp/time_file"

last=`cat $time_file||echo "111">$time_file`

now=`awk -F: '/CMS-concurrent-reset-start/{print $1}' $gc_logpath|tail -1`

if [ $now != $last ];then

echo $now >$time_file

total=`grep -oP '\d+(?=K\)\])' $gc_logpath|tail -1`

use=`grep -A1 "CMS-concurrent-reset:" $gc_logpath|tail -1|awk -F'[\\\>K]' '{print $7-$3}'`

ratio=`awk -v total=$total -v use=$use BEGIN'{print use/total*100}'`

if [ $(echo "$ratio <= $error"|bc) -eq 0 ];then

total_M=$(($total/1024))

free=$((($total-$use)/1024))

wget -O $sms_file http://短信接口/sms_send.php\?SMS_number=159XXXXX752\&SMS_content="$network:FULLGC ERROR on linux server $localip $pro (Total=$total_M M,Free=$free M,Use= $ratio%) $datetime"

fi

fi

并将些脚本添加到任务计划里面,每5分钟执行一次

#crontab -l

*/5 * * * * /bin/bash /job/check_gc.sh >/dev/null 2>&1

我们来对脚本进行简单的解释

#vim check_gc.sh

#! /bin/bash

#script by yaozhibing

#blog:http://www.yzbing.info/; http://yaozb.blog.51cto.com/

#QQ:410018348

datetime=`date -d today +"%Y-%m-%d %T"` #获取当前时间

pro="yzbing.info" #项目名称

network="TEL"

localip=`ifconfig eth0|awk -F"[: ]+" '/inet /{print $4}'` #主机ip

gc_logpath="/var/log/gc.log" #日志地址

error="80" #报警阀值

sms_file="/tmp/sms_file" #短信临时文件

time_file="/tmp/time_file" #比对文件

last=`cat $time_file||echo "111">$time_file` #读取这个文件内容,如果空的,先随便输一个值进去

now=`awk -F: '/CMS-concurrent-reset-start/{print $1}' $gc_logpath|tail -1` #取日志最前面的值 列

20167.488 ,这步主要是下一次和上一次进行比对,如果值是一样的,就不执行了,以免发生重复报警。

if [ $now != $last ];then #判断两次值是否不相等,

echo $now >$time_file #如果不相等的话,将这次的值输入临时文件

total=`grep -oP '\d+(?=K\)\])' $gc_logpath|tail -1` #取年老代所设置的内存大小

use=`grep -A1 "CMS-concurrent-reset:" $gc_logpath|tail -1|awk -F'[\\\>K]' '{print $7-$3}'` #取总内存占用大小,减新生代占用内存大小,即老年代的内存大小

22

ratio=`awk -v total=$total -v use=$use BEGIN'{print use/total*100}'` #将老年代的占用内存大小与,总年老代设置的总内存大小进行比对 并乘以100 取百分比。

if [ $(echo "$ratio <= $error"|bc) -eq 0 ];then #拿百分比与告警阀值进行比对,看是否达到告警界限。

total_M=$(($total/1024)) #年老代设置的内存大小除以1024,以M为单位

free=$((($total-$use)/1024))#同上。

wget -O $sms_file http://短信接口/sms_send.php\?SMS_number=159XXXXX752\&SMS_content="$network:FULLGC ERROR on linux server $localip $pro (Total=$total_M M,Free=$free M,Use= $ratio%) $datetime" #发送短信。当然也可以发送邮件报警。

fi

fi

目前脚本运行稳定,如有问题,请联系:410018348

java gc 监控_JAVA网站full GC监控脚本相关推荐

  1. java 进程崩溃_java程序崩溃自启脚本

    java程序崩溃自启脚本教程 1.将java程序崩溃自启脚本下载下来,放入项目的同级目录,将proc_name="xxx.jar" 更改成对应的名称 2.chmod 777 + 文 ...

  2. 测评国内免费网站监控服务 - 监控宝,阿里云监控,百度云观测,360监控等对比

    无论我们使用的是昂贵的还是便宜的,甚至可能是免费的虚拟主机.VPS服务器,我们也不可能全天24小时在线盯着服务器的状态和网站的运行情况.如果是我 们个人站长可能自己的网站和服务器还不止一个,不可能照顾 ...

  3. JAVA网站full GC监控脚本

    我们知道,用JAVA语言写的网站,都会有GC的机制,其中堆的大小,就是新生代空余内存及老年代的空余内存之和.java程序在运行的时候,他会不断把新生代里无法gc掉的对象丢到老年代里面,但是老年代的内存 ...

  4. java服务监控_Java最流行的微服务框架监控和各种监控数据

    原标题:Java最流行的微服务框架监控和各种监控数据 自动化的监控运维机制 自动化的监控运维机制的运行基础是不间断地收集各个微服务应用的各项指标情况,并根据这些基础指标信息来制定监控和预警规则,更进一 ...

  5. java gc原理_Java内存管理以及GC工作原理

    1.内存管理简介 内存管理的职责为分配内存,回收内存. 没有自动内存管理的语言/平台容易发生错误. 典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知. 另一 ...

  6. java gc 例子_Java 中, 为什么一个对象的实例方法在执行完成之前其对象可以被 GC 回收?...

    收到好多邀请-泻药泻药.其中有好些感觉是想来吃瓜的. 所以请让我先跑个题,为吃瓜群众献上几个传送门: private static void newSingleThreadPool() { Execu ...

  7. java gc内存_Java内存模型和GC机制

    最近学习Python的GC机制时,想到了java的GC,忘得差不多了,(⊙﹏⊙)b!!这里便做一下回顾总结.推荐周志明译本的<深入理解Java虚拟机>. 1. Java内存模型 1.1 程 ...

  8. java年轻代和年老代默认比值_JAVA中的GC以及年轻代,年老代,持久代的认识

    java中我们常常谈论到垃圾回收机制,那么,垃圾回收机制又是什么呢?说到JVM调优,似乎很高大上,那么JVM调的都是那些数据呢?伊甸园区,幸存区,年轻代,年老代,持久代,每个词都熟悉又陌生,似乎很深奥 ...

  9. java 文件监控_Java 文件监控,实时监控文件加载

    前段时间设计一个文件自动加载系统模块,功能就像是在Tomcat的webapps目录下发布war包那样,只要一有war包加载进来,tomcat立刻就会去解压这个war包,并把它挂载在tomcat上,供网 ...

  10. java gc 时间_Java GC日志查看,GC日志时间分析

    Java中的GC有哪几种类型? 参数 描述 UseSerialGC 虚拟机运行在Client模式的默认值,打开此开关参数后, 使用Serial+Serial Old收集器组合进行垃圾收集. UsePa ...

最新文章

  1. dubbo管控台安装
  2. mysql 自身参照自身_MySQL入门
  3. 现在好多人做 局域网聊天
  4. ZZULIOJ 1070:小汽车的位置
  5. [转]直接拿来用!最火的Android开源项目(一)
  6. 本科生 计算机图形学试卷,湖南工程学院《计算机图形学》毕业补考试卷及答案...
  7. element ui el-dialog 居中,并且内容多的时候内部可以滚动
  8. SpringBoot使用@Transactional
  9. CentOS6上安装Flash Player
  10. mysql sql时间比较_mysql和sql时间 字段比较大小的问题
  11. Nginx关于日志记录实例应用
  12. PHP命名空间带来的干扰
  13. TortoiseGit安装配置详解同时支持github,gitee,gitlab
  14. 中国主要的区块链公司以及融资情况
  15. 深耕金融行业数字化转型,人大金仓数据库自主可控解决方案综述
  16. python运维是什么_python运维方面一般用来做什么
  17. Ubuntu命令方式安装中文语言包
  18. 程序员眼中的中国传统文化-王阳明《传习录》3
  19. 计算机技术变化太快,这世界变化太快!Ps修图进入“智能时代”!
  20. Java实例教程(上)

热门文章

  1. 安徽科技学院 信网学院网络文化节 陈鑫鑫
  2. python 批量打印PDF
  3. 带隙基准电压-Bandgap详细介绍
  4. 前端css 宠物列表
  5. python 假设检验
  6. melp算法matlab,svpwm过调制算法研究与实现 [MELP声码器的算法研究及实现]
  7. 电机电缆M12航空插头
  8. Invalid or unexpected token 报错
  9. Mybatis 新增返回ID
  10. iproxy工具的作用