java - 我的一个 Java 例程中打开的文件太多

标签 java linux drools

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

当我执行 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/

相关文章:

java - JUnit - 使用可重用函数进行测试;有效性

java - 查找所有排列代码问题 (Java)

linux - 在 systemd 中停止服务之前卸载文件系统

c++ - Linux 中 QToolButton 的事件处理问题

Java,如何进入JPanel

linux - 在搜索路径中调用二进制文件与显式调用它

java代码访问drools guvnor

java - 为什么我们不能用 Java 文件而不是 .drl 文件来编写业务规则?

java - swing创建自定义Jbutton问题