MemAlloc und GC
Übersicht

![]() |
Der EisvogelBetreff: MemAlloc und GC |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 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. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klar geht das mit Banks ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group