結論は
ファイル ツールキットを使用する場合は、戻り値の型に特に注意する必要があります。2 つのインターフェイス Stream
と DirectoryStream
の場合は、リソースを解放するには、ただちに 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 で処理する必要があります / / / find
lines
list
newDirectoryStream
walk