1

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

当我执行 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 多次。似乎它在创建任何子实例时都打开了基类。

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

4

2 回答 2

1

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

于 2010-04-22T21:10:25.810 回答
0

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

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

于 2010-04-22T21:13:14.697 回答