Na falta de alternativas eu tentei um hack sujo: substituindo java
e javac
por scripts de shell que garantem que os argumentos apropriados sejam passados e permitam-me ver a lista de parâmetros exata. Como isso já é uma tentativa de uma solução muito específica, e não parte da pergunta, eu gostaria de colocá-la em uma resposta.
Eu procurei todas as ocorrências de java
no meu sistema de arquivos. Havia muitas maneiras, porque eu tenho vários JREs e JDKs na minha máquina. Mesmo depois de remover todas as versões, exceto uma, ainda havia muitas delas. Eu usei find / -name "java" |xargs file
para descobrir qual é o real . Ele me disse:
/var/lib/dpkg/alternatives/java: ASCII text
/etc/alternatives/java: symbolic link to '/usr/lib/jvm/java-6-sun/jre/bin/java'
/usr/share/java: directory
/usr/lib/jvm/java-6-sun-1.6.0.16/bin/java: symbolic link to '../jre/bin/java'
/usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/java: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.4.0, not stripped
/usr/bin/java: symbolic link to '/etc/alternatives/java'
Então eu sabia que /usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/java
era o executável. Eu o renomei para javaexec
e coloquei um script de shell no local antigo:
mv /usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/java /usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/javaexec
nano /usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/java
(see below for file contents)
chmod +x #!/bin/bash -e
Isso garante que todas as chamadas para java
nos pontos finais do meu script chame o executável com os parâmetros corretos. Depois disso, fiz coisas terríveis semelhantes com javac
. O conteúdo do meu script:
#!/bin/bash -e
line=""
for i in $*
do
if [[ "$i" == *Xmx* ]]; then
echo "Seen -Xmx and removed"
elif [[ "$i" == *MaxPerm* ]]; then
echo "Seen -XX:MaxPermSize and removed"
else
line="$line $i"
fi
done
exec="/usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/javaexec -Xms10m -Xmx100m $line"
echo Now executing $exec
$exec
Ele remove cada um dos parâmetros da linha de comando que envolve -Xmx
ou algo parecido com -XX:MaxPermSize
e coloca seus próprios limites -Xms e -Xmx.
Quando inicio o Tomcat, ele ainda falha, mas, finalmente, a JVM inicia, faz algo e sai com uma mensagem significativa. Não tenho sucesso, mas me deixa muito mais satisfeita, já que a partir daí sei o que fazer. Enquanto o Tomcat ainda não funciona, ele tem um bom efeito colateral:
Agora posso finalmente chamar java
ou javac
na linha de comando ou de um script, e eles não travam, o que antes não era possível em tudo ! Eles apenas executam ! Ei, eu me sinto como o rei da palavra, finalmente consegui que o java rodasse em uma máquina com 44GB de Ram sem reclamar sobre memória insuficiente. Este é um ótimo dia na história da computação, de fato!