我有一个多线程代码,它必须生成一组对象并将它们写入文件。当我运行它时,有时会在异常中收到“打开的文件太多”消息。我检查了代码以确保所有文件流都被正确关闭。这是堆栈跟踪。
当我执行 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 多次。似乎它在创建任何子实例时都打开了基类。
这是正常的吗?除了增加打开文件的数量之外,它还能以其他方式处理吗?