geloescht_Newlukai Geschrieben 7. September 2006 Geschrieben 7. September 2006 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 Zitieren
carstenj Geschrieben 7. September 2006 Geschrieben 7. September 2006 Hi, Dieser freigewordene Speicher, bleibt der Java zugewiesen oder wird er dem System wieder zurückgegeben? Ne, der frei gewordene Speicher steht dann wieder dem System zur Verfügung. Zitieren
geloescht_Newlukai Geschrieben 7. September 2006 Autor Geschrieben 7. September 2006 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. Zitieren
setiII Geschrieben 7. September 2006 Geschrieben 7. September 2006 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? Zitieren
geloescht_Newlukai Geschrieben 8. September 2006 Autor Geschrieben 8. September 2006 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. Zitieren
geloescht_Newlukai Geschrieben 11. September 2006 Autor Geschrieben 11. September 2006 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. Zitieren
Guybrush Threepwood Geschrieben 11. September 2006 Geschrieben 11. September 2006 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... Zitieren
geloescht_Newlukai Geschrieben 11. September 2006 Autor Geschrieben 11. September 2006 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. Zitieren
jghj Geschrieben 12. September 2006 Geschrieben 12. September 2006 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 Zitieren
geloescht_Newlukai Geschrieben 12. September 2006 Autor Geschrieben 12. September 2006 Das mit dem FF ist ja auch nur zur Demonstration, daß ein Prozess auch wieder Speicher freigeben kann. Und in meinem kleinen Testprogramm habe ich die GC auch manuell angestoßen, ohne sichtbare Ergebnisse. Zitieren
jghj Geschrieben 12. September 2006 Geschrieben 12. September 2006 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... Zitieren
geloescht_Newlukai Geschrieben 12. September 2006 Autor Geschrieben 12. September 2006 Nein. Es ist definitiv so, daß die Sun-Implementierung der JVM keinen bereits angeforderten Speicher wieder freigibt. Zitieren
bigredeyes Geschrieben 12. September 2006 Geschrieben 12. September 2006 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 Zitieren
geloescht_Newlukai Geschrieben 12. September 2006 Autor Geschrieben 12. September 2006 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. Zitieren
Empfohlene Beiträge
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.