JVM-Speicher: Warum Speicher auf Task-Manager-Unterschied mit JProbe (oder JConsole-Tool)

8

Das Problem, dem ich gegenüberstand, ist, dass der verwendete Speicher meiner Anwendung nur 100 MB beträgt, danach hat sie 50 MB abgenommen, aber im Window Task Manager hat sie 150 MB angezeigt und immer beibehalten oder erhöht, aber nicht verringert. Wie können wir den Arbeitsspeicher (Privater Arbeitssatz) im Aufgabenmanager reduzieren?

    
manhnt 18.08.2012, 09:24
quelle

1 Antwort

11

Was Sie in JConsole (oder anderen Überwachungstools) sehen, ist das Muster, in dem der Java-Speicher verwendet wird.

Der Speicher der JVM wird normalerweise auf diese Bereiche aufgeteilt (was Sie auch in Überwachungswerkzeugen sehen).

  1. Heap-Speicher für Java-Objekte
  2. Nicht-Heap-Speicher, in dem Java geladene Klassen speichert und Metadaten und der JVM-Code
  3. Nativer Speicher, der ein Teil des Speichers ist, der für DLLs und. reserviert ist systemeigener Java-Code (sehr niedrige Stufe). Manchmal konnte man ein OOM bekommen in diesem Bereich, während Sie genügend Heapspeicher haben (weil Sie Erhöhen Sie die Max Heap Größe, es reduziert den nativen Speicher verfügbar).

Der Windows Task-Manager zeigt das nicht an. Es zeigt den von Ihrer Anwendung verwendeten ganzen Speicher an (Heap + Nicht-Heap + nativer Teil).

Beachten Sie auch, dass in der Regel Prozesse, die mehr Speicher vom Betriebssystem anfordern, von diesen Speicher gehalten werden, selbst wenn die tatsächliche Anwendung "Speicher" freigibt. Diese Speicherseiten wurden als Teil des Adressraums des Prozesses zugeordnet. In Ihrem Task-Manager würden Sie also kein Muster mit sinkendem Speicher sehen, aber das würde nicht auf einen Speicherleck von Ihrer Anwendung hindeuten.
Sie können also nicht den Speicher reduzieren, den Sie vom Task-Manager sehen, aber der Speicher, den Sie vom Überwachungstool sehen, sollte irgendwann sinken, sonst könnte das auf einen Speicherverlust hindeuten.

    
Cratylus 18.08.2012 09:30
quelle