Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java tomcat中的错误";“打开的文件太多”;_Java_Tomcat_Servlets_Tomcat7 - Fatal编程技术网

Java tomcat中的错误";“打开的文件太多”;

Java tomcat中的错误";“打开的文件太多”;,java,tomcat,servlets,tomcat7,Java,Tomcat,Servlets,Tomcat7,我有一个在tomcat上运行的应用程序,有时会出现以下错误: SEVERE: Socket accept failed java.net.SocketException: Too many open files at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) at java.net

我有一个在tomcat上运行的应用程序,有时会出现以下错误:

SEVERE: Socket accept failed
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
at java.net.ServerSocket.implAccept(ServerSocket.java:522)
at java.net.ServerSocket.accept(ServerSocket.java:490)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)
at java.lang.Thread.run(Thread.java:722)

EDIT2: 在做了一些测试之后,我意识到如果我先关闭DataInputStream,然后关闭InputStream,我会在通信的另一部分得到消息之前的一个数字(我不知道为什么)。我改变了关闭流程的顺序,似乎一切都正常。但我还是有问题。有什么想法吗

  finally {

    if(is != null) {
        try {
            is.close();
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
    }
    if (dis != null) {
        try {
            dis.close();
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
    }
    if(os != null) {
        try {
            os.close();
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
    }
    if (dos != null) {
        try {
            dos.close();
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
    }
}

您可以通过将以下内容添加到
/etc/security/limits.conf
,来更改打开文件的限制,这可能很有用:

* soft nofile 2048 # Set the limit according to your needs
* hard nofile 2048
然后您可以使用shell上的
sysctl-p
重新加载配置。检查


为了完整起见,您可以使用以下命令验证打开文件的当前限制:
ulimit-n

执行以下操作以获取tomcat7的pid,例如1234

ps aux |grep tomcat7
然后呢

cat/proc/1234/limits
读取如下行

Max open files 16384 16384 files

这是Tomcat允许的最大打开文件数。要增加它,请按照以下说明操作

  • 如果这段代码来自网络操作(sockets),我不确定javaxxxxxstrem是否与操作系统文件限制有1:1的关系(或者根本没有关系)。可能需要一些研究,异常消息有错误的文本?通常在软件方面

  • 我的直觉告诉我,我们不理解异常2,代码中的任何内容(或问题中缺少的配置)都没有关系

  • 当软件错误(泄漏)是主要问题时,扩展操作系统文件限制是错误的策略,正如您所理解的


  • @gaboroncancio发布的答案基本正确,但他关于如何使设置生效的建议并不完全正确
    sysctl-p
    将重新加载
    /etc/sysctl.conf
    ,或作为参数传入的任何文件。但是,
    sysctl
    命令将无法识别
    /etc/security/limits.conf
    的格式


    要重新加载
    /etc/security/limits.conf
    ,您只需注销并重新登录。

    按照以下说明快速分析服务器的当前配置,并调整tomcat硬限制和软限制以解决此问题

    这将显示该进程的所有打开的文件

    ls -l /proc/tomcatPID/fd 
    
    这将显示打开文件的计数

    ls -l /proc/tomcatPID/fd | wc -l 
    
    =============================
    #!/bin/bash
    
    PID=$(ps -ef|grep tomcat6|grep -v grep |awk '{print $2}')
    value=$(ls -l /proc/$PID/fd | wc -l)
    echo `date`@$PID:$value >> /usr/local/filecount.txt
    if [ $value -gt 2000 ];
    then
    printf "\n\n\n\n\n" >> /usr/local/files_report.txt
    echo "-------------------------------`date`--Starting Session----------------------" >> /usr/local/files_report.txt
    openfiles=$(ls -l /proc/$PID/fd | awk '{print NR,$11 "" >> "/usr/local/files_report.txt"}')
    echo "--------------------`date`---Ending  Session ------------------------------" >> /usr/local/files_report.txt
    fi
    ================= 
    
    要增加打开文件的限制,请更新
    /etc/security/limits.conf

    要检查特定于tomcat的打开文件的数量,请执行以下操作:

    硬限制:
    su-tomcat-c'ulimit-Hn'-s'/bin/bash'

    软限制:
    su-tomcat-c'ulimit-Sn'-s'/bin/bash'

    您可以使用corn作业运行下面的脚本,以了解打开文件的详细信息

    ls -l /proc/tomcatPID/fd | wc -l 
    
    =============================
    #!/bin/bash
    
    PID=$(ps -ef|grep tomcat6|grep -v grep |awk '{print $2}')
    value=$(ls -l /proc/$PID/fd | wc -l)
    echo `date`@$PID:$value >> /usr/local/filecount.txt
    if [ $value -gt 2000 ];
    then
    printf "\n\n\n\n\n" >> /usr/local/files_report.txt
    echo "-------------------------------`date`--Starting Session----------------------" >> /usr/local/files_report.txt
    openfiles=$(ls -l /proc/$PID/fd | awk '{print NR,$11 "" >> "/usr/local/files_report.txt"}')
    echo "--------------------`date`---Ending  Session ------------------------------" >> /usr/local/files_report.txt
    fi
    ================= 
    

    是的,我检查了这个网站,但作为一项服务,它的最大使用量也不超过200,为什么要将限制提高到4096?你应该首先在网站上搜索你的错误:共享你的代码!如果没有任何代码片段,我们将无能为力。@developerwjk首先,我检查了网站,增加打开文件的限制可能是个主意,但由于我没有达到限制的上限,我想这并不能解决我的问题。tomcat是在Windows还是在Linux机器上运行?我已经检查并将打开的文件数量增加到无法访问的数量。我认为这更像是对应用程序内部线程的糟糕管理,是吗?是的,我想你可能在应用程序中泄漏了文件处理程序/连接。有没有办法查看那些打开的文件的列表?查看哪个线程打开了它们会很有用。格式化好。是的,重新加载值需要返回日志