Wie arbeitet der Garbage Collector?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Zwer99

Betreff: Wie arbeitet der Garbage Collector?

BeitragDi, Sep 25, 2012 1:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Heiho!

Arbeitet der Collector wie im Bild:

user posted image

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

BladeRunner

Moderator

BeitragDi, Sep 25, 2012 7:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Sep 25, 2012 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Hakkai

BeitragDi, Sep 25, 2012 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Sep 25, 2012 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Normalerweise ist das unnötig, ja. Sicher ist aber schließlich sicher Wink
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

BeitragMi, Sep 26, 2012 10:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Sep 26, 2012 11:19
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragMi, Sep 26, 2012 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Leute!

Ich hatte tatsächlich einige zyklische Referenzen drinnen und bin dann Lions Methode "sicher ist sicher" nachgegangen Wink
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group