2010-04-22 79 views
1

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

当我做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) 

现在我们已经通过在打开的文件列表中密切关注目前发现的是,虚拟机打开同一个类文件多次。

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

其中BaseEvent是所有类和EventType1的一部分,ant EventType2分别继承EventType1BaseEvent和EventType2BaseEvent。为什么类加载器会加载相同的类文件200多次?看起来它在创建任何子实例的时候会打开基类。

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

回答

1

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

+0

我们正在使用流口水,我必须看看ClassLoader如何在流口水中使用。 – 2010-04-22 21:54:25

+0

是的,我们查看了剖析器,看起来像DROOLS正在使用所有新的类加载器来应对某些原因。所以我想我们现在将深入探讨如何改变我们使用流口水的方式,以便它不会启动这么多类加载器。 – 2010-04-26 12:42:23

0

我能想到会发生什么的唯一方法是如果您为每个类的实例创建了一个新的类加载器实例。

你确定你没有做别的事吗?