解决java web应用线上系统偶发宕机的情况

前言:

事情是酱紫的,系统上线两个月后,风平浪静。在一个秋天宁静的下午,老衲正喝着茶听着歌敲着代码,顺便欣赏下妹纸,独享这难得的惬意。突然手机响了,一看来电,心中一沉,项目经理来电,必有蹊跷。匆忙接起电话,没有问候,直奔主题,“赶紧看下系统,个别客户反馈系统不能用了,先恢复系统,再排查问题”。

老衲撂下电话,一哆嗦,赶紧连上VPN,直奔服务器主机。

PS:三台服务器(centos、128G内存、32核CPU),tomcat1.7,jdk1.8,通过F5负载

解决步骤:

1、top命令查看CPU占用情况

可以看到11042进程占用了非常多的CPU资源

2、查看F5并发曲线:为什么应用耗费了这么多的线程,难道是用户量突然上来了,调取了F5的访问曲线图,可以看到在15:57左右并发量突然猛涨,当时根据曲线怀疑是请求量徒增导致

3、查看系统请求量:根据应用系统日志、以及localhost_access_log日志 查看此节点用户访问日志,发现使用人数并未徒增,根据请求量绘制的曲线如下:

可以看到曲线并未出现请求量徒增。

4、查看进程内线程运行情况:没有大量请求,为什么CPU会被使用这么多,难道是有线程的死锁,

执行top -p 11042 -H 查看进程内所有线程的运行情况:

可以看到有很多线程正在执行

5、接着打内存快照执行命令打内存快照 在 jdk1.8.0_131/bin下面执行 ./jstack -l 11042>log01.txt,然后又隔了一分钟再次执行./jstack -l 11042>log02.txt,生产两个文件好对比里面的线程交集

打开日志,并未发现死锁的线程,但是在两个文件里面却发现大量的GC线程在执行如图:

6、分析GC回收情况,在jdk bin目录下执行 ./jstat -gcutil 11042 1000 100

看到了没有,虚拟机正在疯狂的进行full GC 回收,垃圾回收线程占用了非常多的CPU资源,问题已经有了明确的方向了,接下来需要分析到底是什么导致了full GC的频繁触发。

7、分析堆内存:

打印堆内存 在jdk bin目录下执行 ./jmap -dump:live,format=b,file=problem.bin 11042 ,将日志文件下载到本地使用jprofiler分析,

发现有大量char[],String ,map 占用,那么是什么业务代码造成了以上大量的数据呢,打开 char[],String 没有找到与之关联的业务代码, 在map中发现大量的相同的业务对象,但是却无法直接发现出是什么操作造成了大量业务对象的存在,因为此业务对象代码中大量使用一一排除的话工作量极大。

一时陷入困境,灵机一动,是不是还有别的内存快照分析工具,一查有个mat,在eclipse装好插件,打开内存快照:

点击leak suspects,如图

在个给出问题中一一查看,这时问题出现了如图:

BaseDatagridRest 的export导出数据方法,突然想到系统中有某个表数据的导出,立即登录系统查看此项导出功能,发现这个导出未对数据量做限制,而且BaseDatagridRest 的export方法实现是将数据库中的表数据抽取到内存中然后回写到excle中,让用户下载。

我登录测试环境,用大数据量测试了下导出果然出现了同样的问题,至此问题水落石出,解决方案很简单,导出数据量加上限制,为了防止因为导出过慢时用户多次点击加上和遮罩。

总结:GC不只是用来面试的,更是来解决问题的。

