句柄数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/ 就会有惊喜。