/ / Warum kann FullGC physischen Speicher (RES) nicht freigeben? - Java, Müllsammlung

Warum kann FullGC keinen physischen Speicher freigeben? - Java, Müllsammlung

Unten ist das RES Wachstumskurve: Bildbeschreibung hier eingeben

dann ist das Altes Gen. Belegungsanteil: Bildbeschreibung hier eingeben

Erzwingender vollständiger GC durch jmap, das alte Gen ist tatsächlich gesunken, aber der RES hat zugenommen ...

pmap Ergebnis:

Bildbeschreibung hier eingeben

Was bedeutet Anonist es nicht-Heap-Speicher?

Bearbeiten:

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Der Heap verwendete knapp 500 MB, aber die RSS überschreitet 15 GB, die PMAP zeigt, dass viele Anon ungefähr 65 MB.

Meine Frage lautet: Was könnte Speicher außerhalb des Heapspeichers verbrauchen? Vielen Dank!

Antworten:

1 für die Antwort № 1

JVM von Oracle hat mehrere Algorithmen zur Speicherverwaltung. Einige von ihnen können nicht verwendete Speicherseiten zu OS zurückgeben, andere nicht.

Der Standardalgorithmus (paralleler Kollektor) gibt niemals Speicher an OS zurück.

Folgende zwei Algorithmen können Speicher zu OS zurückgeben

  • Serien-GC (Single-Thread-Mark-Sweep-Kompakt)
  • G1

Sie haben eine Zusammenfassung der verfügbaren Algorithmen und der zugehörigen JVM-Optionen Hier.


1 für die Antwort № 2

Was ist die Bedeutung von anon, es ist Nicht-Heap-Speicher?

Anon bedeutet nur, dass es gewesen ist mmap()"d mit MAP_ANON. Angesichts der RSS ist es wahrscheinlich der Haufen.

Warum kann FullGC keinen physischen Speicher freigeben?

Sie müssen zwischen maximaler Heap-Größe, Heap-Belegung und festgelegter Heap-Größe unterscheiden.

  • Die maximale Heap-Größe ist der Adressraum, der im Voraus reserviert, aber nicht unbedingt von Seiten gesichert wird
  • festgeschriebene Heap-Größe wird von Seiten unterstützt und normalerweise auf null gesetzt / pretouched. Dies wirkt sich in der Regel auf Ihren RSS aus
  • Belegung ist der Bruch, der Objekte anstelle von Nullen enthält

Nur wenn die Größe des festgeschriebenen Heapspeichers auf Seiten fällt kann zurück zum Betriebssystem freigegeben werden.

Das Entziehen / Nachgeben von Speicher für das Betriebssystem hängt vom GC-Algorithmus, der JVM-Version und den Optimierungsparametern ab (Pausenzeitziele, MaxHeapFreeRatio).


Die anderen Regionen, die Sie auflisten, sind wahrscheinlich direkte ByteBuffer-Zuordnungen, aber sie könnten auch andere Zuordnungen von nativen Bibliotheken sein. Untersuchen eines Heap Dump für java.nio.DirectByteBuffer Instanzen sollten weitere Einblicke liefern.