Profiler und Garbage Collector

Lange konnte ich mir nicht erklären, warum der Speicherverbrauch hochgeht, wenn man in einem Profiler (z.B. der in Netbeans) viele Male den Garbage Collector ankickt. Das sieht dann ungefähr so aus:

An der dunkelroten Linie habe ich wie wild auf dem GC-Button (siehe Kreis links oben) geklickt. Und nun geht der reservierte Speicher hoch? Wieso nur?

Vor zwei Wochen habe ich mich nun intensiv mit den in Java vorhandenen Collectoren auseinandergesetzt. Die Collectoren sind so implementiert, dass sie bestimme Ziele erreichen:

  1. Maximum pause time goal
  2. Throughput goal
  3. Minimum footprint goal

Die maximale Pausenzeit meint, dass die durch den Collector verursachte Unterbrechung nur einen definierten Wert erreicht. Der maximale Wert ist aber standardmäßig auf unendlich, so dass versucht wird Ziel 2 zu erreichen. Es geht beim Throughput darum, das Verhältnis “Aufenthalt in der Applikation” zu “Aufenthalt im Collector” zu Gunsten der Applikation ausfallen zu lassen. Wenn nun der GC oft läuft (mein ‘tolles’ Klicken auf dem GC-Button) dann reserviert er immer mehr Speicher, damit er das nächste Mal nicht mehr sofort laufen muss. Er lebt also in der Annahme, dass er gelaufen ist, weil er Garbage wegräumen musste und versucht das Verhältnis zu verbessern, in dem er mehr Speicher für Objekte zur Verfügung stellt.

Leave a Reply

Your email address will not be published. Required fields are marked *