Linuxでjavaエラーを報告するToo many open filesの解決方法
1018 ワード
最近、Linuxで実行されているjavaアプリケーションに次のエラーが表示されました.
ソリューション:
1.linuxでデフォルトで同時に開く最大ファイル数を増やす(デフォルトは1024)
最も便利な方法は、/etc/profileファイルにulimit-n最大オープン数を追加することです.
しかし、この方法ではjavaがこんなに多くのファイルを開いた原因を根本的に調べることはできません.
2.java側はオープンファイルが多い原因を調査する
Linuxでは、プロセスが開いているファイルを表示します.
lsof -p プロセスid -> 開くファイル lsof -p プロセスid|wc-l -> 開いているファイルの数
調べた結果、javaはFIFO(Linuxのパイプ)のためのTYPEのファイルを多く開いていることが分かったため、javaコードのストリームが正常に閉じられていないか、解放されていない可能性があることを連想した.
またJavaはLinuxでコマンドを実行する際にProcessクラスを使用する必要があります.このクラスは使用後にdestroy()を削除する必要があります.否定者もファイル数を開きすぎます.
java.io.IOException: Cannot run program "/bin/sh": java.io.IOException: error=24, Too many open files
Caused by: java.io.IOException: java.io.IOException: error=24, Too many open files
at java.lang.UNIXProcess.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 5 more
ソリューション:
1.linuxでデフォルトで同時に開く最大ファイル数を増やす(デフォルトは1024)
最も便利な方法は、/etc/profileファイルにulimit-n最大オープン数を追加することです.
しかし、この方法ではjavaがこんなに多くのファイルを開いた原因を根本的に調べることはできません.
2.java側はオープンファイルが多い原因を調査する
Linuxでは、プロセスが開いているファイルを表示します.
lsof -p プロセスid -> 開くファイル lsof -p プロセスid|wc-l -> 開いているファイルの数
調べた結果、javaはFIFO(Linuxのパイプ)のためのTYPEのファイルを多く開いていることが分かったため、javaコードのストリームが正常に閉じられていないか、解放されていない可能性があることを連想した.
またJavaはLinuxでコマンドを実行する際にProcessクラスを使用する必要があります.このクラスは使用後にdestroy()を削除する必要があります.否定者もファイル数を開きすぎます.