Runtime.exec
悩まされていたjavaアプリケーションのメモリエラーは、
javaアプリケーションから外部コマンドを実行するために使用していた
Runtime.exec() に原因があることがわかった。
これは、動作環境が unix 系 (使用していたのは Linux ) の場合に起こるようです。
Runtime.exec() で外部コマンドを実行する際に
unix の fork と exec が内部的に使用されています。
原因は、 fork が起動元アプリケーションと同サイズのメモリを
一瞬確保するので、 JVM のメモリが肥大していると fork で
割り当て可能な使用メモリがなくなり " memory allocate error " となることです。
この問題を解決するために、Runtime.exec()を使用せずに netcat を使ったスクリプトで
コマンド実行を代用するようにした。
接続元IPを指定しておくとそれ以外のIPからの要求を受け付けないので
セキュリティ上つけておいた方がよいだろう。
参考