1

オブジェクトのセットを生成してファイルに書き込む必要があるマルチスレッド コードがあります。実行すると、例外で「開いているファイルが多すぎます」というメッセージが表示されることがあります。コードをチェックして、すべてのファイル ストリームが適切に閉じられていることを確認しました。これがスタックトレースです。

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 回以上ロードするのはなぜですか。子インスタンスを作成するたびに基本クラスを開いているようです。

これは正常ですか?開いているファイルの数を増やす以外に、他の方法でハンドラーにすることはできますか?

4

2 に答える 2

1

クラスローダーで何か特別なことをしていますか? スレッドごとにクラス ローダーを使用するなど、何か興味深いことを行っている場合は、各ローダーにクラス ファイルを読み取らせることができます。

于 2010-04-22T21:10:25.810 に答える
0

それがどこで起こるかを考える唯一の方法は、クラスのインスタンスごとに新しいクラス ローダー インスタンスを作成した場合です。

他に奇妙なことをしていませんか?

于 2010-04-22T21:13:14.697 に答える