[root@lab ~]# java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
¿Algúna idea de cómo arreglar esto?
[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
Aquí hay algunos detalles adicionales que probablemente sean bastante importantes: es un 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
Puedo hacer que cargue el jvm si configuro la memoria máxima en 100 o menos, pero debería tener más de 300 MB disponibles, ¿no?:
[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.
Además, noté que el contador de fallas de provvmpages aumenta cada vez que ejecuto Java, por lo que probablemente es aquí donde está alcanzando un límite:
[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
Respuesta1
El programa java en sí consumirá algo de memoria. Y lo que es más importante, olvidaste contar el "PermGen". No sé cuál es el tamaño de generación permanente predeterminado, pero podría ser 128 M o incluso 256 M. El tamaño de montón total requerido por JVM es PermGen + tamaño de montón.
¿Por qué no agregas algo de intercambio?
También debería haber un parámetro que permita a Linux comprometer excesivamente la memoria... Google puede ayudar.
Respuesta2
Con 132 M libres en mi VPS, el tamaño máximo de montón que puedo especificar es 22 M. Entre 22M y 30M, varias cosas se quedan sin memoria (como pthreads) y después de 32M, aparece el error "No se pudo reservar suficiente espacio para el montón de objetos". También jugué con varios valores -Xmn, pero no parece tener ningún efecto en el resultado.
Utilicé el paquete Debian sun-java6-jre para estas pruebas.
¿Puedes intentar ejecutar con "java -client -Xmx..." y ver si puedes usar tamaños de memoria más altos? Con mi VM, el servidor java no se ejecuta en absoluto.