调试“打开的文件太多”的问题(Debugging the “Too many files open”

2019-08-21 23:11发布

我突然感到工作的应用程序崩溃与

java.io.IOException: ... Too many open files

据我了解的问题,它意味着文件被打开,但没有关闭。

当然堆栈跟踪事后发生,只能帮助之前发生的事件的错误理解。

什么是搜索代码库寻找这个问题,它似乎只当应用程序是高应力负荷下可能发生的一种智能的方式。

Answer 1:

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

这个小Java代理是一个工具,跟踪在那里/时/谁在你的JVM打开的文件。 您可以让代理跟踪这些操作,以了解访问模式或处理泄漏,转储当前打开的文件,其中/时/谁打开他们的名单。

此外,在“打开的文件太多”的例外,该代理将转储列表,让您找出了大量的文件描述符都在使用。

我似乎记得YourKit也有一些解决这个设施,但无法找到目前的任何具体信息。



Answer 2:

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

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

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

  4. 有时候,太多的线程会导致此问题太多。



Answer 3:

什么操作系统? 如果它的Linux / Mac上,还有在/ proc下的信息 ,应该帮助。 在Windows上,使用进程资源管理器 。

至于搜索代码库,或许寻找,捕捉或引发码IOException -我想我/已经赶上/提这个O方法有需要一个高的可能性close()调用。



Answer 4:

您是否尝试过安装使用jvisualvm(Java 5.0和更高版本的JDK bin目录)中运行的进程。 您可以打开正在运行的进程,并做了堆转储(其中,如果你有一个旧的JDK,则需要使用Eclipse或的IntelliJ或NetBeans的等来分析人)。

在JDK 7堆转储按钮是“监视器”选项卡下。 这将创建一个堆转储选项卡,“类”子选项卡,你可以检查,看看是否能在高量存在打开的文件的类。 另一个非常有用的功能是堆转储比较,这样你就可以采取基准堆转储,让您的应用程序运行了一下,然后再经过堆转储和比较两个(链接来比较的是“[堆转储]”选项卡中,得到当你一个,还有一个标志,在java中采取的崩溃或OOM异常堆转储,你可以走这条路线,如果比较堆转储不给你,是造成问题的一个明显的类。此外,“实例”子选项卡中的堆转储差异会告诉你什么是已经在两个堆转储这也可能有助于之间的时间分配。

jvisualvm是一个真棒工具,没有得到足够的提及。



文章来源: Debugging the “Too many files open” issue