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调用,文件打开数不再明显增长

目录
相关文章
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
74 9
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
16天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
79 34
|
1月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
59 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
1月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
41 3
|
1月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
1月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
88 2
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
57 4
|
1月前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
存储 设计模式 缓存
听说你还不懂 Java 的服务定位器模式(Service Locator Pattern)?(上)
听说你还不懂 Java 的服务定位器模式(Service Locator Pattern)?
207 0
听说你还不懂 Java 的服务定位器模式(Service Locator Pattern)?(上)