我们知道,用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:410018348datetime=`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

转载于:https://blog.51cto.com/yaozb/1227775

JAVA网站full GC监控脚本相关推荐

  1. [译]GC专家系列2:Java 垃圾回收的监控

    原文链接:http://www.cubrid.org/blog/dev-platform/how-to-monitor-java-garbage-collection/ 这是GC专家系列文章的第二篇. ...

  2. 整理全网Shell脚本合集,Java脚本,运维脚本,告警脚本,监控脚本,日志脚本,docker脚本等---------持续更新!

    整理全网Shell脚本合集,Java脚本,运维脚本,告警脚本,监控脚本,日志脚本,docker脚本等---------持续更新! 一.ffmpeg脚本 1.1 打开进程,并判断进程数量 1.2 关闭进 ...

  3. 监控Linux服务器网站状态的SHELL脚本

    1,监控httpd状态码的shell脚本代码. #!/bin/sh #site: www.jquerycn.cn # website[0]=www.jquerycn.cn/chuzu/' #网站1 m ...

  4. 服务器状态监控php源码,服务器状态监控_监控Linux服务器网站状态的SHELL脚本

    摘要 腾兴网为您分享:监控Linux服务器网站状态的SHELL脚本,蜗牛集市,同花顺,探客宝,手柄助手等软件知识,以及日期倒计时插件,云南省教育资源公共,rui手机桌面,小屁孩桌面便签,合金装备崛起复 ...

  5. Serverless实践系列(四):网站监控脚本的实现

    很多小伙伴都有自己的博客,或者做过Web,但是自己关心的Web是否健康?当前状态是否可访问?网站挂了谁的锅?这些问题都可以用相关的网站监控脚本进行监测.今天本文将分享如何通过腾讯云云函数开发一个简单的 ...

  6. 利用Serverless实现网站监控脚本的实现!

    很多开发者都有自己的博客,或者做过 Web,但是自己关心的 Web 是否健康?当前状态是否可访问?网站挂了谁的锅?这些问题都可以用相关的网站监控脚本进行监测.今天本文将分享如何通过云函数开发一个简单的 ...

  7. 深入理解JAVA虚拟机 虚拟机性能监控和故障处理工具

    jre的bin目录下的工具,都非常小.它都是tools.jar下面的代码的一层封装而已.tools.jar不是java标准,是Hotspot实现的. 名称 作用 jps JVM Process Sta ...

  8. java代码获取gc信息,如何监视Java垃圾回收

    在文章<理解Java垃圾收集>中,我们了解了不同GC算法的流程,GC的工作方式,年轻代和年老代,以及您应该了解的新JDK 7中5种类型的GC的知识.这些类型的GC对性能都有影响. 本文将讨 ...

  9. zabbix监控JAVA微服务_Zabbix监控JVM(微服务进程)

    老的方法感觉效果不好,又写了一个模板和脚本,请移步: http://www.cnops.top/posts/748ad64f.html 有兴趣的可以继续往下看. Zabbix监控JVM(微服务进程) ...

最新文章

  1. 程序员的生活就是这么朴实无华,且没钱
  2. Linux系统及编程期末试题,《LINUX系统及其编程》考试试题及答案.doc
  3. 一款好用且免费的语句分析工具Plan Explorer
  4. 你和学霸的差距,不只是成绩
  5. sqlserver 数据库日志文件过大的问题
  6. smarty中js的调用方法
  7. mysql oracle 锁机制_Mysql锁机制
  8. Python花式编程案例锦集(4)
  9. 用sublime Text2来开发ruby on rails项目
  10. qdir 类似工具_Qdir中文版|多窗口资源管理器下载_最火软件站
  11. 大学教编程的老师为何不去当高收入的程序员?
  12. 如何使用你的 ETH 赚取更多 ETH?这 5 大策略了解一下
  13. 基于 Lotus Expeditor on Device 的手机银行交易开发
  14. Windows安装GoldenDict
  15. js的unshift()的使用
  16. 使用云祺虚拟机备份软件瞬时恢复H3C CAS 虚拟机
  17. 网安学习(二十五)HTTP协议、HTTS、邮件协议
  18. 推特开发者 推特 oauth1.0a 授权【推特开发者文档系列12】
  19. 数据结构-广义表详解(类C语言版)
  20. linux点对点聊天室的实现与设计心得,基于Socket接口的Linux与Windows网络聊天室设计与实现...

热门文章

  1. 预测分析:R语言实现2.8 小结
  2. SqlServer英文单词全字匹配
  3. [cb]NGUI组件基类之 UIWidget
  4. Windows Server 2012 R2工作文件夹⑤:创建工作文件夹
  5. ExtJS Model数据实体模型
  6. Silverlight – Datagrid,Dataform数据验证和ValidationSummary
  7. Java基础学习(1)
  8. Android内核开发:源码的版本与分支详解
  9. CISCO路由器产品配置手册
  10. 2000行代码实现软渲染引擎