java服务报错 FileNotFoundException:打开的文件过多

简介: java服务报错 FileNotFoundException:打开的文件过多

./log-error-2023-05-05.0.log:java.io.FileNotFoundException: /tmp/tomcat.8054.6662226014931657024/work/Tomcat/localhost/ROOT/upload_2de0ae12_86e7_49cd_b138_fc8af49b7a59_00006179.tmp (打开的文件过多)

服务突然宕机 出现这个错误

打开的文件过多,一般来说是由于应用程序对资源使用不当造成,比如没有及时关闭Socket或数据库连接等。但也可能应用确实需要打开比较多的文件句柄,而系统本身的设置限制了这一数量。

过程

最开始还以为是linux文件数不不够,不停的调整文件打开大小

查看系统允许打开的最大文件数

#cat /proc/sys/fs/file-max

查看每个用户允许打开的最大文件数

ulimit -a

发现系统默认的是open files (-n) 1024,问题就出现在这里。

在系统文件/etc/security/limits.conf中修改这个数量限制,在文件中加入内容:

* soft nofile 65536 
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
* soft  memlock  unlimited
* hard memlock  unlimited

或只加下面两个参数都行的
* soft nofile 65536 
* hard nofile 65536
修改完成保存,重启服务器

错误

异常1:
12-Jun-2018 01:30:15.340 严重 [http-nio-8080-Acceptor-0] org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed
 java.io.IOException: 打开的文件过多
  at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
  at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
  at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
  at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:453)
  at java.lang.Thread.run(Thread.java:748)

异常二
java.net.SocketException: Too many open files

    at java.net.PlainSocketImpl.accept(Compiled Code) 
    at java.net.ServerSocket.implAccept(Compiled Code) 
    at java.net.ServerSocket.accept(Compiled Code) 
    at weblogic.t3.srvr.ListenThread.run(Compiled Code) 
  
第一个异常则在错误影响到 I/O 操作时抛出,而第二个异常在错误影响到基础 TCP 协议时抛出。

分析

  1. 可能是tomcat文件/tmp/tomcat.8054.6662226014931657024/work/Tomcat/localhost 说明是这个目录下的文件找不到了,后来经过查资料,tmp的文件10天之内不访问就会删除,所以可能是这个原因,调整tomcat的日志路径
#tomcat
server.tomcat.basedir=/home/tomcatlog
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern= '%h %l %u %t "%r" %s %b %D %{User-Agent}i'
  1. 使用命令lsof -p 进程id可以查看单个进程所有打开的文件详情,使用命令lsof -p 进程id | wc -l可以统计进程打开了多少文件:

查看进程打开的文件

lsof -p 31878

发现大量文件

改成静态

lsof -p 1305 | wc -l 查看当前进程id为1305的 文件操作状况

  1. 如果你对你的程序有一定的解的话,应该对程序打开文件数(链接数)上限有一定的估算,如果感觉数字异常,请使用第一步的lsof -p 进程id > openfiles.log命令,获得当前占用句柄的全部详情进行分析,

1)打开的这些文件是不是都是必要的?

2)定位到打开这些文件的代码

3)是否程序操作了文件写入,但是没有进行正常关闭

4)是否程序进行了通讯,但是没有正常关闭(也就是没有超时结束的机制)

实战

崩溃的原因 文件打开过多,解决方案:

lsof -p 19945 | wc -l 进程pid为19945的文件打开数

lsof -p 19945 进程的文件打开详情

之前设置的各种文件打开最大数限制好像并未生效,文件数到4096就开始报错了

后来使用arthas查到了jvm打开最大文件数是4096

MAX-FILE-DESCRIPTOR-COUNT:JVM 进程最大可以打开的文件描述符数

OPEN-FILE-DESCRIPTOR-COUNT:JVM 当前打开的文件描述符数

找到对应代码之后,使用postman调用,每次调用文件打开数就会+1,查找到内存泄露的代码后,改完,再次使用postman调用,文件打开数不再明显增长

目录
相关文章
|
4天前
|
Java
【Java开发指南 | 第二十一篇】Java流之文件
【Java开发指南 | 第二十一篇】Java流之文件
13 0
|
2天前
|
消息中间件 关系型数据库 网络安全
实时计算 Flink版操作报错合集之Flink sql-client 针对kafka的protobuf格式数据建表,报错:java.lang.ClassNotFoundException 如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
13 1
|
2天前
|
消息中间件 Java Kafka
Java大文件排序(有手就能学会),kafka面试题2024
Java大文件排序(有手就能学会),kafka面试题2024
|
3天前
|
Java Kotlin
java调用kotlin代码编译报错“找不到符号”的问题
java调用kotlin代码编译报错“找不到符号”的问题
17 10
|
4天前
|
Kubernetes 网络协议 Java
容器服务Kubernetes版产品使用合集之遇到报错"java.lang.NoClassDefFoundError"如何解决
容器服务Kubernetes版,作为阿里云提供的核心服务之一,旨在帮助企业及开发者高效管理和运行Kubernetes集群,实现应用的容器化与微服务化。以下是关于使用这些服务的一些建议和合集,涵盖基本操作、最佳实践、以及一些高级功能的使用方法。
17 2
|
4天前
|
安全 Java 开发者
Java一分钟之-文件与目录操作:Path与Files类
【5月更文挑战第13天】Java 7 引入`java.nio.file`包,`Path`和`Files`类提供文件和目录操作。`Path`表示路径,不可变。`Files`包含静态方法,支持创建、删除、读写文件和目录。常见问题包括:忽略异常处理、路径解析错误和权限问题。在使用时,注意异常处理、正确格式化路径和考虑权限,以保证代码稳定和安全。结合具体需求,这些方法将使文件操作更高效。
11 2
|
4天前
|
前端开发 Java 应用服务中间件
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
17 0
|
4天前
|
Java 开发者
Java一分钟之-Java IO流:文件读写基础
【5月更文挑战第10天】本文介绍了Java IO流在文件读写中的应用,包括`FileInputStream`和`FileOutputStream`用于字节流操作,`BufferedReader`和`PrintWriter`用于字符流。通过代码示例展示了如何读取和写入文件,强调了常见问题如未关闭流、文件路径、编码、权限和异常处理,并提供了追加写入与读取的示例。理解这些基础知识和注意事项能帮助开发者编写更可靠的程序。
17 0
|
4天前
|
Java
JDK环境下利用记事本对java文件进行运行编译
JDK环境下利用记事本对java文件进行运行编译
16 0
|
4天前
|
JavaScript 小程序 Java
Java毕设之在线医疗服务系统的设计与实现
Java毕设之在线医疗服务系统的设计与实现
14 3