オブジェクトのセットを生成してファイルに書き込む必要があるマルチスレッド コードがあります。実行すると、例外で「開いているファイルが多すぎます」というメッセージが表示されることがあります。コードをチェックして、すべてのファイル ストリームが適切に閉じられていることを確認しました。これがスタックトレースです。
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 回以上ロードするのはなぜですか。子インスタンスを作成するたびに基本クラスを開いているようです。
これは正常ですか?開いているファイルの数を増やす以外に、他の方法でハンドラーにすることはできますか?