我有一个多线程代码,必须生成一组对象并将它们写入文件。当我运行它时,我有时会在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多次?看起来它在创建任何子实例的时候会打开基类。
这是正常的吗?除了增加打开文件的数量之外,它可以以任何其他方式处理吗?
我们正在使用流口水,我必须看看ClassLoader如何在流口水中使用。 – 2010-04-22 21:54:25
是的,我们查看了剖析器,看起来像DROOLS正在使用所有新的类加载器来应对某些原因。所以我想我们现在将深入探讨如何改变我们使用流口水的方式,以便它不会启动这么多类加载器。 – 2010-04-26 12:42:23