Linuxおよび他のUNIX/UNIXライクなプラットフォームでは、OSはプロセスがいつでも持つことができるオープンファイル記述子の数に制限を設けます。昔は、この制限は固定配線されていましたが、と比較的小さくなりました。今日ではそれははるかに大きく(数百/数千)、プロセスごとに構成可能なリソースの制限が「ソフト」になる可能性があります。 (ulimit
シェルを参照してください...)
Javaアプリケーションがプロセスごとのファイル記述子の制限を超えている必要があります。
あなたは19個のファイルが開いていると言いますが、数百回後に "too many files open"というIOExceptionが発生します。この特定の例外は、新しいファイル記述子が要求されたときにのみ発生します。すなわち、の場合は、ファイル(またはパイプまたはソケット)を開きます。 を確認するには、IOExceptionのstacktraceを出力します。
リソース制限が小さい(これはほとんどそうではない)アプリケーションを実行している場合を除き、ファイル/ソケット/パイプを繰り返し開いて閉じていなければなりません。それがなぜ起こっているのかを調べ、それについて何をすべきかを理解できるはずです。
FYIの次のパターンは、ファイル記述子をリークしないことが保証されているファイルに書き込む安全な方法です。
Writer w = new FileWriter(...);
try {
// write stuff to the file
} finally {
try {
w.close();
} catch (IOException ex) {
// Log error writing file and bail out.
}
}
1 - カーネルにコンパイルのようにハードワイヤード。利用可能なfdスロットの数を変更すると、再コンパイルが必要となり、他のものに利用できるメモリが少なくなる可能性があります。 Unixが16ビットマシン上で動作する時代には、これらのことは本当に重要でした。
UPDATE
のJava 7の方法は、より簡潔である:
try (Writer w = new FileWriter(...)) {
// write stuff to the file
} // the `w` resource is automatically closed
UPDATE 2
どうやらあなたはまた、 "あまりにも多くのファイルのオープンを" 遭遇することができます外部プログラムを実行しようとしています。基本的な原因は上記のとおりです。ただし、exec(...)
でこれが発生する理由は、JVMが外部アプリケーションの標準入力/出力/エラーに接続される "パイプ"ファイル記述子を作成しようとしているためです。
ファイルを開く関数にコメントを入れ、それぞれを1回だけ開いていることを確認します。 –
これらの19のいずれかのためにこのエラーが発生することをどのように知っていますか? Java自体または使用しているフレームワークがファイルを開く可能性があります。 – robert
あなたのコードを投稿してください。おそらくあなたはループ内でそれらを開いているので、何度も繰り返されます。 – harschware