调试"打开的文件太多"问题

Jam*_*sev 14 java ioexception

我正在努力的应用程序突然崩溃了

java.io.IOException: ... Too many open files
Run Code Online (Sandbox Code Playgroud)

据我所知,这意味着文件已打开但未关闭.

Stacktrace当然是在事后发生的,只能帮助理解发生了什么事件错误.

什么是一种智能的方式来搜索你的代码库来找到这个问题,这似乎只是在应用程序处于高压力负载时才会发生.

NPE*_*NPE 13

我认为最好的方式来使用专门为目的而设计的工具,比如这一个:

这个小Java代理是一个工具,可以跟踪JVM中何处/何时/谁打开文件.您可以让代理跟踪这些操作以查找访问模式或处理泄漏,并转储当前打开的文件列表以及打开它们的位置/时间/人员.

此外,在"太多打开文件"异常时,此代理将转储列表,允许您找出正在使用大量文件描述符的位置.

我似乎记得YourKit也有一些设施,但目前找不到任何具体信息.


Bla*_*ker 13

  1. 使用 lsof -p pid检查什么原因文件引用的泄露;

  2. 用于ulimit -n查看单个进程的打开文件引用的限制;

  3. 检查任何IO资源项目,是他们及时释放?,需要注意的是,File,Process,Socket(和HTTP连接)都IO资源.

  4. 有时,太多的线程也会导致这个问题.