这两天遇到一个服务假死的问题,具体现象就是服务不再接收任何请求,客户端会抛出Broken Pipe。

检查系统状态

执行top,发现CPU和内存占用都不高,但是通过命令

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

发现有大量的CLOSE_WAIT端口占用,继续调用该服务的api,等待超时之后发现CLOSE_WAIT的数量也没有上升,也就是说服务几乎完全僵死。

检查JVM情况

怀疑可能是线程有死锁,决定先dump一下线程情况,执行

jstack > /tmp/thread.hump

发现tomcat线程基本也正常,都是parking状态。

这就比较奇怪了,继续想是不是GC导致了STW,使用jstat查看垃圾回收情况

app@server:/tmp$ jstat -gcutil 1 2000 10

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT

0.00 27.79 65.01 15.30 94.75 92.23 1338 44.375 1881 475.064 519.439

一看吓一跳,FGC的次数居然超过了YGC,时长有475s。一定是有什么原因触发了FGC,好在我们打开了GC log。

发现一段时间内频繁发生Allocation Failure引起的Full GC。而且eden区的使用占比也很大,考虑有频繁新建对象逃逸到老年代造成问题。询问了一下业务的开发,确认有一个外部对接API没有分页,查询后可能会产生大量对象。

由于外部API暂时无法联系对方修改,所以为了先解决问题,对原有的MaxNewSize进扩容,从192MB扩容到一倍。经过几天的观察,发现gc基本趋于正常

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT

0.00 3.37 60.55 8.60 95.08 92.98 87 2.421 0 0.000 2.421

扩容之前对heap进行了dump

jmap -dump:format=b,file=heapDump

通过MAT分析内存泄露,居然疑似是jdbc中的一个类,但其实整体占用堆容量并不多。

分析了线程数量,大约是240多条,与正常时也并没有很大的出入。而且大量的是在sleep的定时线程。

总结

本次排查其实并未找到真正的原因,间接表象是FGC频繁导致服务假死。而且acturator端口是正常工作的,导致health check进程误认为服务正常,没有触发告警。如果你也遇到类似的情况欢迎一起讨论。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

如何用java判断进程是否假死_Spring Boot假死诊断实战记录相关推荐

  1. java判断那个时间更晚_如何用Java判断日期是早于还是晚于另一个日期

    如何用Java判断日期是早于还是晚于另一个日期 另一个工作中常见的操作就是如何判断给定的一个日期是大于某天还是小于某天?在Java 8中,LocalDate类有两类方法isBefore()和isAft ...

  2. java 判断手机运营商_如何用java判断手机号运营商?

    如何用java实现判断手机号的运营商?因为每个号段都是工信部规定划分给指定运营商的,所以我们可以通过手机号码的号段来判断. 现在手机号的号段那么多,要怎样方便的的判断呢?于是我们就想到了正则表达式,在 ...

  3. java 判断手机号_如何用java判断手机号运营商?

    如何用java实现判断手机号的运营商?因为每个号段都是工信部规定划分给指定运营商的,所以我们可以通过手机号码的号段来判断. 现在手机号的号段那么多,要怎样方便的的判断呢?于是我们就想到了正则表达式,在 ...

  4. 如何用java判断手机号运营商?

    如何用java实现判断手机号的运营商?因为每个号段都是工信部规定划分给指定运营商的,所以我们可以通过手机号码的号段来判断. 现在手机号的号段那么多,要怎样方便的的判断呢?于是我们就想到了正则表达式,在 ...

  5. java 判断网络图片是否存在_请教:如何用java判断一个图片的网络地址是否有效?...

    import java.net.HttpURLConnection; import java.net.URL; import org.apache.log4j.Logger; /** * * * 文件 ...

  6. java判断一个月连续打卡时间_java并发编程实战《五》死锁 挑战打卡60天

    一不小心就死锁了,怎么办? 在上一篇文章中,我们用 Account.class 作为互斥锁,来解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,性能太差. 向现 ...

  7. java jar 没有主清单属性_Spring Boot jar中没有主清单属性的解决方法

    使用Spring Boot微服务搭建框架,在eclipse和Idea下能正常运行,但是在打成jar包部署或者直接使用java -jar命令的时候,提示了xxxxxx.jar中没有主清单属性: D:\h ...

  8. java项目启动后运行方法_spring boot在启动项目之后执行的实现方法

    前言 我们在web项目启动之后有时候还会做点其它的东西(比如,导入数据脚本),下面就说说spring-boot里怎么在程序启动后加入自己要执行的东西 方法如下: 新建一个类:BeforeStartup ...

  9. java 如何去掉http debug日志_Spring Boot手把手教学(3):从零配置logback日志

    前言 使用logback我们可以自定义控制台日志输出,可以实现对不同日志不同级别打印到不同的文件中,可以对日志进行归档保存,并定时删除: 对于一个应用来讲,一个好的日志系统,对于对问题的追溯有很大的帮 ...

最新文章

  1. python使用numpy包编写自定义函数计算SMAPE(对称平均绝对百分比误差)指标Symmetric mean absolute percentage error、SMAPE指标解读、指标使用的注
  2. ArcGISServer10安装与地图发布
  3. 【版本发布】Jeecg-P3 1.0 发布,J2EE微服务框架(插件开发)
  4. C与C++的区别简答
  5. IEEE Spectrum:这些小机器人又好玩又实用,适合过年带回家
  6. LCP 01. 猜数字
  7. js数据结构与算法--单链表的实现与应用思考
  8. ORACLE的Copy命令和create table,insert into的比较
  9. nosql笔记1_早前的时候
  10. 生成activiti需要的25张系统表
  11. WIN7 KB4516065 安装失败
  12. Linpack的编译和安装
  13. dingo php,Laravel Lumen RESTFul API 扩展包:Dingo API(一) —— 安装配置篇
  14. 利用fiddler和低版本的iTunes实现iOS抓包
  15. MIT6.828学习之homework9:Barriers
  16. 每日一练--世纪难题
  17. Win10下Prolific USB-to-Serial Comm Port驱动提示不能使用
  18. catia如何将曲面加厚变为实体_catia中如何将封闭曲面做成实体?
  19. leetcode621. 任务调度器
  20. 什么是以太网供电POE

热门文章

  1. 【报告分享】2021年Q3小红书美妆报告-CC数据(附下载)
  2. [Java]用Random类来模拟双色球开奖
  3. 2021年2月8日 抖音直播后端开发实习面经
  4. G4560和G4600买哪个好?
  5. IP地址规划设计实验
  6. JAVA面试八股文宝典(黑马学习随笔)-- 基础篇
  7. JZ38 字符串的排列
  8. VMware vSphere 7 vCenter 7 ESXi 7 正式版下载地址
  9. python统计重复的数_python统计一个文本中重复行数的方法
  10. STM8S003F3 使用定时器来计算方波周期的方法