java.io.FileNotFoundException: *****(Too many open files) 在linux下跑一个多线程读取文件的程序,待读取文件有数十万个。程序读取过程中抛出如下异常*****(Too many open files)。 原因是由于linux限制了一次会话中,程序最大同时打开文件数目。在redhat5中,该数值为1024。可以使用ulimit -n 验证。 解决办法 1、临时修改该数值,可使用 ulimit -n XXXX 2、永久修改 2.1. 查看当前设置 ulimit -n (默认是1024) 2.2. 查看系统可接受的最大打开文件数(一般默认已足够,不用修改) # cat /proc/sys/fs/file-max (默认可能是372998,已足够) 如果小于你期望的值,可以改大: # echo 327998 > /proc/sys/fs/file-max 或者写入 /etc/sysctl.conf 中,以便重启也能生效: fs.file-max = 327998 2.3. 修改/etc/security/limits.conf文件,设置用户最大打开文件数 #<domain> <type> <item> <value> * - nofile 2048 (添加这一行) 这样即设置系统每个用户的最大打开文件数为2048。 注意 nofile 参数在 type 类型上有2个可能的选项:hard 和 soft ,这两个值都需要设置,“-”代表同时设置这2个值为后面的数字。 hard limit 只是作为 soft limit 的上限,soft limit 才是你设置的系统当前限制。当你设置 hard limit 后,你以后设置的 soft limit 的值就只能小于 hard limit 。普通用户可以降低 hard limit 的值,但是不能提高它,只有 root 用户才能提高 hard limit。 2.4. 退出shell登陆,重新登陆一次即生效(运行ulimit -n 检查) 已经启动的进程,可能需要关闭后重新启动才生效。 (责任编辑:IT) |