最近發現運行在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