Ich habe derzeit einige Probleme mit Java. Es wird aufgrund von Heap-Problemen nicht gestartet. Aber ich habe mehr als 9 GB RAM frei (oder sogar 16 GB, wenn Sie davon ausgehen, dass der Cache leer ist). Dies ist der Fehler, den ich bekomme (und der free
Befehl)
root@server: ~ # java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
root@server: ~ # free
total used free shared buffers cached
Mem: 25165824 15941148 9224676 0 0 7082176
-/+ buffers/cache: 8858972 16306852
Swap: 0 0 0
Ich verwende ein 64-Bit-Debian auf einem virtualisierten Server. Die Virtualisierungssoftware ist OpenVZ. Dies ist meine Java-Version (ich kann diesen Befehl ausführen, nachdem ich zwei meiner VMs gestoppt habe (4 laufen derzeit)) :
root@server: ~ # java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
Was könnte ich tuen?
Wie gewünscht:
root@server: ~ # cat /proc/meminfo
MemTotal: 25165824 kB
MemFree: 11723412 kB
Cached: 4597552 kB
Active: 9692308 kB
Inactive: 3322544 kB
Active(anon): 7411960 kB
Inactive(anon): 1005340 kB
Active(file): 2280348 kB
Inactive(file): 2317204 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 960 kB
Writeback: 0 kB
AnonPages: 8417300 kB
Shmem: 21504 kB
Slab: 427452 kB
SReclaimable: 383424 kB
SUnreclaim: 44028 kB
Reguest2:
root@server: ~ # cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
10023468: kmemsize 399250512 506245120 5053325720 5558658292 0
lockedpages 0 8 246744 246744 0
privvmpages 6005602 6291447 6291456 6291456 221
shmpages 8576 8608 579124 579124289562 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numproc 598 1236 30000 30000 0
physpages 4634494 6291456 6291456 6291456 0
vmguarpages 0 0 6291456 9223372036854775807 0
oomguarpages 1529371 2144671 6291456 9223372036854775807 0
numtcpsock 62 164 30000 30000 0
numflock 25 39 1000 1100 0
numpty 13 24 512 512 0
numsiginfo 10 75 1024 1024 0
tcpsndbuf 3330352 4153232 1179110194 1684441906 0
tcprcvbuf 1216896 34410032 1179110194 1684441906 0
othersockbuf 270504 537552 589555096 1094886808 0
dgramrcvbuf 0 67048 589555096 589555096 0
numothersock 287 333 30000 30000 0
dcachesize 355559855 446054103 1103879952 1136996352 0
numfile 4766 7745 250000 250000 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numiptent 14 14 1000 1000 0
root@server: ~ # java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
root@server: ~ # cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
10023468: kmemsize 399246622 506245120 5053325720 5558658292 0
lockedpages 0 8 246744 246744 0
privvmpages 6005601 6291447 6291456 6291456 233
shmpages 8576 8608 579124 579124289562 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numproc 598 1236 30000 30000 0
physpages 4635460 6291456 6291456 6291456 0
vmguarpages 0 0 6291456 9223372036854775807 0
oomguarpages 1529376 2144671 6291456 9223372036854775807 0
numtcpsock 64 164 30000 30000 0
numflock 25 39 1000 1100 0
numpty 13 24 512 512 0
numsiginfo 10 75 1024 1024 0
tcpsndbuf 3365232 4153232 1179110194 1684441906 0
tcprcvbuf 1249664 34410032 1179110194 1684441906 0
othersockbuf 270504 537552 589555096 1094886808 0
dgramrcvbuf 0 67048 589555096 589555096 0
numothersock 287 333 30000 30000 0
dcachesize 355559855 446054103 1103879952 1136996352 0
numfile 4768 7745 250000 250000 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numiptent 14 14 1000 1000 0
cat /proc/meminfo
vzmemcheck -vA
? Können Siecat /proc/user-beancounter
vor und nach dem Fehler.cat /proc/user-beancounter
ist in deinem Container erledigt.Antworten:
OpenVZ & Speicher
Das
failcnt
läuftprivvmpages
, sodass Ihr Container keinen virtuellen Speicherplatz mehr vom Host zuweisen kann:Beachten Sie, dass virtueller Speicher ! = Physischer Speicher. Prozesse können zuweisen (- 4G, 64 - Bit - 8 TB - 256 TB 32bit ~ 2G) , aber das bedeutet nicht , physische Speicherseiten verwendet werden (eine Seite ein 4 - KB - Teil des Speichers ist) um die adressierbaren Größe des virtuellen Speichers bis zu irgendwo.
physpages
ist die Anzahl der physischen Speicherseiten, die Ihr Container verwenden kann.oomguarpages
ist die garantierte Speicherseite, die der Container erhält, wenn der Host über einen eingeschränkten Speicher verfügt.privvmpages
Ist die Anzahl der virtuellen Speicherseiten, die Ihr Container verwenden kann,vmguarpages
ist die garantierte Menge an virtuellem Speicher auf die gleiche WeiseJava
Oracle Java weist immer einen zusammenhängenden Teil des virtuellen Speichers zu. Wenn Sie
java
keine Argumente für eine BoxRSS
ausführen, werden 5 MB realer Speicher verwendet ( ), aber 660 MB VM-Speicherplatz zugewiesen (VSZ
):Wenn Sie sich die Speichersegmente für den
java
Prozess in dersmaps
Datei ansehen, wird ein Teil von ca. 500 MB zugewiesen. Der Rest sind Dateien mit Speicherzuordnung und normales Java-Material.Auf einem System, das schon länger aktiv ist, wird der verfügbare VM-Speicherplatz fragmentiert, wenn Prozesse Teile davon verwenden / freigeben. A
grep Vmalloc /proc/meminfo
gibt IhnenVmallocChunk
den größten derzeit verfügbaren kostenlosen Block. Wenn dies niedrig ist, versucht das System, auf Anfrage mehr zuzuweisenjava
, schließlich ist es auf einer 64-Bit-Box praktisch unbegrenzt.Fix
Sagen Sie Ihrem Host, er soll konfigurieren
privvmpages
undvmguarpages
viel höher. Sie müssen nicht mit dem physischen Speicher identisch sein, da dies die Funktionsweise des Linux-Speichers beeinflusstMöglicherweise können Sie das Problem vorübergehend umgehen, indem Sie den Datei-Cache löschen. Dies ist
echo 1 > /proc/sys/vm/drop_caches
jedoch nur vorübergehend.Sie können den Speicherbereich
java
, der zur Laufzeit zugewiesen werden soll, auf ein MinimumXms
oder während der Ausführung auf ein Maximum beschränkenXmx
. Laufenjava
mit diesen Optionen auf meinem Computer:Reduziert die virtuelle Gesamtgröße auf ca. 140 MB, wobei nur ein zusammenhängender Block von 10 MB für den zugewiesenen Java-Heap zugewiesen wird.
quelle
grep Vmalloc /proc/meminfo
keine Ausgabe) Laufenjava -Xms10M -Xmx10M
funktioniert aber. Dies löst jedoch nicht wirklich alle Probleme. Als würde man zusätzliche Programme mit einer RAM-Auslastung von etwa 2 GB starten ...In unserem Fall hat es geholfen, die Heap-Größe zu beschränken, die die VM beim Start zu reservieren versucht.
Zum Beispiel in der Kommandozeile:
oder für Tomcat in [TOMCAT_HOME] /bin/setenv.sh
(Beachten Sie den zusätzlichen führenden Unterstrich in der Befehlszeile.)
Die Erklärung unseres Anbieters lautet:
quelle
Möglicherweise müssen Sie die Standardgröße des Java-Heaps ändern. Probieren Sie die folgenden Argumente aus:
zum Beispiel:
Dieser Thread könnte hilfreich sein
Überprüfen Sie auch das ulimit (ulimit bietet Kontrolle über die Ressourcen, die der Shell und den von ihr gestarteten Prozessen zur Verfügung stehen):
quelle
ulimit -a
scheint normal. Die meisten Werte einschließlichvirtual memory
sind unbegrenzt. Diejenigen, die ein wenig niedrig schienen, habe ich zum Testen verdoppelt (-s
von 8192 auf 16384 und-l
von 64 auf 128) , aber das hat auch nicht geholfen.-A
Option für mich. Und ich darf Swap nicht hinzufügen.Möglicherweise haben Sie nicht genügend virtuellen Speicher.
Sie konzentrieren sich auf die RAM-Nutzung (oder auf das Fehlen), aber Ihre vorhandenen JVMs reservieren virtuellen Speicher, nicht RAM. Solange nicht auf reservierte Speicherseiten zugegriffen wird, wird für sie keine RAM-Auslastung gemeldet.
Während Linux dieses Problem normalerweise durch seine Einstellungen für die Überbindung maskiert, ist es durchaus möglich, dass die Tatsache, dass Sie in einer virtualisierten Umgebung auf Betriebssystemebene ausgeführt werden, die Überbindung entweder verringert / deaktiviert oder eine Begrenzung der Ressourcensteuerung für den virtuellen Speicher festlegt.
Auf einer normalen Betriebssysteminstanz (kein Container) können Sie dies am einfachsten umgehen, indem Sie einen Swap hinzufügen, damit der reservierte Speicher keinen RAM verschwendet. Bei einem Container kann zur Behebung des Problems möglicherweise auch der global verfügbare virtuelle Speicher erhöht werden. Im Allgemeinen wird dem Container jedoch einfach mehr virtueller Speicher zugewiesen.
quelle