-3

3つの異なるソフトウェアを組み合わせるためのラッパーであるJavaコードを作成しました。私は通常10万回コードを実行します。実行するたびに、さまざまなファイルを開いたり、書き直したり、閉じたりする必要があります。これらはすべて、tryとcatchの正しい規則に従って行われます。Linuxサーバーでコードを実行すれば、問題はありません。ただし、1000秒の10秒後にMacで実行すると、開いているファイルが多すぎるというエラーが発生し、続いてファイルXやYの読み込み中にエラーが発生し、プログラムが終了します。

もう1つ追加したいのは、コードが1000回実行された後、設定が変更され、1000回繰り返され、このプロセスが繰り返されることです。したがって、最初の4〜5回は問題ありませんが、6〜7回(つまり6000回の実行)後にこのエラーが発生します。

4

2 に答える 2

5

最も可能性の高い説明は、Java アプリケーションにバグがあり、それがファイル オープン ファイルのリークを引き起こしていることです。この問題を回避する方法は、ファイル ハンドルが常に閉じられるようにコードを記述することです。例えば

    // Using the 'try with resource' construct
    try (Reader r = new FileReader(...)) {
        // use the reader
    } catch (IOException ex) {
        // ...
    }

また

    // Using classic try/catch/finally
    Reader r = null;
    try {
        r = new FileReader(...);
        // use the reader
    } catch (IOException ex) {
        // ...
    } finally {
        if (r != null) {
            try {
                r.close();
            } catch (IOException ex) {
                // ignore
            }
        }
    }

開いているファイルの数の制限が 2 つのシステムで異なるため、プログラムが 1 つのオペレーティング システムで動作し、別のオペレーティング システムでは動作しなかった可能性があります。Java GC が実行されると、それぞれのハンドルのファイナライザーを介して検出された到達不能なファイル ハンドルが閉じられます。ただし、これは「開いているファイルが多すぎる」という例外を防ぐのに間に合わない場合があります。


アプリケーションで実際に多数のファイルを同時に開く必要がある場合は、制限を解除する必要があります。これはulimit、UNIX ベースのオペレーティング システムを使用していると仮定して、組み込みのシェルを使用して行うのが最適です。

ただし、超えることができないハード リミットが依然として存在することに注意してください。そして、それは Windows にも当てはまると思います。

于 2012-12-04T15:53:28.707 に答える
4

ulimit などを使用して、プロセスを許可するファイル数の制限を増やす必要があります。

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 71679
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 71679
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

このマシンのデフォルトのオープン ファイル制限は 2048 です。別のマシンでは、制限は 364076 に設定されています;)

または、使用量を減らす必要があります。これは Java が制御するものではなく、いずれにしても制御しなければならないものです。

于 2012-12-04T15:53:25.057 に答える