前言
技术准备:jvm、IBM Thread and Monitor Dump Analyzer for Java (TMDA)
事故描述
本来开开心心的开发,结果忽然业务说管理页面打不开了,看了一下git提交和devops,最近一次更新是1个月前,一共上线功能40个,需要排查。
开始排查
首先连接上服务器,服务器无卡顿,top显示io、cpu正常
进入pod,显示io、cpu正常,执行ls命令无卡顿,ps -ef | grep java进程存在无异常
打开logback日志,显示报错gol(GC overhead limit exceeded)
明显gc报错,执行命令jmap -histo 进程号 | more查看内存情况,java的8大基础类型大小正常,但莫名其妙多了一个B和C(注意第一行和第二行)
问了技术专家,这种情况一般是内存溢出了,这个C和B没有回收掉,那么问题来了,[C是什么,哪里在用
发现进程还在,赶紧dump日志,拉到本地一看就知道了
找到问题,某位同学去下载文件,下载完成后流未关闭
总结
1、bug很小,但影响有点大,已经找到对应开发的同学聊了一下
2、服务挂了第一时间不要着急重启,至少先dump下来所有日志,以防止埋下大坑
3、java的自动回收确实牛逼,但不可完全相信,该close的还是要close