Warum ist mein Java-heap-dump-Größe viel kleiner als verwendeten Speicher?

Problem

Wir versuchen, den Schuldigen zu finden der ein großes memory leak in unserer web-Anwendung. Wir haben ziemlich wenig Erfahrung mit der Suche nach einem memory-leak, aber wir fanden heraus, wie man eine java-heap-dump mit jmap analysieren und es in Eclipse MAT.

Jedoch mit unserer Anwendung verwenden 56/60GB Speicher, der heap-dump ist nur 16 GB groß ist und noch weniger in Eclipse MAT.

Kontext

Verwendet unser server Wildfly 8.2.0 auf Ubuntu 14.04 für unsere java-Anwendung, deren Prozess verwendet 95% des verfügbaren Speichers. Wenn Sie den dump, unsere buffers/cache benutzt, der Raum war zu 56GB.

Nutzten wir den folgenden Befehl zum erstellen des dump: sudo -u {application user} jmap -dump:file=/mnt/heapdump/dump_prd.bin {pid}

Den heap-dump-Datei Größe ist 16,4 GB und bei der Analyse mit Eclipse MAT, es sagt, es gibt rund 1GB live-Objekte und ~14,8 GB nicht erreichbar/shallow heap.

EDIT: Hier ein paar mehr Infos über das problem, das wir sehen, passiert. Wir überwachen unsere Speicher-Auslastung, und wir sehen es wachsen und wachsen, bis es ~300mb freien Speicher. Dann bleibt es rund um diese Menge Speicher, bis der Prozess abstürzt, allerdings ohne Fehlermeldung in das Ereignisprotokoll der Anwendung.

Dies lässt uns annehmen, dass es eine harte OOM-Fehler, da dies nur passiert, wenn der Speicher ist fast aufgebraucht. Wir verwenden die Einstellungen -Xms25000m -Xmx40000m für unsere JVM.

Frage

Im Grunde genommen, Wundern wir uns, warum die Mehrheit unserer Speicher ist nicht gefangen in diesem Loch. Die top-beibehalten Größenklassen nicht allzu misstrauisch, so Wundern wir uns, wenn es etwas heap-dump-bezogene, was wir falsch machen.

  • Wie sind Sie mit der Messung der Speichernutzung der Anwendung? Nur weil der Java-Prozess verwendet X Arbeitsspeicher, bedeutet nicht, dass der Java-heap ist X.
  • Gut, wir sind mit dem linux-Befehl free -h um zu sehen, was unsere Speicherauslastung ist.
  • "bis der Prozess abstürzt, allerdings ohne Fehlermeldung im Anwendungsprotokoll" - schauen Sie sich das Verzeichnis mit der server-executables; das ist in der Regel das Verzeichnis, in dem die "java" - Befehl aufgerufen wird und das Verzeichnis, in dem die JVM erstellt eine crash-report-Datei. Sehen, wenn solche Dateien vorhanden sind, kann es einen Anhaltspunkt geben. Was Sie beschreiben, klingt wie eine harte virtuellen Maschine Abstürzen, nicht eine normale Java-Anwendung Ausnahme.
  • Sind Sie auf der Erfassung von stdout und stderr von der JVM? Wenn nicht, versuchen Sie diese Umleitung zu einer Datei und Sie sehen möglicherweise die Ausnahme.
  • Vielen Dank für die Anregungen Gimby & schtever, sehr geschätzt!
  • was ist die Ursache und der Grund, hast du das endlich herausfinden? Ich habe fast das gleiche problem.
  • du meinst, der cause & Grund der heap-dump-Größe? Oder die Ursache & Grund der OOM Fehler?
  • Ursache, warum der RES Speicher ist viel größer als die heap-Größe weggeworfen. Ich litt unter dem selben problem und Suche nach einer Antwort. Mein Programm sollte verbrauchen nur rund 3,9 g Speicher, da die dump-Größe 3,9 g aber die RES Größe ist viel größer, bis es erreicht der xms-Wert.
  • in meinem Fall, was geschah, war, dass mein Programm nicht genug Zeit, um eine vollständige garbage collection, so Speicher gehalten Gebäude. Wenn du die dump, es hatte genug Zeit, ein GC, das entlastet den Arbeitsspeicher, war der Aufbau. Das ist, warum ich sah den Unterschied zwischen heap-dump-Größe und Speicherbedarf. Ziemlich viel, was die akzeptierte Antwort sagt.
  • aber ich meinem Fall habe ich nicht einen anstrengenden Programm, und selbst nachdem ich-heap-dump, der RES ist immer noch die gleiche große. Ich Frage mich, ob die tatsächlichen RES wird immer größer, weil der Skala der jvm-heap ?

InformationsquelleAutor Thermometer | 2015-08-28
Schreibe einen Kommentar