
Я столкнулся со странным сообщением при запуске JVM через cron: "Нет консоли, будет выполнен fork для получения достаточного количества памяти". Google возвращает лишь несколько результатов при поиске по этой строке, поэтому я решил спросить здесь, может, кто-то знает об этом больше...
Это сообщение не появляется, когда я запускаю JVM из командной строки или когда JVM запускается во время загрузки через сценарий инициализации.
Во всех случаях для запуска вызывается один и тот же сценарий инициализации, а 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 будет разветвлять другой экземпляр, чтобы обойти ситуации с нехваткой памяти. Так что мне интересно, почему вызов JVM из задания cron может вызвать такое поведение? Почему отсутствие консоли будет интерпретироваться как «недостаток памяти», даже если JVM уже подтвердила, что у нее достаточно памяти heap и permgen?
Я использую 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", чтобы увидеть (немного) упоминаний, которые они делают об этом поведении.