訪問伺服器時出現java.IOException:開啟的檔案過多
阿新 • • 發佈:2019-01-24
應用部署在一臺測試機器上(Linux),最近發現服務好像掛了。上去看了下打出來的日誌,發現報錯資訊一個是java.net.SocketException,一個是Java.IOException,提示開啟的檔案過多。 後來去查了查:說是第一個是在錯誤影響到基礎的TCP協議時會丟擲,第二個則是在錯誤影響到I/O操作時丟擲。 原因:作業系統中開啟檔案的最大控制代碼數受限所致,常常發生在多個使用者併發訪問伺服器時,因為為了執行每一個使用者的請求,伺服器都要載入很多檔案(new一個socket就需要一個檔案控制代碼),這就會導致開啟檔案的控制代碼缺乏。 解決方法: 1)儘量將類打成jar包,因為一個jar包只消耗一個檔案控制代碼,如果不打包,一個類就消耗一個檔案控制代碼;Java的GC不能關閉網路連線開啟的檔案控制代碼,因此如果沒有執行close操作,則檔案控制代碼將一直存在,而不能 被關閉,因此也可以設定socket的最大開啟數去控制。 2)對作業系統做相關的設定,增加最大檔案控制代碼數量。下面是第二種方法的步驟:步驟:
1)linux下輸入ulimit -a命令,可檢視允許開啟的最大檔案數等各種資訊。如圖所示:
open files這一欄預設的是1024(我的截圖是修改過後的,所以變成了65536),我們需要做的就是修改這個數量。 2)修改這個配置檔案,命令:vi /etc/security/limits.conf 3)在檔案中新增以下內容: * soft nofile 65536 * hard nofile 65536 4)重啟服務。