我已经在tomcat(ubuntu 18.04)中部署了Java Rest应用程序。一切正常,直到出现此错误为止:
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文件
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
*硬nofile 65535 根软nproc 65535
root hard nproc 65535
root soft nofile 65535
root hard nofile 65535
webuser硬nofile 64000
注意:这不是数据库连接泄漏,因为我已经跟踪了打开/活动的连接,并且活动连接不超过4个。
答案 0 :(得分:2)
我假设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)
如有必要,增加值。
e.g. : in /etc/security/limits.conf file
tomcat hard nofile 102400
tomcat soft nofile 102400
运行命令:systemctl状态为tomcat
得到tomcat pid
和
检查cat / proc /'tomcat pid'/ limits,如果限制仍为默认值,请在/etc/init.d/tomcat文件中添加以下行。
ulimit -Hn 16384
ulimit -Sn 16384
更改/etc/init.d/tomcat文件后,重新启动tomcat服务以应用更改。
答案 1 :(得分:0)
问题出在Tomcat版本。 9.0.13版将显示“打开的文件太多”错误,即使打开的文件总数在100000个(限制)中也有5000个左右。我将版本更新为9.0.14,现在一切似乎都很好。