tomcat错误“打开的文件太多”

2024-04-11

我有一个应用程序在 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)

....

SEVERE: Error processed default web.xml named conf/web.xml at /local/myApp/apache-tomcat/conf/web.xml
java.io.FileNotFoundException: /local/myApp/apache-tomcat/conf/web.xml (Too many open files)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at org.apache.catalina.startup.ContextConfig.getWebXmlSource(ContextConfig.java:1838)
        at org.apache.catalina.startup.ContextConfig.getGlobalWebXmlSource(ContextConfig.java:1745)
        at org.apache.catalina.startup.ContextConfig.getDefaultWebXmlFragment(ContextConfig.java:1418)
        at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1253)
        at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5269)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3926)
        at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426)
        at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519)
        at java.lang.Thread.run(Thread.java:722)

我检查打开文件的限制,它是 1024,但是当我使用 lsof 检查应用程序的打开文件数时,它接近 200,如果没有达到限制,为什么会发生这种情况? 我应该增加限额吗?还有其他原因会出现此错误吗? 让服务再次正常运行的唯一方法是重新启动tomcat,还有其他方法恢复正常吗?

提前致谢。

EDIT: 这是处理 doPost 方法的 servlet,一开始我没有关闭每个流,可能是这样吗?我为此添加了finally声明:

    InputStream is = null;
    DataInputStream dis = null;
    OutputStream os = null;
    DataOutputStream dos = null;
    String paramName = "";
    try {
        os = response.getOutputStream();
        is = request.getInputStream();
        dis = new DataInputStream(is);
        dos = new DataOutputStream(os);
        .....
        }catch (Throwable e) {
        LOGGER.error(e.getMessage());
        } finally {
          if (dis != null) {
             dis.close();
           }
           else if(is != null) {
             is.close();
           }                
           if (dos != null) {
             dos.close();
           }
           else if( os != null) {
             os.close();
           }
        }

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());
        }
    }
}

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

ps aux |grep tomcat7

然后做

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

Max open files 16384 16384 files

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

Tomcat 打开的文件太多。 http://www.jayway.com/2012/02/11/how-to-really-fix-the-too-many-open-files-problem-for-tomcat-in-ubuntu/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tomcat错误“打开的文件太多” 的相关文章

