应用部署在一台测试机器上(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)重启服务。