Zum Inhalt springen

Verwendeten Speicher wieder freigeben


geloescht_Newlukai

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

wo is perdi eigentlich?

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

Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse.

und wenn du gerade zeit hast... :

http://java.sun.com/developer/technicalArticles/Programming/GCPortal/

bigredeyes

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...