不當使用 Runtime 類引發的 Too many open files

      前段時間發現項目在運行一段時間以後,開始報錯java.net.SocketException: Too many open files。 猜想又是哪裏有打開流以後未關閉之類的狀況存在,也就是有泄漏。掃了下代碼,彷佛沒發現哪裏有不當之處,有異常捕獲,也有在finally裏對流進行關閉。耐心調試後發現了問題所在,程序裏有使用到以下方法:java

 

       Runtime.getRuntime.exec(cmd)。linux

 

       發如今此處會打開三個流(linux上能夠使用lsof -p pid | wc -l 驗證,每次調用該方法,且不關閉流的話,數量增長3)。 三個流分別是inputStream,outputStream和errorStream。而程序裏只對其中的兩個流進行了關閉。所以,每次調用該方法,都會引發1個file的泄露。長時間運行以後,就超過設置的file上限了。api

 

      泄露什麼的最麻煩了。所以代碼仍是要謹慎處理,打開了莫忘關閉。同時還要對使用的java api有充分的瞭解才行啊。。.net

相關文章
相關標籤/搜索