随机推荐

  • 从 URL 获取图像作为缓冲区

    我花了几个小时尝试获取图像数据作为缓冲区 搜索结果导致我使用 请求 模块 其他建议导致使用更高版本的节点中的其他模块 我无法使用它 因为我们依赖于节点 v 6 11迄今为止 这是我的试验 request imageURL pipe fs c
  • 如何在没有唯一索引或主键的情况下在 MySQL 中使用 ON DUPLICATE KEY UPDATE?

    MySQL 手册指出 如果指定 ON DUPLICATE KEY UPDATE 并且插入一行 会导致 UNIQUE 索引或 PRIMARY KEY 中出现重复值 如果您的表没有 UNIQUE 索引或 PRIMARY KEY 但您不想重复列的
  • 如何在php中将日期和时间转换为时间戳?

    我有个约会 07 23 2009 和一个时间 18 11 我想从中获取时间戳 这是我的例子 date default timezone set UTC d str replace 07 23 2009 t str replace 18 11
  • 使用 useReducer 时如何获取 useCallback 中的当前状态?

    将 React hooks 与 TypeScript 一起使用 这是我想要做的事情的最小表示 在屏幕上有一个按钮列表 当用户单击按钮时 我想将按钮的文本更改为 单击按钮 并且然后只重新渲染被单击的按钮 我使用 useCallback 来包装
  • 如何在Python中连接整数区间?

    我已经使用了模块间隔 http pyinterval readthedocs io en latest index html http pyinterval readthedocs io en latest index html 并从一组或
  • Ruby on Rails 源代码安全/混淆[重复]

    这个问题在这里已经有答案了 我刚刚开始 Ruby on Rails 开发 我有一个关于源代码 隐私 的问题 据我目前所知 我还没有做部署 只是在本地开发环境中使用了FoR 当部署 RoR 应用程序时 所有源代码在服务器上都是 可见 的 我如
  • 从其子序列的集合中构建最短的字符串

    给定字符串中的子序列的集合 例如 abc acd bcd 问题是 如何从这些序列中确定最短的字符串 对于上面的例子 最短的字符串是abcd Here 子序列表示字符串的一部分 但不一定是连续的 喜欢acd是字符串的子序列abcd Edit
  • 防止 PowerShell 将值类型包装在 PSObject 中

    我有一个使用大量委托的 NET API 我的 API 有几个类似于以下的方法 public static class MyClass public static void DoSomethingWithString Func myFunc
  • 默认 xml 命名空间在 XAML 中如何工作?

    xmlns http schemas microsoft com winfx 2006 xaml presentation 该 url 如何映射到 NET 命名空间 您能否举例说明如何对自定义 NET 类 命名空间执行相同的操作 它是一个必
  • 无法启动 uwsgi 进程

    无法通过 ini 标志启动 uwsgi 进程 uwsgi ini file ini 没有任何 uwsgi pid ps aux grep uwsgi root 31605 0 0 0 3 5732 768 pts 0 S 06 46 0 0
  • 如何计算cosmos DB中的不同值

    我在 Cosmos DB 中创建了一些文档 如下所示 class class01 student lastReport Name st01 score C Name st02 score B lastTime 2018 05 10 clas
  • Django 测试返回登录重定向 302,即使用户已登录

    我对如何测试需要登录的页面感到非常困惑 我在响应中不断收到 302 而不是 200 并且在检查 pdb 中的响应时 我肯定会重定向到登录页面 我正在使用登录中间件而不是装饰器 如果相关的话 class SimplePageLoadsTest
  • Qt 自定义动画按钮

    我正在尝试创建自定义动画按钮 我找到了这个页面 按钮示例 https tympanus net Development ButtonHoverStyles 我喜欢这个网站上的 3 和 19 我试过做3个 但不一样 有人能帮我吗 我的网站上第
  • 我可以将 JavaScript 对象存储在 mySQL 数据库中吗?

    我正在从网页访问者收集数据并将其放入我创建的 JavaScript 对象中 但后来我希望能够引用他们输入的数据 我可以访问 MySQL 数据库 那么有没有办法在那里存储这个对象 我想尝试将其保留为对象格式 而不是将其分解为单独的部分 Sto
  • 在 RecyclerView 中显示包含视频文件的文件夹

    我在回收器视图中列出了所有媒体文件 假设媒体文件位于文件夹中 那么我也想在回收站视图中显示该文件夹 这是我列出媒体文件的代码 var projection arrayOf MediaStore Video Media DISPLAY NAM
  • 如何使用 XPath 2.0 识别数字序列中的重复值?

    我有一个 XPath 表达式 它为我提供了一系列值 如下所示 1 2 2 3 4 5 5 6 7 这很容易转换为一系列唯一值1 2 3 4 5 6 7 using distinct values 但是 我想要提取的是重复值列表 2 5 我想
  • 在哪里可以下载 Jai 和 Jai-imageio? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我需要获取 a 的像素颜色TIFF图片 如果您知道任何替代方案Jai and Jai imageio请告诉我 干得好 http www oracle
  • Application.Run 处的 CallbackOnCollectedDelegate(new Form1())

    我制作了一个非常小的应用程序 使用 SlimDX 捕获游戏中的屏幕 我按左键捕获 捕获有效 至少当我单击表单本身时 但是一旦我单击 Firefox 或任何其他应用程序 我就会收到此异常 对 CaptureScreen CaptureScre
  • R - XTS:从缺少行的每日时间序列中获取每个月的第一个日期和值

    我有一个每日时间序列作为myxtsxts 对象在R 日期格式为 d m y 现在 我想将原始时间序列减少为仅采用该系列中每个月的第一个日期和值的时间序列 myxts indexmday myxts 1 返回包含 d m y 且 d 1 的序
  • tomcat错误“打开的文件太多”

    我有一个应用程序在 tomcat 上运行 有时会出现以下错误 SEVERE Socket accept failed java net SocketException Too many open files at java net Plai