【问题标题】:Too many open files in one of my java routine我的一个 java 例程中打开的文件太多
【发布时间】:2011-10-18 14:44:19
【问题描述】:

我有一个多线程代码,它必须生成一组对象并将它们写入文件。当我运行它时,有时会在异常中收到“打开的文件太多”消息。我检查了代码以确保所有文件流都被正确关闭。这是堆栈跟踪。

当我执行 ulimit -a 时,允许打开的文件设置为 1024。我们认为增加这个数字不是一个可行的选项/解决方案。

 [java] java.io.FileNotFoundException: /export/event_1_0.dtd (Too many open files)
 [java]     at java.io.FileInputStream.open(Native Method)
 [java]     at java.io.FileInputStream.<init>(FileInputStream.java:106)
 [java]     at java.io.FileInputStream.<init>(FileInputStream.java:66)
 [java]     at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
 [java]     at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
 [java]     at java.net.URL.openStream(URL.java:1010)

到目前为止,通过仔细查看打开文件列表,我们发现 VM 正在多次打开同一个类文件。

/export/BaseEvent.class 236
/export/EventType1BaseEvent.class 60
/export/EventType2BaseEvent.class 48
/export/EventType2.class 30
/export/EventType1.class 14

BaseEvent 是所有类的一部分,EventType1 和 EventType2 分别继承 EventType1BaseEvent 和 EventType2BaseEvent。为什么类加载器会加载相同的类文件 200 多次。似乎它在创建任何子实例时都打开了基类。

这正常吗?除了增加打开文件的数量之外,它可以通过其他方式处理吗?

【问题讨论】:

    标签: java linux drools


    【解决方案1】:

    你对类加载器做了什么特别的事情吗?如果您正在做一些有趣的事情,例如每个线程都有一个类加载器,那么您可能会让每个加载器读取类文件。

    【讨论】:

    • 我们用的是drool,我得看看ClassLoader是怎么在drools中使用的。
    • 是的,我们查看了分析器,看起来 DROOLS 出于某种原因正在使用所有新的类加载器。所以我想我们现在将深入研究我们应该如何改变我们使用 drools 的方式,这样它就不会启动这么多的类加载器。
    【解决方案2】:

    我能想到的唯一方法是为类的每个实例创建一个新的类加载器实例。

    你确定你没有做其他奇怪的事情吗?

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 2011-09-10
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      相关资源
      最近更新 更多