您的位置:首页 > 编程语言 > Java开发

在liunx下经常出现java.net.SocketException: Too many open files错误是什么原因

2010-11-11 21:24 796 查看
发布在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: