Zum Inhalt springen

Verwendeten Speicher wieder freigeben


Empfohlene Beiträge

Geschrieben

Mahlzeit,

ich hätt' da mal ein Problem. Angenommen, ich erstelle einen großen Haufen an Objekten und Java bzw. die VM läßt sich vom System entsprechenden Speicher zuweisen. Soweit alles klar.

Wenn ich nun aber keine Referenzen mehr auf die Objekte habe, löscht sie die Garbage Collection irgendwann. Auch klar.

Nun mein Problem: Dieser freigewordene Speicher, bleibt der Java zugewiesen oder wird er dem System wieder zurückgegeben? Oder kann man das manuell bewerkstelligen?

Gruß

Newlukai

Geschrieben

Sicher?

Ich konnte nicht umhin und habe es getestet. Dazu habe ich folgende Zeilen geschrieben:

List<Integer> ints = new ArrayList<Integer>(10000);
for(int i = 0; i < 1000000; i++) {
ints.add(new Integer(i));
}

try {
System.out.println("done ... waiting");
Thread.sleep(10000);
ints = null;
System.out.println("set to null ... waiting 20s");
Thread.sleep(20000);
System.gc();
System.out.println("started GC ... waiting 20s");
Thread.sleep(20000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}[/PHP]

Ich bin sicher ich habe einen Denkfehler oder so drin ;)

Jedenfalls habe ich das Programm aus der eclipse gestartet und mit dem Task-Manager den Speicherverbrauch des neuen Prozesses überwacht. Nachdem die Integer erstellt wurden, bleiben - auch nach dem Null-Setzen - die ca. 33MB belegt.

Geschrieben

Ne, der frei gewordene Speicher steht dann wieder dem System zur Verfügung.

Reine Vermutung, aber ich denke das hängt erstens davon ab von welcher Menge an speicher wir hier sprechen, und

2. welche VM nutzt ihr überhaupt.

3. In welchen Zeitbereichen hast du den speicher Kontrolleirt?

Geschrieben

Ich verwende das JDK 5.

Zu den Zeitabständen: Die paar Zeilen sind der komplette Code. Führe ich das Programm aus und sind die Integer generiert, lasse ich dem System 10 Sekunden Zeit, um sehen zu können, wie groß der Speicherverbrauch ist.

Danach entferne ich mit dem Null-Setzen jegliche Referenz auf die Integer die ich habe. Zugegeben, die Referenz auf die Liste wird entfernt, die Integer sind noch über die Liste referenziert. Allerdings sollte die JVM bzw. der GC ja merken, daß somit auch die Referenzen auf die Integer unnötig sind. Jedenfalls hat das System danach 20 Sekunden Zeit, etwas zu tun. Meiner Meinung nach ist das mehr als genug Zeit.

Und nach dem Erstellen bleiben die 33MB reserviert.

Und anschließend starte ich den GC eben manuell mit nochmals 20 Sekunden Verschnaufpause. Sind die rum, wird das Programm beendet und der Prozess terminiert, ergo kein Speicherverbrauch mehr.

Geschrieben

Für alle Interessierten: Es ist tatsächlich so, daß der SPeicher nicht wieder freigegeben wird, weder automatisch noch durch eine evtl. manuelle Ansteuerung. Allerdings gilt das nur für die von Sun implementierte JVM. Bei anderen Implementierungen kann es durchaus anders sein.

Geschrieben
Jedenfalls habe ich das Programm aus der eclipse gestartet und mit dem Task-Manager den Speicherverbrauch des neuen Prozesses überwacht. Nachdem die Integer erstellt wurden, bleiben - auch nach dem Null-Setzen - die ca. 33MB belegt.

Das ist egal. Sobald ein anderes Programm den Speicher brauchen sollte und dein Programm ihn nicht mehr reserviert hat sollte dieser Speicher dem anderem Programm zur Verfügung stehen.

Ich kanns dir jetzt auf Anhieb nicht genau erklären, aber das der Speicher im Taskmanager immer noch bei deinem Programm angezeigt wird hängt wird der Speicherverwaltung von Windows zusammen...

Geschrieben

Kann ich mir jetzt nicht vorstellen. Aber ich hab's ausprobiert. Man öffne den Firefox und lade z. B. einen Radio-Stream udn läßt sich spielende Mädels bei weernersgarage.de anzeigen. FF reserviert sich 10MB mehr. Schließt man die Tabs, sind auch die 10MB wieder frei.

Geschrieben

War das nicht so, dass der GC erst bei einer gewissen Größe des aufräumen anfängt? Hab des mal ausprobiert, und diese Grenze ist sogar ziemlich hoch und wird afaik dynamisch nach oben gesetzt. Sobald das gesamte System nicht mehr mithalten kann fängt der dann endlich an ;-)

Dass der Speicher im FF freigegeben wird ist klar. Da geben die den Speicher manuell frei und da hängt kein GC bzw. ne VM dahinter.

mfg jghj

Geschrieben

hehe dann arbeitet er wohl schlecht ;-)

Vielleicht reichts ihm auch einfach noch nicht, dass du ints dereferenzierst.

Könnte sein, dass da noch ein Zeiger aufm stack liegt (intern natürlich). Wennst des mal anders inne methode formulierst und danach den gc nochmal anstößt...

Geschrieben
wo is perdi eigentlich?

Frag' ich mich auch die ganze Zeit ...

System.gc() MUSS nicht dazu führen, dass der gc angeworfen wird.

Interessant. Aber: Es ändert nichts an dem oben über die Sun-JVM genannten Fakt. Das Wissen kam übrigens von meinem Betreuer und der hat das so sicher und direkt beantwortet, der hatte wohl schonmal die gleiche Frage.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...