当前位置: 首页 > 知识库问答 >
问题:

Tomcat打开文件过多错误(Ubuntu 18.04)

田信然
2023-03-14

我已经在tomcat(ubuntu 18.04)中部署了我的JavaRest应用程序。一切似乎都很好,直到这个错误显示:

java.io.FileNotFoundException: /opt/tomcat/webapps/botiv1/WEB-INF/lib/javax.inject-2.5.0-b42.jar (Too many open files)
    java.base/java.io.RandomAccessFile.open0(Native Method)
    java.base/java.io.RandomAccessFile.open(RandomAccessFile.java:345)
    java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:259)
    java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:214)
    java.base/java.util.zip.ZipFile$Source.<init>(ZipFile.java:1263)
    java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1229)
    java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:727)
    java.base/java.util.zip.ZipFile$CleanableResource.get(ZipFile.java:845)
    java.base/java.util.zip.ZipFile.<init>(ZipFile.java:245)
    java.base/java.util.zip.ZipFile.<init>(ZipFile.java:175)
    java.base/java.util.jar.JarFile.<init>(JarFile.java:341)
    java.base/jdk.internal.reflect.GeneratedConstructorAccessor7.newInstance(Unknown Source)
    java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
    org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:209)
    org.apache.tomcat.util.compat.JreCompat.jarFileNewInstance(JreCompat.java:149)
    org.apache.catalina.webresources.AbstractArchiveResourceSet.openJarFile(AbstractArchiveResourceSet.java:307)
    org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.getArchiveEntry(AbstractSingleArchiveResourceSet.java:97)
    org.apache.catalina.webresources.AbstractArchiveResourceSet.getResource(AbstractArchiveResourceSet.java:256)
    org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:281)
    org.apache.catalina.webresources.Cache.getResource(Cache.java:62)
    org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:216)
    org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(StandardRoot.java:225)
    org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2260)
    org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:834)
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1297)
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
    org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:422)
    org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:285)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:272)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:268)
    org.glassfish.jersey.internal.Errors.process(Errors.java:316)
    org.glassfish.jersey.internal.Errors.process(Errors.java:298)
    org.glassfish.jersey.internal.Errors.process(Errors.java:268)
    org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289)
    org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
    org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703)
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    com.ritech.model.CORSFilter.doFilter(CORSFilter.java:59)

我已将限制设置为65000,但几个小时后仍然会出现此错误。

/etc/安全/限制。conf文件

*软nproc 65535

*硬nproc 65535

*软nofile 65535

*硬nofile 65535根软nproc 65535

根硬nproc 65535

根软nofile 65535

root硬nofile 65535

webuser硬nofile 64000

注意:这不是数据库连接泄漏,因为我跟踪了打开/活动连接,并且活动连接不超过4个。

共有2个答案

傅越
2023-03-14

问题出在Tomcat版本上。版本9.0.13将显示“打开的文件太多”错误,即使打开的文件总数约为100000个文件中的5000个(限制)。我将版本更新到9.0.14,现在一切都很好。

章心水
2023-03-14

我假设tomcat服务是在tomcat用户下运行的。使用以下命令检查打开的文件:cat/proc/sys/fs/file max

使用命令检查文件句柄的当前用法:cat /proc/sys/fs/file-nr

要使更改永久化,请在文件/etc/sysctl.conf中添加或更改以下行。此文件在引导过程中使用。回显"fs.file-max=65536"

运行命令ulimited-a并检查打开文件的数量(-n)和最大用户进程(-u),必要时增加值。

e.g. : in /etc/security/limits.conf file 
tomcat              hard    nofile          102400
tomcat              soft    nofile          102400

run命令:systemctl status tomcat get和

检查cat/proc/tomcat pid/limits,如果limits仍为默认值,则在/etc/init的下面添加行。d/tomcat文件。

ulimited-Hn 16384

ulimit-Sn 16384

更改/etc/init后。d/tomcat文件重新启动tomcat服务以应用更改。

 类似资料:
  • 我想知道太多文件打开错误的确切问题。我通过谷歌寻找解决方案,但我不知道为什么会出现这个问题以及如何解决这个问题。 堆栈错误:严重:套接字接受失败。网SocketException:java上打开的文件太多。网普通袜子。java上的socketAccept(本机方法)。网抽象素socketimpl。在java上接受(AbstractPlainSocketImpl.java:398)。网服务器插座。j

  • 问题内容: 创建容器时出现该错误消息。 但是我找不到有关该错误的任何信息。(我看到了https://github.com/docker/libcontainer/issues/211,但是那不是同样的问题。)有人知道吗? 谢谢。 问题答案: 默认的打开文件数限制为1024。可以通过两种方式增加它: 使用参数运行容器: 使用mode 运行容器并执行。 您可以在此处找到更多信息。

  • 我有一个在tomcat上运行的应用程序,有时会出现以下错误: .... 我检查了打开文件的限制,它是1024个,但是当我检查了lsof应用程序的打开文件数量时,它接近200个,如果它没有达到限制,为什么会发生这种情况?我应该增加限额吗?是否有其他原因导致此错误?让服务重新正常运行的唯一方法是重新启动tomcat,还有其他恢复正常的方法吗? 提前谢谢。 编辑:这里是处理doPost方法的servle

  • 今天早些时候,我访问了我最近推出的一个网站,页面上充斥着一个丑陋的jasperex0019:java.io.filenotfoundexception: /opt/tomcat/webapps/root/web-inf/lib/jstl-1.2.jar(打开的文件太多)。我检查了我的服务器日志和tomcat日志,它们充满了相同的错误。我增加了tomcat的最大打开文件限制,作为保持网站运行的临时解

  • 我们正在AmazonLinux中的ApacheTomcat中运行一个web服务。最初web服务运行正常。在发出1000多个web请求后,我们收到了太多的打开文件异常。当我们重新启动tomcat服务器时,这个问题将再次得到解决。 请查看以下例外情况 附言:我们在网络服务中没有做任何与文件相关的操作。

  • 我正在编写一个需要读取/写入大量文件的遗传算法。GA的适用性测试是调用一个名为的程序,该程序将文件作为输入并生成文件作为输出。 一切都在工作,除非我使遗传算法的种群规模和/或总代数太大。然后,经过这么多代人,我开始得到这个:(我为许多不同的文件反复得到它,索引 只是我上次运行它时首先出现的那个)。这很奇怪,因为我不是在第一代或第二代之后得到错误,而是在相当多的世代之后,这表明每一代都会打开更多它没