句柄数20W,定位分析记录

背景:

问题描述:too many open files

相信做过开发的人,对这个错误是不会陌生的。

 

一次服务上线,发现文件上传失败,查看了一下,是说open files不够大了,还是咋的。emmm,怎么办呢。先查看一下

 

把内存文件dump出来

jmap -dump:live,format=b,file=path pid

 

好吧,其实也根本不知道为什么要做这个动作。纯粹就是想看一下,有没有大文件在作祟。然后,发现也并没什么太多的发现。怎么办。

(其实当时这个方向为什么是这样,不太记得了,应该一开始也没有定位到是句柄数的问题,反正是服务不太正常,总有报错。仿佛是下意识地去看一下内存泄露什么的)。

 

后来就发现是句柄数,只增不减,只往上不往下。好了,定位到问题,接下来还得找原因。

重启,万能的重启,在这一次并没有什么效果。只恢复了一会会儿,又不行了。观察了一下,还是句柄数太高。

 

 

噢,想起来了,dump 内存是想看一下,有没有疯狂创建的对象占用了句柄还是什么的——并没有什么发现,正常得很。

 

emmm,怎么办呢,后来还是技术总监大佬有办法,给找到了一个神器,就是这个:http://file-leak-detector.kohsuke.org/

带着它去启动,直接就告诉你句柄数被谁占用光了。

 

好,还试用一下,

果然是神器,连代码都给定位到了,这下子,就什么都清楚了。不得不必须写一篇文章来记录一下这个神器。

 

记录一下使用方式:

只需要: 

java -javaagent:path/to/file-leak-detector.jar=http=19999 ...your usual Java args follows...

 

比如 java -javaagent:/opt/file-leak-detector.jar=http=19999 -jar xxxxx.jar

启动,再去访问 http://localhost:19999/   就会有惊喜。

 

posted @ 2022-03-16 21:17  aaacarrot  阅读(206)  评论(0编辑  收藏  举报