生产系统最近不稳定, linux 经常爆出打开文件数过多的问题。
Linux 有文件句柄限制,默认一般为 1024 。之前生产环境调整过一次,改大了。这次又出现类似问题,怀疑是应用程序存在问题。
1 查看进程打开文件数最大限制
为了保证生产环境能够继续提供服务,运维把进程所能打开的最大文件数为改为 8192,同时通过设置了监控,当最大文件数超过 3000 时,进行短信预警。
通过 Linux 的 ulimit 命令,查看目前进程所能打开的最大文件数。而当时的应用程序实际打开的文件数为 3000 多。
2 分析 Java Heap Dump 文件
让运维人员 dump 出当时的 Java Heap Dump 文件,进行深入分析。
在 Eclipse Memory Analyzer 的 Histogram 中,按照 Objects 数量进行排序,发现数量在 3000 左右的对象,大都与 axis2 相关:
右键点击 org.apache.axis2.context.MessageContext,在弹出框中选择“List objects” -> with outgoing references,打开外部引用了这个类实例的列表:
展开某个类实例,可以看到与这