我在通过 cron 启动 JVM 时遇到了一条奇怪的消息:“没有控制台,将分叉以获取足够的内存”。在 Google 上搜索该字符串时,只会返回少量结果,所以我想我会在这里问一下,看看是否有人对此有更多了解...
当我从命令行启动 JVM 或在启动时通过初始化脚本启动 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”以查看他们对此行为的(少数)提及。