以上这篇解决java web应用线上系统偶发宕机的情况就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java应用/JVM宕机排查步骤操作

    相信大家都遇到过,自己的Java应用运行一段时间就宕机了或者响应请求特别慢.这时候就需要我们了来找出问题所在了.绝大部分都是代码问题导致的. 一.服务宕机 如果是服务宕机,发生致命问题导致进程已经死掉了,那么已经访问不了了,通常都是CPU问题引起的,程序一般会自己生成javacore文件,一般生成位置在/root目录或jar包同目录下.JavaCore文件主要保存的是Java应用各线程在某一时刻的运行的位置,即JVM执行到哪一个类.哪一个方法.哪一个行上. 找到这个文件,执行命令 gdb jav

  • JAVA实现监测tomcat是否宕机及控制重启的方法

    本文实例讲述了JAVA实现监测tomcat是否宕机及控制重启的方法.分享给大家供大家参考.具体如下: Detector.java: import java.net.URL; import java.net.URLConnection; import java.util.Date; /** * * @author james * */ public class Detector { private static void keepTomcatAlive() throws NullPointerEx

  • 解决java web应用线上系统偶发宕机的情况

    前言: 事情是酱紫的,系统上线两个月后,风平浪静.在一个秋天宁静的下午,老衲正喝着茶听着歌敲着代码,顺便欣赏下妹纸,独享这难得的惬意.突然手机响了,一看来电,心中一沉,项目经理来电,必有蹊跷.匆忙接起电话,没有问候,直奔主题,"赶紧看下系统,个别客户反馈系统不能用了,先恢复系统,再排查问题". 老衲撂下电话,一哆嗦,赶紧连上VPN,直奔服务器主机. PS:三台服务器(centos.128G内存.32核CPU),tomcat1.7,jdk1.8,通过F5负载 解决步骤: 1.top命令查

  • Android进阶Handler应用线上卡顿监控详解

    目录 引言 1 Handler消息机制 1.1 方案确认 1.2 Looper源码 1.3 Blockcanary原理分析 1.4 Handler监控的缺陷 2 字节码插桩实现方法耗时监控 2.1 字节码插桩流程 2.2 引入ASM实现字节码插桩 2.3 Blockcanary的优化策略 引言 在上一篇文章中# Android进阶宝典 -- KOOM线上APM监控最全剖析,我详细介绍了对于线上App内存监控的方案策略,其实除了内存指标之外,经常有用户反馈卡顿问题,其实这种问题是最难定位的,因为不

  • SpringBoot应用线上重启脚本的命令详解

    查找应用进程PID 杀死应用进程PID 运行启动脚本 烦不烦啊,像我这么懒得人 得想个办法一步搞定! 如下所示 新建一个shell脚本,然后将其运行之! #!/bin/sh #根据进程名杀死进程 if [ $# -lt 1 ] then echo "需要传入jar包的名称!" exit 1 fi # 根据输入的应用名,找出指定的应用的进程Id PROCESS=`ps -ef|grep $1|grep -v grep|grep -v PPID|grep -v /bin/sh|awk '{

  • java web FTPClient实现上传文件到指定服务器

    FPClient 实现上传文件到指定服务器,供大家参考,具体内容如下 调用 FileInputStream in=new FileInputStream(new File(fileUrl)); moveFile("10.3.3.**", 21, "username", "password", path, filename, in); 方法 /** * Description: 向FTP服务器上传文件 * @param url FTP服务器host

  • Java web实现头像上传以及读取显示

    最近在做一个学生的信息管理系统,其中就有一个功能是要上传头像以及实现显示的功能,那么要如何实现呢? 思路: 1.如果要上传头像并要显示的话,可以创建一个工具类来将获取的头像另外复制一份放在工程目录下,并修改其文件名(防止名字相同有冲突).2.要创建表,另一个img表用于存放该学生的头像的存储路径.头像名称.以及该学生对应的ID.3.在html页面中可通过设置表单在获取信息,注意的是由于表单的enctype属性要设为"multipart/form-data",设置为该属性可以上传文件.4

  • Java Web中解决路径(绝对路径与相对路径)问题

    Java Web中解决路径问题: Java中使用的路径,分为两种:绝对路径和相对路径.归根结底,Java本质上只能使用绝对路径来寻找资源.所有的相对路径寻找资源的方法,都不过是一些便利方法.不过是API在底层帮助我们构建了绝对路径,从而找到资源的! 在开发Web方面的应用时, 经常需要获取 服务器中当前WebRoot的物理路径. 如果是Servlet , Action , Controller, 或则Filter , Listener , 拦截器等相关类时, 我们只需要获得ServletCont

  • tomcat部署java web项目遇到的问题及解决方法

    背景:本人不是Java开发人员,经过四年多的历练,可以说是一枚BI攻城师了吧,最近粗糙的写了一个Portal来集成cognos报表,下面就入正题说一下发布过程中遇到的小问题吧. a:前提:Java web项目已经在MyEclipse里面开发好,发布,利用MyEclipse8.5自带的tomcat运行,通过IE访问项目主页,登录验证一切OK b:把Java web项目导出为.war格式的文件放到tomcat/webapp下面 或者 在MyEclipse8.5中添加自己安装的tomcat6.0然后运

  • Java Web项目部署在Tomcat运行出错与解决方法示例

    本文实例讲述了Java Web项目部署在Tomcat运行出错与解决方法.分享给大家供大家参考,具体如下: 1.在部署Java Web项目的过程中,启动Tomcat出现报错提示 具体报错如下: Could not load the Tomcat server configuration at \Servers\Tomcat v7.0 Server at localhost-config. The configuration may be corrupt or incomplete. 元素类型 "H

  • Java Web开发项目中中文乱码解决方法汇总

    Java Web项目中,解决中文乱码方法总结如下 第一种情况:调用jsp页面中文显示乱码 问题描述:通过浏览器调用jsp页面,在浏览器中显示的中文内容出现乱码. 解决方法:首先确认本jsp在编辑器中保存文件内容时,使用的是utf-8的编码格式,然后在jsp页面的开始处添加<%@ pageEncoding="utf-8"%>就可以解决这种中文乱码问题 第二种情况:调用servlet页面显示乱码 问题描述:通过浏览器调用servlet,servlet在浏览器中显示的内容出现乱码

随机推荐