MemAlloc und GC

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: MemAlloc und GC

BeitragDo, Jul 01, 2010 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Warum sammelt der GC von BM nicht auch nicht genutzte Speicherbereiche von MemAlloc ein? Also wenn ich keinen verweis mehr den Speicher habe.

Hier mein Code, der es zeigt:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Delay 5000

Print "Alloc Memory"
'Local m:Byte Ptr = MemAlloc(1024 * 1024 * 1024)
'If Not m Then Print "Failed"

Local m:Byte Ptr[1024 * 1024]

For Local i:Long = 0 To 1024 * 1024 - 1
m[i] = MemAlloc(1024)
Next

Delay 10000

Print "Reset Memory"
m = New Byte Ptr[1]

GCCollect()

Delay 10000


Da kann ich im Task-Manager beobachten, wie der Speicher ansteigt, aber er geht bei Reset Memory nicht mehr runter. Was heißen muss, dass der GC nicht aufrämt. Ist das so gewollt? Wenn ja, was muss tun, damit ich diese Speicherbereiche nicht von Hand freigeben muss?

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BladeRunner

Moderator

BeitragDo, Jul 01, 2010 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Da Du sie von Hand anforderst, musst Du sie auch von Hand (mit MemFree) freigeben. Der GC greift da nicht, da man Memalloc in der Regel ja benutzt um mit anderen Schnittstellen zu kommunizieren, und der GC kann nie mit Sicherheit wissen ob der Zugriff noch vonnöten ist. Wenn du den Pointer nullst hat der GC um ganz exakt zu sein ja nicht mal mehr einen Hinweis darauf WO er denn Speicher zu löschen hätte Wink
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

Noobody

BeitragDo, Jul 01, 2010 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Speicherbereiche, die mit MemAlloc geholt wurden, werden nicht vom GC eingesammelt, weil sie in einer Ptr-Variable gespeichert werden. Da man auf Pointern Arithmetik ausführen kann wie man grade Lust hat, kann der GC auch nicht wissen, ab wann der Zeiger noch auf den Speicherblock zeigt oder nicht. Im Extremfall kann man sogar per Arithmetik zwischen einzelnen Blöcken hin- und herspringen, obwohl zeitweise keine einzige Variable darauf zeigt.

Aus diesem Grund beissen sich Zeiger enorm mit dem GC, weswegen der GC Speicherbereiche schlicht nicht einsammelt. Wenn du GC-sichere Speicherblöcke brauchst, benutze Banks. Ansonsten musst du dich selber ums aufräumen kümmern.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Der Eisvogel

BeitragDo, Jul 01, 2010 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Mist das hatte ich befürchtet. Leider geht es nur so. Ich arbeite mit der WinAPI, und die fordert einen Pointer auf einen Speicherbereich, und soweit ich weiß, geht das in BM mit Banks nicht mehr. In B3D ging das ja.
Mh. Dann muss ich jetzt wohl sauber proggen, sonst endet das böse. Danke euch beiden.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Noobody

BeitragDo, Jul 01, 2010 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Klar geht das mit Banks Razz

Siehe Lock() und Unlock() in der Bank-Dokumentation.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Der Eisvogel

BeitragDo, Jul 01, 2010 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh das ist cool. Danke.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group