正学习java nio, 其中channel在Linux系统中相当于一个文件,
Channels are analogous to "file descriptors" found in Unix-like operating systems.若同时存在的channel数过多, 会导致报如下的异常:
java.net.SocketException: Too many open files at sun.nio.ch.Net.socket0(Native Method) at sun.nio.ch.Net.socket(Net.java:423) at sun.nio.ch.Net.socket(Net.java:416) at sun.nio.ch.SocketChannelImpl.<init>(SocketChannelImpl.java:104) at sun.nio.ch.SelectorProviderImpl.openSocketChannel(SelectorProviderImpl.java:60) at java.nio.channels.SocketChannel.open(SocketChannel.java:142)
但我在命令中查看系统支持的文件描述符数为1024, 如下所示:
$ ulimit -n 1024
而发现实际支持的channel数远大于1024, 直到创建了4000多的SocketChannel才报错.
Start client 4092 java.net.SocketException: Too many open files at sun.nio.ch.Net.socket0(Native Method)
所以现在很困惑, 如何在Linux系统中查看正确的最大文件打开数呢?
在StackOverFlow上提问,有人回复说是jvm做了手脚。写了程序验证此说法,发现jvm还真没闲着。
ProcessBuilderpBuilder=newProcessBuilder("sh","-c","ulimit-n");Processp=pBuilder.start();BufferedReaderreader=newBufferedReader(newInputStreamReader(p.getInputStream()));Stringline=reader.readLine();System.out.println(line);上述程序即为在java代码中执行ulimit-n命令,发现此时输出为4096.
但不确定jvm在何时、何处、怎样对ulimit做了修改。
好几种文件类型。你用ulimit-a可以看到当前用户所有的limit限制。So,ulimit-n只是openfiles。回复 @Feng_Yu:将客户端连接数弄小一点(否则程序就异常退出了),如4079个这时通过lsof(lsof-p19162|wc-l)看到是4123回复 @zgw06629:用lsof看看实际进程打开了多少个文件描述符谢谢!但其他选项与我这个问题不相关啊跟着学习了。你用的root用户吗?终端中执行ulimit-neclipse中运行java程序都是使用普通用户的身份版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。