【发布时间】:2012-01-25 23:08:06
【问题描述】:
我的 Java 程序失败了
Caused by: java.io.IOException: Too many open files
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:883)...
这里是来自/etc/security/limits.conf 的关键行。他们将用户的最大文件设置为 500k:
root soft nofile 500000
root hard nofile 500000
* soft nofile 500000
* hard nofile 500000
我运行lsof 来计算打开的文件数——全局和 jvm 进程。我检查了/proc/sys/fs 中的计数器。一切似乎都很好。我的进程只打开了4301个文件,限制为500k:
:~# lsof | wc -l
5526
:~# lsof -uusername | wc -l
4301
:~# cat /proc/sys/fs/file-max
744363
:~# cat /proc/sys/fs/file-max
744363
:~# cat /proc/sys/fs/file-nr
4736 0 744363
这是一个 Ubuntu 11.04 服务器。我什至已经重新启动,所以我很肯定这些参数正在被使用。
我不知道它是否相关,但该进程是由一个 upstart 脚本启动的,该脚本使用 setuidgid 启动该进程,如下所示:
exec setuidgid username java $JAVA_OPTS -jar myprogram.jar
我错过了什么?
【问题讨论】:
-
尝试更新你的堆空间并给它一个更大的最大值。不知道为什么这两者会相关,但我在无数不同的问题上都遇到了这个错误。
-
很有趣,谢谢。但它已经是-Xmx5800m :)
-
您在进程树的某个位置使用 ulimit 设置新限制?