あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

Runtime.exec


悩まされていたjavaアプリケーションのメモリエラーは、

javaアプリケーションから外部コマンドを実行するために使用していた

Runtime.exec() に原因があることがわかった。


これは、動作環境が unix 系 (使用していたのは Linux ) の場合に起こるようです。

Runtime.exec() で外部コマンドを実行する際に

unix の fork と exec が内部的に使用されています。


原因は、 fork が起動元アプリケーションと同サイズのメモリを

一瞬確保するので、 JVM のメモリが肥大していると fork で

割り当て可能な使用メモリがなくなり " memory allocate error " となることです。


この問題を解決するために、Runtime.exec()を使用せずに netcat を使ったスクリプト

コマンド実行を代用するようにした。

nc -l -p ポート番号 -e /bin/sh 接続元IPアドレス


接続元IPを指定しておくとそれ以外のIPからの要求を受け付けないので

セキュリティ上つけておいた方がよいだろう。


参考

Netcat