2010-04-22 30 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

我能想到會發生什麼的唯一方法是如果您爲每個類的實例創建了一個新的類加載器實例。

你確定你沒有做別的事嗎?

相關問題