Heapmanagement der JVM

Golgari

Grünschnabel
Hallo

Ich habe mal eine Frage zum Heapmanagement der JVM?

Ich erzeuge mir ein Array was viel Speicher benötigt (int[][] array = new int[4000][10000];)
Die Speicheranforderung bestätigt sich auch in meinem „GCViewer“-Monitor und in den Windows-System-informationen. (Physical Memory Available: 4.678K)

nun setze ich array=null;

beim nächsten GC wird der Speichr im Heap wieder freigegeben.
So weit so gut
Was passiert mit dem Heap
Meine Beobachtungen im GCViewer“-Monitor zeigt dass der Heap-Size(ca 250 mb) langsam sinkt.
Aber die Windows-System-Informationen ändern sich nicht.

Erst wenn ich (mehrmals) manuell System.gc(); ausführe sinkt der reservierte Speicher (Heap) und wird auch wieder für Windows freigegeben.

Kurz gesangt:
Der Java-Prozess in Windows behält nach dem „null-Setzen“ seine ca 250 MB selbst nach dem ersten manuellen Ausführen der GC.


Wie/Wann managed die VM die Heap-Freigabe Und wie (wann) bekommt Windows den Speicher zurück
 
Hallo!

Kurz gesangt:
Der Java-Prozess in Windows behält nach dem „null-Setzen“ seine ca 250 MB selbst nach dem ersten manuellen Ausführen der GC.

Wenn sich die JVM einmal von Windows Speicher besorgt hat gibt sie ihn nicht sofort wieder frei wenn er nicht mehr benötigt wird, statt dessen wird der Speicher noch ein wenig länger reserviert. Es könnte ja schließlich sein, dass kurz nachdem der Speicher wieder fürs Betriebssystem freigegeben wird die JVM erneut sehr viel Speicher anfordern muss. Dies ist zumindest unter Windows so (steht auch irgendwo in offiziellen Sun Dokus aber kann die Referenz im Moment nicht finden).

Gruß Tom
 
Zurück