Wie arbeitet der Garbage Collector?
Übersicht BlitzMax, BlitzMax NG Allgemein
Zwer99Betreff: Wie arbeitet der Garbage Collector? |
Di, Sep 25, 2012 1:39 Antworten mit Zitat |
|
---|---|---|
Heiho!
Arbeitet der Collector wie im Bild: x, y, z1, z2, z3, k sind alles Objekte, die entsprechende Referenzen besitzen. Wenn ich jetzt in "2tens" y von x kappe. Wird dann wie in "3tens" auch der Speicher von z1, z2, z3 und k freigegeben oder muss ich mich da in die Struktur "reinarbeiten" und zuerst k von z3 lösen, dann z1, z2 und z3 von y lösen und zum Schluss erst y von x? Aja, y wird nur in x referenziert. z1, z2, z3 und k können also von keiner Stelle des Codes mehr erreicht werden. Gute Nacht wünsch' ich allen! Zwer99 |
||
1. Platz: BAC #126 BAC #60 | 2.Platz: BCC #36 | 3. Platz: BCC #18 | Pfurz: BCC #20
Ovion Entertainment |
BladeRunnerModerator |
Di, Sep 25, 2012 7:25 Antworten mit Zitat |
|
---|---|---|
Du hast dir selbst die Antwort gegeben: Wenn die tieferliegenden Instanzen nirgends mehr erreichbar sind werden sie entsorgt. Probleme gibt es nur bei zyklischen Referenzen. Gute Nacht. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Nova |
Di, Sep 25, 2012 17:46 Antworten mit Zitat |
|
---|---|---|
Man kann sich das ganze auch einfach so vorstellen: Wenn es keine Referenz zu Y mehr gibt, wird Y weggeworfen. Sollte es dann kein Y mehr geben, gibt es auch keine Referenzen zu Z1, Z2 und Z3 mehr, diese werden dann auch weggeworfen. Dann aber gibt es keine Referenz zu K mehr, also wird das auch weggeworfen. Und schwupps, alle deine Variablen sind weg, egal welche Methoden du verwendest.
(Das ganze funktioniert aber halt nur, wenn du keine weiteren Referenzen zu den Variablen hast.) Allgemein brauch man sich eher weniger Sorgen darum machen, wie BlitzMax das ganze macht. Wenn du die Objekte nicht mehr speicherst, löscht BlitzMax sie. |
||
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit |
Hakkai |
Di, Sep 25, 2012 17:55 Antworten mit Zitat |
|
---|---|---|
Wenn ich jetzt eine Type-Instanz lösche, wird also auch auf ein eventuell verwendetes Bild innerhalb dieser Instanz gelöscht? Habe meine Clean-up Routinen meist nocheinmal alle Types durchlaufen lassen und die Bilder-Instanzen gelöscht bevor ich die Type-Instanz gelöscht habe.
Das ist also unnötig? |
||
Lion |
Di, Sep 25, 2012 18:19 Antworten mit Zitat |
|
---|---|---|
Normalerweise ist das unnötig, ja. Sicher ist aber schließlich sicher
Ganz einfach kann man sowas bei Bildern etc. sehen, indem man sich über den Taskmanager den Speicherverbrauch anschaut. Nach der Löschung eines Bildes wird da schon vergleichsweise viel frei, im gegensatz zu ein paar Variablen. |
||
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x |
kog |
Mi, Sep 26, 2012 10:48 Antworten mit Zitat |
|
---|---|---|
Hätte da auch noch gerade eine Frage dazu:
einen Testcode: Code: [AUSKLAPPEN] Type TTest
Field Test2:TTest2 Method New() Self.Test2=New TTest2 End Method Method Delete() Print "TTest wurde gelöscht" End Method End Type Type TTest2 Method Delete() Print "TTest2 wurde gelöscht" End Method End Type Local Test:TTest=New TTest Local VerlinktTest2:TTest2=Test.Test2 Test=Null GCCollect() Print VerLinkttest2.tostring() GCCollect() In dem aktuellen Code wird TTest2 Variabel nicht gelöscht obwohl sie ja nachher nichtmehr genutzt wird, auch ein Collect in der Hauptschleife bringt nichts. Demnach ist die Variabel langlebig? Setze in das 1. Collect ausserkraft, wird VerlinktTest2 auch gelöscht, setze ich es eben davor, wird TTest2 niemals gelöscht? Kann das sein? |
||
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge GPU: HIS HD 4870 1GB GDDR5 RAM: 4x 4GB DDR3-SDRAM Dual Channel |
DaysShadow |
Mi, Sep 26, 2012 11:19 Antworten mit Zitat |
|
---|---|---|
@kog: Wieso sollte der GC auch Test2 löschen, wenn du mit VerlinktTest2 darauf referenzierst? Erst wenn du VerlinktTest2 wieder auf Null setzt und somit nichts mehr auf Test.Test2 zeigt(auch wenn Test schon nicht mehr existiert) wird Test2 gelöscht.
Du hast ja folgendes: Test -> Test2 und dann zusätzlich: VerlinktTest2 -> Test2 Dann setzt du Test auf Null und rufst den GC auf, also verschwindet Test -> Test2. Solange du dann eben nicht VerlinktTest2 auf Null setzt bleibt ja mindestens eine Referenz auf Test2 erhalten und ein Löschen des GC wäre fehlerhaft. |
||
Blessed is the mind too small for doubt |
Zwer99 |
Mi, Sep 26, 2012 13:32 Antworten mit Zitat |
|
---|---|---|
Danke Leute!
Ich hatte tatsächlich einige zyklische Referenzen drinnen und bin dann Lions Methode "sicher ist sicher" nachgegangen Damit konnte ich den Speicherverbrauch um einiges reduzieren! Schönen Tag noch, Zwer99 |
||
1. Platz: BAC #126 BAC #60 | 2.Platz: BCC #36 | 3. Platz: BCC #18 | Pfurz: BCC #20
Ovion Entertainment |
Übersicht BlitzMax, BlitzMax NG Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group