内存泄漏居然因为这个!

233 阅读1分钟

前言

技术准备: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)

3326ed080d218d4aba2e2aff1050073.png

明显gc报错,执行命令jmap -histo 进程号 | more查看内存情况,java的8大基础类型大小正常,但莫名其妙多了一个B和C(注意第一行和第二行)

image.png

问了技术专家,这种情况一般是内存溢出了,这个C和B没有回收掉,那么问题来了,[C是什么,哪里在用

发现进程还在,赶紧dump日志,拉到本地一看就知道了

7ccbdd75ae008b4892a5d7199b70d72.png

2170cc82ef6559baa6d847d65cc414b.png

2b15ca57af1ea03a57ea40af29182cf.png

找到问题,某位同学去下载文件,下载完成后流未关闭

总结

1、bug很小,但影响有点大,已经找到对应开发的同学聊了一下

2、服务挂了第一时间不要着急重启,至少先dump下来所有日志,以防止埋下大坑

3、java的自动回收确实牛逼,但不可完全相信,该close的还是要close