Java Apache Mina出现太多打开文件错误的风险是什么?如何修复它?

Java Apache Mina出现太多打开文件错误的风险是什么?如何修复它?,java,apache-mina,Java,Apache Mina,我有一个用ApacheMina编写的套接字应用程序,使用Linux操作系统 这一次,当我看到包含以下代码的日志文件时,出现了太多错误: IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast("logger", new LoggingFilter()); acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(ne

我有一个用ApacheMina编写的套接字应用程序,使用Linux操作系统

这一次,当我看到包含以下代码的日志文件时,出现了太多错误:

IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
acceptor.setCloseOnDeactivation(true);
acceptor.setHandler(new ChatHandler());
acceptor.getSessionConfig().setReadBufferSize(2);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
acceptor.bind(new InetSocketAddress(15000));
当我同时使用2-3客户端测试它时,我得到了以下错误:

Caused by: java.io.IOException: Too many open files
at sun.nio.ch.IOUtil.makePipe(Native Method) ~[?:?]
at sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:65) ~[?:?]
at sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:36) ~[?:?]
at java.nio.channels.Selector.open(Selector.java:227) ~[?:?]
at org.apache.mina.transport.socket.nio.NioProcessor.<init>(NioProcessor.java:59) ~[MC.jar:?]
原因:java.io.IOException:打开的文件太多
在sun.nio.ch.IOUtil.makePipe(本机方法)~[?:?]
在sun.nio.ch.EPollSelectorImpl.(EPollSelectorImpl.java:65)~[?:?]
在sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:36)~[?:?]
在java.nio.channels.Selector.open(Selector.java:227)~[?:?]
在org.apache.mina.transport.socket.nio.NioProcessor.(NioProcessor.java:59)~[MC.jar:?]
我已经在谷歌上搜索过了,但我不知道这个异常的风险是什么,这个错误会不会让我的应用程序在交易中失败


如果是,有人能解释一下吗?如何解决呢?

这可能是一个相当大的问题。此错误(
ENFILE
)表示您或操作系统的打开文件描述符过多

stdin、stdout和stderr是文件描述符;任何打开的文件都是文件描述符;您创建的任何套接字都是文件描述符

要了解您的打开文件限制,作为用户,请执行以下操作:

ulimit -n
要了解操作系统的限制,请执行以下操作:

cat /proc/sys/fs/file-max
一般来说,问题在于用户限制

您可以尝试使用以下方法提高限制:

ulimit -n <a greater number here>
请注意,为了使这些限制生效,用户必须注销并再次登录;如果是专用于系统服务的用户,则重新启动此服务即可

此外,如果您知道运行应用程序的进程的PID,则可以通过发出以下命令查看当前打开的文件描述符的数量:

ls /proc/<thepid>/fd|wc -l
ls/proc//fd | wc-l


如果内核限制是问题所在(不太可能,但谁知道呢),那么您必须编辑
/etc/sysctl.conf
并更改
proc.sys.fs.file max
条目,然后以
root

的身份运行
sysctl
,我确信您可能不会调用连接器的
dispose
方法

此方法通过调用ExecuteService的shutdown方法来关闭业务线程


同时设置disposed的内部标志,以标记需要停止的连接器,
工作线程
通过该标志停止

是的,这很烦人。解决它取决于你使用的操作系统。只是烦人?你能解释一下如果我犯了这个错误会发生什么吗?我正在使用linux。好的,我会更新它,顺便说一句,谢谢你的回复。请看我的答案以获得解释和解决方法。谢谢你的回答,这解决了我的问题,非常感谢你让我先试试,你的答案真的很棒。
ls /proc/<thepid>/fd|wc -l