
Me deparei com uma mensagem estranha ao iniciar uma JVM via cron: "Sem console, será bifurcado para obter memória suficiente". O Google retorna apenas alguns resultados ao pesquisar essa string, então resolvi perguntar aqui para ver se alguém sabe mais sobre isso...
Esta mensagem não aparece quando inicio a JVM a partir da linha de comando ou quando a JVM é iniciada no momento da inicialização por meio do script de inicialização.
Em todos os casos, o mesmo script de inicialização é chamado para iniciá-lo e a JVM recebe os mesmos argumentos:
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
Mais especificamente, a mensagem JVM é gerada neste contexto:
...
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
...
Parece que há algum comportamento padrão em que a JVM bifurca outra instância para contornar situações de pouca memória. Então, estou me perguntando por que invocar a JVM a partir de um cron job acionaria esse comportamento? Por que não ter um console seria interpretado como 'pouca memória', mesmo que a JVM já tenha confirmado que possui memória heap e permgen suficiente?
Estou usando RHEL 6.4.
Nome do pacote Java: jdk-1.7.0_55-fcs.x86_64
Saída da versão 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)
Responder1
Essa mensagem vem do aplicativo CQ, não da JVM. Pelo que entendi, em algumas circunstâncias o CQ lançará JVMs separadas para diferentes partes do sistema. O CQ possui algumas opções de linha de comando para controlar esse comportamento:
-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'
Veresta páginapara obter detalhes sobre como iniciar e parar o CQ. Procure por “fork” para ver as (poucas) menções que eles fazem a esse comportamento.