Warum ist meine Java-Heap-Dump-Größe viel kleiner als der verwendete Speicher?

Proble

Wir versuchen, den Schuldigen eines großen Speicherlecks in unserer Webanwendung zu finden. Wir haben nur wenig Erfahrung mit dem Auffinden eines Speicherlecks, aber wir haben herausgefunden, wie man mit @ einen Java-Heap-Dump erstelljmap und analysiere es in Eclipse MAT.

Bei unserer Anwendung mit 56/60 GB Arbeitsspeicher ist der Heap-Dump jedoch nur 16 GB groß und in Eclipse MAT sogar noch kleiner.

Kontex

Our Server verwendet Wildfly 8.2.0 unter Ubuntu 14.04 für unsere Java-Anwendung, deren Prozess 95% des verfügbaren Speichers verwendet. Bei der Erstellung des Speicherauszugs war der von unseren Puffern / Cache belegte Speicherplatz bei 56 GB.

Wir haben den folgenden Befehl verwendet, um den Dump zu erstellen:sudo -u {application user} jmap -dump:file=/mnt/heapdump/dump_prd.bin {pid}

Die Größe der Heap-Dump-Datei beträgt 16,4 GB. Bei der Analyse mit Eclipse MAT wird angegeben, dass ca. 1 GB Live-Objekte und ca. 14,8 GB nicht erreichbarer / flacher Heap vorhanden sind.

BEARBEITEN Hier finden Sie weitere Informationen zu dem Problem, das sich ereignet. Wir überwachen unsere Speichernutzung und sehen, wie sie wächst und wächst, bis noch ~ 300 MB freier Speicher verfügbar sind. Dann verbleibt ungefähr so viel Speicher, bis der Prozess abstürzt, leider ohne Fehler im Anwendungsprotokoll.

Dies lässt vermuten, dass es sich um einen schwerwiegenden OOM-Fehler handelt, da dies nur geschieht, wenn der Speicher nahezu erschöpft ist. Wir verwenden die Einstellungen-Xms25000m -Xmx40000m für unsere JVM.

Frag

rundsätzlich fragen wir uns, warum der größte Teil unseres Speichers nicht in diesem Dump gespeichert ist. Die obersten Größenklassen sehen nicht allzu verdächtig aus, daher fragen wir uns, ob es etwas gibt, das mit Heap Dump zu tun hat.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage