Wie gut arbeitet der Garbage-Collector ?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

BBPro2

Betreff: Wie gut arbeitet der Garbage-Collector ?

BeitragMo, Feb 28, 2011 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo,

kurze frage zum GC:

angenommen ich habe eine instanz der klasse "game"

diese beinhaltet eine liste über 10000 instanzen der klasse "player"

nun setze ich am ende des spiels game = null
und schmeiße den GC an

es existieren nun keine weiteren verlinkungen auf die instanzen der klasse player

gibt der GC nun alles wieder frei oder nur ein paar bytes bzgl der instanz game ?

ein kurzer test hat (glaube ich^^) ergeben, dass der ram ziemlich voll bleibt... daher die frage...
wäre ziemlich nervig wenn ich nach jedem spiel alles wieder freigeben müsste um ein neues
zu starten ohne ein memleak zu haben

das mit den 10000 player isntanze war natürlich nur ein idealisiertes beispiel - alles was in game ist
freizugeben wäre im speziellen fall natürlich weitaus komplizierter als nur die paar player zu "nullen"

Xeres

Moderator

BeitragMo, Feb 28, 2011 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du so viel Speicher anforderst, wird der GC erwarten, dass du so viel bald wieder benötigst und nicht alles komplett freigeben.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

BBPro2

BeitragMo, Feb 28, 2011 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
hm ok das hatte ich zwar nicht bedacht, liefert aber irgendwie dennoch keine lösung für mein problem fürchte ich.

folgendes testprogramm (-> gibt an was das programm hier ausgibt):

Code: [AUSKLAPPEN]

Local myGame:Game
myGame = Game.InitializeNewGame ()
GCCollect ()
Print GCMemAlloced () -> 2377146
myGame = Null
GCCollect ()
Print GCMemAlloced () -> 2377146
Local myGame2:Game
myGame2 = Game.InitializeNewGame ()
Print GCMemAlloced () -> 4756046
myGame2 = Null
GCCollect ()
Print GCMemAlloced () -> 2377146


beim erstellen der 2. instanz eines spiels steigt der verbraucht auf etwa das doppelte - er hat
also die werte, die im 1. game vorkamen nicht richtig gelöscht
dass es an einer anderen stelle liegt ist quasi ausgeschlossen, da der code sonst fast nichts enthält, da er nur für diesen testzweck entworfen wurde...

wie erkläre ich mir das?

ComNik

BeitragMo, Feb 28, 2011 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Der GC gibt meines Wissens nach nicht direkt wieder alles frei, was = NULL ist.
Eine gewisse Anzahl freier Speicher wird einfach frei gehalten, da Speicher allokieren (wie sagt man im deutschen -.- ? anfordern? freimachen?) ziemlich "ressourcenfressend" ist.

Daher bringt nur eine GCMemAlloced() überwachung innerhalb einer Game Loop etwas.
Bei deinem Beispiel könnte der GC z.B die Ressourcen noch 2 "Runden" frei lassen, um neue Sachen schnell rein schreiben zu können, aber da fragst du noch ab. 4 Runden später hat er sich vllt entschieden das du den Speicher nicht brauchst, und gibt ihn wieder frei.

Alles braucht seine Zeit.

(Dieses Wissen ist übrigens nur durch eigene Experimente gestützt)

lg
ComNik
WIP: Vorx.Engine

BladeRunner

Moderator

BeitragMo, Feb 28, 2011 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst den GC nebenbei erwähnt nicht manuell aufrufen, der ist Standard auf Automatik gestellt.
Und wie schon erwähnt wurde wird nicht alles direkt entsorgt, denn es ist 'teuer' neuen Speicher anzufordern, also wird er erst mal reserviert gehalten.
Insgesamt funktioniert der GC im Wesentlichen aber gut.
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group