我有一个多线程代码,它必须生成一组对象并将它们写入一个文件。当我运行它时,我有时会在异常中收到“打开的文件太多”消息。我检查了代码以确保所有文件流都被正确关闭。这是堆栈跟踪。
当我执行 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 - 我的一个 Java 例程中打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2694443/