
我在通過 cron 啟動 JVM 時遇到一條奇怪的消息:“沒有控制台,將分叉以獲得足夠的內存”。搜尋該字串時,谷歌只返回少量結果,所以我想我應該在這裡問一下,看看是否有人知道更多關於它的資訊...
當我從命令列啟動 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 已經確認它有足夠的堆和永久內存,為什麼控制台不會被解釋為“內存不足”?
我使用的是 RHEL 6.4。
Java套件名稱:jdk-1.7.0_55-fcs.x86_64
java -版本輸出:
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
該訊息來自 CQ 應用程序,而不是 JVM。據我所知,在某些情況下,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”即可查看他們對此行為的(少數)提及。