开发者社区> 问答> 正文

Linux系统中如何查看真实的可支持的最大文件打开数??报错

    正学习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系统中查看正确的最大文件打开数呢?

展开
收起
爱吃鱼的程序员 2020-06-14 15:51:04 795 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    在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程序都是使用普通用户的身份
    2020-06-14 15:51:21
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载