
Auf einem Redhat CentOS 6.4 laufen nur wenige Prozesse, die etwa 3 GB RAM verbrauchen (das System hat 12 GB frei). Einer der Prozesse ist ein WSO2ESB-Server (Java), wir starten ihn mit diesen Parametern:
-Xms2048m -Xmx3072m
Nach einer Weile erhalten wir eine OutOfMemory Exception, aberder Java-Prozess (WSO2ESB) nutzt nicht einmal seine 3 GB. In der J-Konsole können Sie auch sehen, dass diese Parameter korrekt eingestellt wurden (der Linux-Server hat zu diesem Zeitpunkt etwa 9 GB freien RAM).
Stellt uns Linux nicht die konfigurierten 3 GByte RAM zur Verfügung?
Bei einer exakt gleichen Windows-Installation kann der Java-Prozess seinen 3 GB RAM problemlos nutzen.
Screenshot der J-Konsole, der die Heap-Speichernutzung nur zwischen 0,3 und 1,0 GB zeigt. Zum Zeitpunkt der OutOfMemory-Ausnahme lag der Heap-Speicher bei 0,5 GB, aber der Prozess hätte 3 GB zum Arbeiten zur Verfügung, aber das tut er nicht ...
BEARBEITEN: Protokoll des Java-Prozesses hinzugefügt:
java.lang.OutOfMemoryError: unable to create new native thread
EDIT2: freie -m-Ausgabe hinzugefügt:
Antwort1
Ich habe das Problem gelöst. wso2esb verwendete über 1000 Threads. Aber unter Linux ist die Standardanzahl der Threads, die ein Benutzer verwenden kann, auf 1024 eingestellt. Ich musste das Limit für meinen Benutzer erhöhen, jetzt funktioniert alles einwandfrei.
Gehen Sie dazu wie folgt vor: Öffnen Sie /etc/security/limits.conf und fügen Sie die folgenden zwei Zeilen für Ihren Benutzer hinzu:
myuser soft nproc 8192
myuser hard nproc 8192
Antwort2
Java verfügt über mehrere Generationen von Heap-Speicher: neue, alte und permanente Generation.
Wenn Sie einen sehr hohen Xmx-Wert einstellen, der für den Heap verwendet wird, und selbst wenn Sie nicht den gesamten Heap verwenden, kann Ihnen der Speicher ausgehen. Dies passiert normalerweise, wenn Ihnen der PermGen-Speicherplatz ausgeht.
Die permanente Heap-Generierung wird zum Speichern des String-Pools und verschiedener Metadaten verwendet, die von der JVM in Bezug auf Klassen, Methoden und andere Java-Grundelemente benötigt werden. Der permanente Speicherplatz beträgt normalerweise 64 MB. Wenn Sie also viele Klassen oder große Strings haben, kann er knapp werden.
Versuchen Sie, die Permgengröße durch Hinzufügen von Folgendem zu erhöhen:
-XX:MaxPermSize=256m
zu Ihren Java-Startoptionen.
Antwort3
Was ist Ihre Datensegmentgröße für den Heap -Xms2048m -Xmx3072m
?
Ihre Datensegmentgröße sollte Ihrer maximalen Heap-Größe entsprechen (in diesem Fall 3072 m). Ihre Datensegmentgröße sollte also mindestens 3221225472
(in Bytes 3*1024*1024*1024 = 3 GB) betragen.