Wie gut arbeitet der Garbage-Collector ?
Übersicht

BBPro2Betreff: Wie gut arbeitet der Garbage-Collector ? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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" |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
BBPro2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group