Files.list は、try-with-resources 処理を使用しません。これにより、Linux システムのオープン ファイル制限がトリガーされ、Java プログラムが開いているファイルが多すぎることを報告します。

ブログディレクトリ

記事ディレクトリ


結論は

ファイル ツールキットを使用する場合は、戻り値の型に特に注意する必要があります。2 つのインターフェイス StreamDirectoryStream の場合は、リソースを解放するには、ただちに close メソッドを呼び出す必要があります。より洗練された try-with-resources 構造を使用することをお勧めします

close を実行してリソースを解放しないと、Java プロセスが終了するまでオープン ファイルやその他のリソースが占有されます。オープン リソースが十分にあると、Linux システムによって設定されたプロセス オープン ファイルの上限をトリガーして、Java プロセスが終了する可能性があります。プロセスが異常に機能するため、エラーを報告する打开的文件过多

プロセス

まず、ファイルのアップロード時にシステム例外が発生しました。ログを確認したところ、開いているファイルが多すぎることがわかりました。lsof -p 47090 | wc -l を通じて、Java プロセスが開いていることがわかりました。 4000 以上のファイル。 ulimit -a または ulimit -n を通じてシステム構成を確認してください。開いているファイルの上限は 1024 です。 を通じて開いているファイルのリストを確認してください。 =4> すると、次のような、ファイルをアップロードするためのフォルダー ディレクトリが多数あることがわかります。lsof -p 47090

...
java    47090 root  472r      DIR              253,2        47 15032447518 /home/bid/upload/53b9bbe6e29e7eadeffa7c03962108c5
java    47090 root  473r      DIR              253,2        47 15032447518 /home/bid/upload/53b9bbe6e29e7eadeffa7c03962108c5
java    47090 root  474r      DIR              253,2        50 16643000312 /home/bid/upload/799e6138b45ac922d9c34a218a47c3a8
java    47090 root  475r      DIR              253,2        47  1077111019 /home/bid/upload/c942c119927d83a3d9bb4e13a46adc75
java    47090 root  477r      DIR              253,2        53        7160 /home/bid/upload/66a37cd0d1f4c76c9aaafcfbb82203d9
java    47090 root  478r      DIR              253,2        47  1077111019 /home/bid/upload/c942c119927d83a3d9bb4e13a46adc75
java    47090 root  481r      DIR              253,2        53  1611530376 /home/bid/upload/41a9b0ca26a194bf204ccf83ee199c67
java    47090 root  482r      DIR              253,2        50  5368709550 /home/bid/upload/8ec135c1594ef233337b2a041a558c20
java    47090 root  485r      DIR              253,2        50  5368709550 /home/bid/upload/8ec135c1594ef233337b2a041a558c20
...

Java プロセスを再起動すると、開いているファイルの数は約 350 になり、ファイルは正常にアップロードできますが、ファイルのアップロード インターフェイスが呼び出されると、開いているファイルの数が増え続け、対応するファイル ディレクトリが常に開いたままになり、アップロードできなくなります。 be release in time. 、ストリームなどが時間内に閉じられず、リソースが解放されなかったのではないかと思います。

コードを確認すると、InputStream / OutputStream などの IO ストリームは使用されていませんが、Files.list メソッドが使用されており、その戻り値の型は Stream<Path>

ファイル ツール クラスを確認すると、 / < など、いくつかのメソッドが Stream<Path> または DirectoryStream<Path> を返すことがわかります。 /span>、すべて try-with-resources で処理する必要があります / / / findlineslistnewDirectoryStreamwalk

おすすめ

転載: blog.csdn.net/mrathena/article/details/134681153
おすすめ