
cron 経由で JVM を起動すると、「コンソールがありません。十分なメモリを確保するためにフォークします」という奇妙なメッセージが表示されました。Google でその文字列を検索すると、ほんの数件の結果しか返されないので、これについて詳しい人がいないかここで質問しようと思いました...
このメッセージは、コマンド ラインから JVM を起動した場合、またはブート時に init スクリプトを介して JVM を起動した場合には表示されません。
いずれの場合も、起動には同じ init スクリプトが呼び出され、JVM には同じ引数が渡されます。
java -server -Xmx4096m -XX:MaxPermSize=256M -Djava.awt.headless=true -Djava.security.auth.login.config=/usr/local/aem/
author-4502/crx-quickstart/conf/ldap_login.conf -Dcom.sun.management.jmxremote.port=9502 -Dcom.sun.management.jmxremote.
authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar cq5-author-p4502.jar -use-control-port -p 4502 -gui -no
browser -verbose -r japan,qa
具体的には、JVM メッセージは次のコンテキストで出力されます。
...
Low-memory action set to fork
Using 64bit VM settings, min.heap=1024MB, min permgen=256MB, default fork arguments=[-Xmx1024m, -XX:MaxPermSize=256m]
The JVM reports a heap size of 3641 MB, meets our expectation of 1024 MB +/- 20
The JVM MBean:PS Perm Gen reports a maximum size of 256 MB, meets our expectation of 256 MB +/- 20
No console, will fork to get enough memory
...
メモリ不足の状況を回避するために JVM が別のインスタンスをフォークするというデフォルトの動作があるようです。では、なぜ cron ジョブから JVM を呼び出すとこの動作がトリガーされるのか疑問に思います。JVM がすでに十分なヒープ メモリと permgen メモリがあることを確認している場合でも、コンソールがないことが「メモリ不足」と解釈されるのはなぜでしょうか。
RHEL 6.4 を使用しています。
Java パッケージ名: jdk-1.7.0_55-fcs.x86_64
java -version 出力:
java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)
答え1
このメッセージは、JVM ではなく CQ アプリケーションから送信されています。私が収集した情報によると、状況によっては、CQ はシステムのさまざまな部分に対して個別の JVM を起動します。CQ には、この動作を制御するためのコマンド ライン オプションがいくつかあります。
-debug <port>
Enable Java Debugging on port number; forces forking
-nofork
Do not fork the JVM, even if not running on a console
-fork
Force forking the JVM if running on a console, using recommended
default memory settings for the forked JVM.
-forkargs <args> [<args> ...]
Additional arguments for the forked JVM, defaults to '-Xmx1024m
-XX:MaxPermSize=256m '. Use -- to specify values starting with -,
example: '-forkargs -- -server'
見るこのページCQ の開始と停止の詳細については、「fork」を検索して、この動作に関する (いくつかの) 言及を確認してください。