知りたいこと
某システムのJavaサーブレット側の既存処理で、
サブプロセス(chmodコマンド)を実行し、その結果をログに出力、という処理があるのですが、
処理中に利用しているInputStream、BufferedReaderオブジェクトのcloseが行われていません。
そのため、処理を実行するたびにファイルディスクリプタが増加してしまうと思うのですが、
現状、問題は発生していません。
ファイルディスクリプタはサブプロセス実行後に解放されているのでしょうか?
ご回答のほどよろしくお願い致します。
該当のソースコード
Java
1//属性変更のコマンド 2String processCommand = "chmod 666 " + ファイル名 + " 2>&1 ; echo $? "; 3 4try{ 5 // コマンド実行 6 Process process = Runtime.getRuntime().exec(processCommand); 7 process.waitFor(); 8 9 // ストリームを取得 10 InputStream inputStream = process.getInputStream(); 11 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 12 13 StringBuffer outBuf = new StringBuffer(); 14 while (reader.ready()) { 15 String line = reader.readLine(); 16 outBuf.append(line + " "); 17 } 18 // ログ出力 19 logger.debug("ファイル属性変更結果:" + ファイル名 + " " + outBuf.toString()); 20 21} catch (InterruptedException e) { 22 logger.debug("ファイル属性変更失敗:" + e.getMessage()); 23} catch (IOException ex){ 24 logger.debug("ファイル属性変更失敗:" + e.getMessage()); 25} catch (Exception ex){ 26 logger.debug("ファイル属性変更失敗:" + e.getMessage()); 27} finally { 28 ; 29}
試したこと
■ファイルディスクリプタの増加を検証
<コマンド>
ls /proc/実行しているTomcatのプロセスID/fd | wc -l
<結果>
プログラム実行前:209
プログラム実行完了直後:211 →[socket:xxxx]というファイルディスクリプタが2件増加
プログラム実行完了から数秒経過後:209 →増えた[socket:xxxx]という2件が減少。プログラム実行前と同じ状態
その他気になっていること
process.getInputStream()では標準入出力ストリーム、標準エラー出力ストリームから渡される、とJavadocに記載があるので、
ファイルディスクリプタ#0、#1、#2は標準で使用されているから、そもそも閉じなくてはいいのでは?と思ったが、
ネットで調べると、3つのストリームは使用するしないに関わらずcloseしてくださいとあるので、
自分のファイルディスクリプタに対する認識が誤っていそうな。。
補足情報(FW/ツールのバージョンなど)
OS: Red Hat Enterprise Linux Server release 6.5
JRE: 1.7.0_45
JVMの再起動は年に数回程度のため、JVM再起動によるファイルディスクリプタの解放は考えにくいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。