最近发现运行在Linux下的java application报以下错误:java
java.io.IOException: Cannot run program "/bin/sh": java.io.IOException: error=24, Too many open files Caused by: java.io.IOException: java.io.IOException: error=24, Too many open files at java.lang.UNIXProcess.<init>(Unknown Source) at java.lang.ProcessImpl.start(Unknown Source) ... 5 more
解决方案:linux
1. 提升linux中默认同时打开的最大文件数量(默认是1024)bash
最便捷的方法是在/etc/profile文件中加入ulimit -n 最大开启数量app
可是这种方法没法从根本上查出什么缘由致使java打开了这么多的文件code
2. java端调查开启文件多的缘由进程
Linux下查看进程打开了哪些文件it
lsof -p 进程id -> 打开的具体文件
lsof -p 进程id|wc -l -> 打开文件的数量io
经过调查发现,java开了不少TYPE为FIFO(Linux中的管道)的文件,所以联想到有多是java代码中的流没有正常关闭或者释放致使的。class
并且Java在Linux下执行命令的时候须要用到Process类,这个类在使用后须要destroy()掉,否者也会致使文件数开启的过多sed