Tomcat報java.io.IOException: 打開的文件過多
阿新 • • 發佈:2018-06-12
java.io.IOException 打開的文件過多 Tomcat報java.io.IOEx 今天後臺服務器(Linux)tomcat應用報java.io.IOException: Too many open files
在網上查了一些資料 記錄如下:
打開的文件過多,一般來說是由於應用程序對資源使用不當造成,比如沒有及時關閉Socket或數據庫連接等。但也可能應用確實需要打開比較多的文件句柄,而系統本身的設置限制了這一數量。 3.對操作系統做相關的設置,增加最大文件句柄數量。
在網上查了一些資料 記錄如下:
打開的文件過多,一般來說是由於應用程序對資源使用不當造成,比如沒有及時關閉Socket或數據庫連接等。但也可能應用確實需要打開比較多的文件句柄,而系統本身的設置限制了這一數量。
異常1: 12-Jun-2018 01:30:15.340 嚴重 [http-nio-8080-Acceptor-0] org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed java.io.IOException: 打開的文件過多 at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:453) at java.lang.Thread.run(Thread.java:748) 異常二 java.net.SocketException: Too many open files at java.net.PlainSocketImpl.accept(Compiled Code) at java.net.ServerSocket.implAccept(Compiled Code) at java.net.ServerSocket.accept(Compiled Code) at weblogic.t3.srvr.ListenThread.run(Compiled Code) 第一個異常則在錯誤影響到 I/O 操作時拋出,而第二個異常在錯誤影響到基礎 TCP 協議時拋出。
文件打開數過多最壞的情況可以使系統崩潰,到時候只能是重起服務器了。
原因:
操作系統的中打開文件的最大句柄數受限所致,常常發生在很多個並發用戶訪問服務器的時候.因為為了執行每個用戶的應用服務器都要加載很多文件(new一個socket就需要一個文件句柄),這就會導致打開文件的句柄的缺乏.
解決:
1.盡量把類打成jar包,因為一個jar包只消耗一個文件句柄,如果不打包,一個類就消耗一個文件句柄.
2.java的垃圾回收不能關閉網絡連接打開的文件句柄,如果沒有執行close()(例如:java.net.Socket.close())則文件句柄將一直存在,而不能被關閉.你也可以考慮設置socket的最大打開數來控制這個問題.
a、Linux 在 Linux內核2.4.x中需要修改源代碼,然後重新編譯內核才生效。 編輯Linux內核源代碼中的 include/linux/fs.h文件,將 NR_FILE 由8192改 為65536,將NR_RESERVED_FILES 由10 改為 128。編輯fs/inode.c 文件將 MAX_INODE 由16384改為262144。或者編輯 /etc/sysctl.conf 文件增加兩行 fs.file-max = 65536 和 fs.inode-max = 262144 。一般情況下,系統最大打開 文件數比較合理的設置為每4M物理內存256,比如256M.可以用 lsof -p <pid of process>看打開的文件句柄數。 b、Windows 最大文件句柄是16,384,你在任務管理器的性能這一項中可以看到當前打開 的句柄數。
服務器端修改:
查看系統允許打開的最大文件數
#cat /proc/sys/fs/file-max
查看每個用戶允許打開的最大文件數ulimit -a
發現系統默認的是open files (-n) 1024,問題就出現在這裏。
在系統文件/etc/security/limits.conf中修改這個數量限制,在文件中加入內容:
* soft nofile 65536
* hard nofile 65536
修改完成保存,重啟服務器
另外方法:
1.使用ps -ef |grep java
(java代表你程序,查看你程序進程) 查看你的進程ID,記錄ID號,假設進程ID為1305
2.使用:lsof -p 1305 | wc -l
查看當前進程id為1305的 文件操作狀況
執行該命令出現文件使用情況為 1192
3.使用命令:ulimit -a
查看每個用戶允許打開的最大文件數
發現系統默認的是open files (-n) 1024,問題就出現在這裏。
4.然後執行:ulimit -n 4096
將open files (-n) 1024 設置成open files (-n) 4096
這樣就增大了用戶允許打開的最大文件數
Tomcat報java.io.IOException: 打開的文件過多