首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat打开的文件太多错误(Ubuntu 18.04)

问Tomcat打开的文件太多错误(Ubuntu 18.04)
EN

Stack Overflow用户
提问于 2019-01-12 21:12:49
回答 2查看 2.2K关注 0票数 0

我已经在tomcat (ubuntu 18.04)中部署了我的Java Rest应用程序。在此错误显示之前,一切似乎都很正常:

代码语言:javascript
复制
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/security/limits.conf文件

*软nproc 65535

*硬nproc 65535

*软nofile 65535

*硬nofile 65535根软nproc 65535

根硬nproc 65535

根软nofile 65535

根硬nofile 65535

webuser hard nofile 64000

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-16 22:51:45

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

票数 1
EN

Stack Overflow用户

发布于 2019-01-12 23:34:30

我假设tomcat服务是在tomcat用户下运行的。使用命令lsof -u tomcat | wc -l检查打开的文件使用命令cat /proc/sys/fs/file-max检查整个系统的最大文件句柄数量

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

要使更改永久生效,请在文件/etc/sysctl.conf中添加或更改以下行。此文件在引导过程中使用。echo "fs.file-max=65536" >> /etc/sysctl.conf (值在重启后有效)

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

代码语言:javascript
复制
e.g. : in /etc/security/limits.conf file 
tomcat              hard    nofile          102400
tomcat              soft    nofile          102400

运行命令: systemctl status tomcat获取tomcat pid和

检查cat /proc/'tomcat pid'/ limits,如果限制仍然是默认值,请将以下行添加到/etc/init.d/tomcat文件中。

ulimit -Hn 16384

ulimit -Sn 16384

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54159925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档