[root@lab ~]# java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Irgendeine Idee, wie man das beheben kann?
[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
Hier sind einige zusätzliche Details, die wahrscheinlich ziemlich wichtig sind, es ist ein OpenVZ-VPS
[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
Ich kann die JVM laden, wenn ich den maximalen Speicher auf 100 oder weniger einstelle, aber ich sollte doch mehr als 300 MB zur Verfügung haben, oder?:
[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.
Außerdem ist mir aufgefallen, dass der Failcounter von Provvmpages jedes Mal hochzählt, wenn ich Java ausführe. Hier stößt er also wahrscheinlich an seine Grenzen:
[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
Antwort1
Das Java-Programm selbst wird etwas Speicher verbrauchen. Und was noch wichtiger ist: Sie haben vergessen, „PermGen“ mitzuzählen. Ich weiß nicht, wie groß die Standardgröße von „PermGen“ ist, aber es könnten 128 M oder sogar 256 M sein. Die gesamte von der JVM benötigte Heap-Größe ist PermGen + Heap-Größe.
Warum fügst du nicht einfach etwas Tausch hinzu?
Außerdem sollte es einen Parameter geben, der es Linux ermöglicht, Speicher zu überbelegen. Google kann vielleicht helfen.
Antwort2
Bei 132 MB freiem Speicherplatz auf meinem VPS beträgt die größte maximale Heap-Größe, die ich angeben kann, 22 MB. Zwischen 22 MB und 30 MB geht verschiedenen Dingen der Speicher aus (z. B. pthreads), und nach 32 MB erhalte ich die Fehlermeldung „Es konnte nicht genügend Speicherplatz für den Objekt-Heap reserviert werden“. Ich habe auch mit verschiedenen -Xmn-Werten herumgespielt, aber das scheint keinen Einfluss auf das Ergebnis zu haben.
Für diese Tests habe ich das Debian-Paket sun-java6-jre verwendet.
Können Sie versuchen, mit „java -client -Xmx...“ zu arbeiten und zu prüfen, ob Sie größere Speichergrößen verwenden können? Mit meiner VM läuft der Java-Server überhaupt nicht.