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

 更新时间:2020年09月17日 09:41:39   作者:qq_41343272  
这篇文章主要介绍了解决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应用线上系统偶发宕机的情况就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java之Algorithm_analysis案例详解

    Java之Algorithm_analysis案例详解

    这篇文章主要介绍了Java之Algorithm_analysis案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Java socket字节流传输示例解析

    Java socket字节流传输示例解析

    这篇文章主要为大家详细介绍了Java socket字节流传输示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • spring 注解验证@NotNull等使用方法

    spring 注解验证@NotNull等使用方法

    这篇文章主要介绍了spring 注解验证@NotNull等使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 浅析Spring IOC 依赖查找你需要知道的几种方式

    浅析Spring IOC 依赖查找你需要知道的几种方式

    这篇文章主要介绍了浅析Spring IOC 依赖查找的几种方式,Spring是Java面试中最常考的,学Java的小伙伴快来看看吧
    2021-08-08
  • spring cloud zuul 与 sentinel的结合使用操作

    spring cloud zuul 与 sentinel的结合使用操作

    这篇文章主要介绍了spring cloud zuul 与 sentinel 的结合使用操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java 基础 byte[]与各种数据类型互相转换的简单示例

    Java 基础 byte[]与各种数据类型互相转换的简单示例

    这篇文章主要介绍了Java 基础 byte[]与各种数据类型互相转换的简单示例的相关资料,这里对byte[]类型对long,int,double,float,short,cahr,object,string类型相互转换的实例,需要的朋友可以参考下
    2017-01-01
  • springboot项目如何配置多数据源

    springboot项目如何配置多数据源

    本文介绍了如何在SpringBoot项目中配置多数据源,包括配置多个数据源、创建数据源配置类、配置事务管理器以及使用不同的Mapper,从而实现跨数据库操作
    2025-03-03
  • SpringSecurity中的表单认证详细解析

    SpringSecurity中的表单认证详细解析

    这篇文章主要介绍了SpringSecurity中的表单认证详细解析,在上一篇文章中,我们初步引入了 Spring Security,并使用其默认生效的 HTTP 基本认证保护 URL 资源,在本篇文章中我们使用表单认证来保护 URL 资源,需要的朋友可以参考下
    2023-12-12
  • 百度Java面试题 前200页精选(上)

    百度Java面试题 前200页精选(上)

    这篇文章主要为大家分享了Java面试资源,百度“Java面试题”前200页都在这里了,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • java获取用户输入的字符串方法

    java获取用户输入的字符串方法

    今天小编就为大家分享一篇java获取用户输入的字符串方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07

最新评论