Types gelöscht - bleiben aber im Speicher

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Badudel

Betreff: Types gelöscht - bleiben aber im Speicher

BeitragDo, Jun 03, 2010 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

habe mal wieder ein Problem mit dem Löschen von Types. Eifrig rumgesucht und getestet - doch der Speicher wird nicht freigegeben. Die Liste ist leer, un GCCollect wurde ausgeführt, und trotzdem...

BlitzMax: [AUSKLAPPEN]
SuperStrict


Type TTest
Field val%
Global List:TList=CreateList()

Method del()
Local obj:TLink
obj=List.FindLink(Self)
obj.Remove()
obj=Null
End Method

Function Add(wert%)
Local neu:TTest=New TTest
neu.val=wert
List.Addlast(neu)
End Function


End Type

Print "Noch nichts gemacht."
Print "5 Sekunden um im Taskmanager zu schauen..."
Delay 5000

For Local i%=1 To 20000
TTest.Add(5)
Next

Print "Wir haben "+CountList(TTest.List)+" Types erstellt."
Print "5 Sekunden für dem Taskmanager..."
Delay 5000
Print "Ich lösche jetzt."

Local loesch:TTest
For loesch=EachIn TTest.List
loesch.del()
loesch=Null
Next

Print "Jetzt haben wir nur noch "+CountList(TTest.List)+" Objekte."

Print "GCCollect hat "+GCCollect()+" Bytes gelöscht."
Print "5 Sekunden für dem Taskmanager..."
Delay 5000

Zwischendrin ist extra Zeit, um den Speicher im Taskmanager zu überprüfen.
Komischerweise löscht GCCollect nur wenige Bytes, und auch im TM sieht man wenig. Was mache ich falsch?

Sollte es interessant sein: Ich benutze Blitzmax Demo 1.37, XP

Freue mich über alle Antworten, viele Grüße, Badudel
Wir werden dem Schwein schon schlachten, auch wenn ihm quiekt.
Zum Teufel mit das Grammatik!

Thunder

BeitragDo, Jun 03, 2010 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nehme an, um die komplette Anzahl an Bytes zu ermitteln, die durch den GC gelöscht werden, zu ermitteln musst du GCSetMode(2) aufrufen, damit GCCollect() nicht zwischendurch aufgerufen wird.


mfg Thunder

PS:
BlitzMax: [AUSKLAPPEN]
Method del()
Local obj:TLink
obj=List.FindLink(Self)
obj.Remove()
obj=Null
End Method
' wieso nicht:
Method del()
List.remove(Self)
EndMethod
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Badudel

BeitragDo, Jun 03, 2010 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum diese Variante?
Weil ich die erste Möglichkeit von hier (Beitreag Dreamora) übernommen habe.

Das Hauptproblem ist aber, dass im TaskManager trotzdem noch viel Speicher angezeigt wird.
Für mein derzeitiges Projekt ist die Freigabe ungeheuer wichtig, weil ich da mit irre vielen Daten arbeite...
Wir werden dem Schwein schon schlachten, auch wenn ihm quiekt.
Zum Teufel mit das Grammatik!

Xeres

Moderator

BeitragDo, Jun 03, 2010 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Es bleiben ein paar Bytes über, aber ich würde eher vermuten, dass liegt daran, das der GC versucht wirtschaftlich zu arbeiten. Ein dauerhafter Memory-Leak würde schnell auffallen.
BlitzMax: [AUSKLAPPEN]
Print "Speicher " + GCMemAlloced() / 1024 + " kB (" + GCMemAlloced() + " bytes)"
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)

mpmxyz

BeitragDo, Jun 03, 2010 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe keinen Fehler.
Vor dem "GCCollect" wird der Garbage-Collector wahrscheinlich schon gearbeitet haben, weshalb dann fast nichts mehr zu tun ist.
Das Ergebnis des Taskmanagers fällt wahrscheinlich so aus, weil es unsinnig wäre, Speicher an das Betriebssystem zurückzugeben, wenn man danach wieder welchen braucht.
Daher wird ein BlitzMax-Programm nicht jeden programmintern freigegebenen Speicher gleich an das Betriebssystem übergeben, wenn es jeden Moment passieren könnte, dass er wieder gebraucht werden könnte.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

BladeRunner

Moderator

BeitragFr, Jun 04, 2010 6:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu TLink.remove() vs. Tlist.remove(obj):
Das Entfernen des Links ist dann sinnvoll wenn man jedes Objekt welches in einer Liste eingespeichert wird mit dem Tlink ausstattet den es dort einnimmt - dann geht das löschen nämlich ruckzuck, da die Liste nicht durchiteriert werden muss.
So wie Du es bislang machst gewinnst Du keinerlei Geschwindigkeit und kannst weiter Tlist.remove(obj) nehmen.
Das Speichern des TLink in einem Objekt ist also immer dann sinnvoll wenn es exakt in einer Liste verwendet wird.
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