[root@lab ~]# java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Alguma ideia de como consertar isso?
[root@lab ~]# uname -a
Linux lab 2.6.18-194.8.1.el5.028stab070.5 #1 SMP Fri Sep 17 19:10:36 MSD 2010 x86_64 x86_64 x86_64 GNU/Linux
Aqui estão alguns detalhes adicionais que provavelmente são muito importantes, é um vps openvz
[root@lab /]# free -m
total used free shared buffers cached
Mem: 384 27 356 0 0 0
-/+ buffers/cache: 27 356
Swap: 0 0 0
Posso fazer com que ele carregue o jvm se definir a memória máxima para 100 ou menos, mas devo ter mais de 300 MB disponíveis, não deveria?:
[root@thehacklab /]# java -Xms32M -Xmx100M -version
java version "1.6.0_0"
OpenJDK Runtime Environment (IcedTea6 1.6) (rhel-1.13.b16.el5-x86_64)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
[root@thehacklab /]# java -Xms32M -Xmx128M -version
Error occurred during initialization of VM
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:614)
at java.lang.ref.Finalizer.<clinit>(Finalizer.java:194)
[root@thehacklab /]# java -Xms32M -Xmx140M -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Além disso, notei incrementos de provvmpages failcounter toda vez que executo java, então provavelmente é aqui que está atingindo um limite:
[root@thehacklab /]# cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
10913: kmemsize 4349290 6173197 2147483646 2147483646 0
lockedpages 0 0 999999 999999 0
privvmpages 7198 98262 98304 98304 35
shmpages 671 1647 98304 98304 0
dummy 0 0 0 0 0
numproc 16 33 999999 999999 0
physpages 4411 43452 0 2147483647 0
vmguarpages 0 0 98304 2147483647 0
oomguarpages 4412 43453 98304 2147483647 0
numtcpsock 5 31 7999992 7999992 0
numflock 5 9 999999 999999 0
numpty 1 2 500000 500000 0
numsiginfo 0 4 999999 999999 0
tcpsndbuf 107352 216752 214748160 396774400 0
tcprcvbuf 81920 13351808 214748160 396774400 0
othersockbuf 6984 44232 214748160 396774400 0
dgramrcvbuf 0 8472 214748160 396774400 0
numothersock 10 27 7999992 7999992 0
dcachesize 0 0 2147483646 2147483646 0
numfile 674 1154 23999976 23999976 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 14 14 999999 999999 0
Responder1
O próprio programa Java consumirá alguma memória. E o mais importante, você esqueceu de contar o "PermGen". Não sei qual é o tamanho padrão da geração permanente, mas pode ser 128M ou até 256M. O tamanho total de heap exigido pela JVM é PermGen + tamanho de heap.
Por que você simplesmente não adiciona alguma troca?
Também deve haver um parâmetro para permitir que o Linux sobrecarregue a memória... o Google pode ajudar.
Responder2
Com 132M livres no meu VPS, o maior tamanho máximo de heap que posso especificar é 22M. Entre 22M e 30M, várias coisas ficam sem memória (como pthreads) e, após 32M, recebo o erro "Não foi possível reservar espaço suficiente para a pilha de objetos". Também brinquei com vários valores -Xmn, mas isso não parece ter nenhum efeito no resultado.
Usei o pacote debian sun-java6-jre para esses testes.
Você pode tentar executar com "java -client -Xmx..." e ver se consegue usar tamanhos de memória maiores? Com minha VM, o java -server não funciona.