1. 程式人生 > >在liunx下經常出現java.net.SocketException: Too many open files錯誤是什麼原因

在liunx下經常出現java.net.SocketException: Too many open files錯誤是什麼原因

釋出在Tomcat+linux伺服器上的專案經常報”java.net.SocketException: Too many open files"的錯誤,根據錯誤分析如下 :

Linux 系統預設的open files的設定是1024

通過 ulimit -a進行檢視。
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
pending signals                 (-i) 1024
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 16127
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
訪問應用時,作業系統new Socket去連線檔案,當連線數超過系統的設定時候,這時候就報了這類錯誤。
解決方法 :
1、設定Linux的允許的open files的個數,設定方法 ulimit -n 連線數
2、將classes目錄下的class檔案打包成jar的方式,減少new Socket的數量。

ulimit -n 4096
把開啟檔案數的上限設為了4096,這下好了,專案又穩定了,嘻嘻,正為這事高興了,

沒想到過兩天後又重新出這個錯誤了,鬱悶,兩個小時報一次,報之後就掛掉了,什麼原因了,

在重新用ulimit -a檢視,這下傻了,發現open files      (-n) 1024 又變回了1024了,想到原因了,

報這個錯誤就在我那次登陸更新之後又報的,原來ulimit -n 4096 命令只能臨時的改變open files    的值,當

重新登陸後又會恢復,所以需要永久設定open files    的值才行啊,至於永久修改的方法大家可以google一下啊,

呵呵,這次永久修改後程式就再沒那個問題了,一直穩定執行。

另外遇到這個問題這後還需要檢查我們的程式對於操作io的流是否在操作完之後關閉,這才是從最更本上的解決。

以上就是我解決這個問題的過程,希望對大家有些幫助。

用ulimit -n 修改open files 總是不能保持。所以用下面一個簡單的辦法更好些。

修改/etc/security/limits.conf 新增如下一行:

* - nofile 1006154

修改/etc/pam.d/login新增如下一行

session required /lib/security/pam_limits.so