Release ohne Wirkung (Garbage Collector)

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

koril-k

Betreff: Release ohne Wirkung (Garbage Collector)

BeitragFr, Jun 25, 2010 9:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir mal das mitgelieferte Beispiel angesehen, in dem Release und GCCollect erklärt wird.

Code: [AUSKLAPPEN]
Rem
Release removes the internal reference caused by creating an integer handle to a type.
End Rem

Type MyType
   Field bigmap[1024*1024]
End Type

GCCollect
Print GCMemAlloced()

a=New MyType
GCCollect
Print GCMemAlloced()

Release a
GCCollect
Print GCMemAlloced()


Hier erwartet man eine Ausgabe der Form
X (benötigter Speicher für ein "leeres Programm")
Y (Y = ca. X + 1024*1024*4 Bytes = ca. X + 4200000 Bytes)
X (da alles seit dem Programmstart gelöscht wurde)

Ich bekomme aber als Ausgabe:
14856
4209196
4209196

D.h. Release ist ohne Wirkung. Wie kann ich also dem Garbage Collector vertrauen?

Noobody

BeitragFr, Jun 25, 2010 11:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Release ist ein Artefakt aus der B3D-Zeit und sollte eigentlich nicht verwendet werden. Das Problem ist, dass Release sich stark mit dem Konzept eines GCs beisst, da nicht der GC die Daten löscht, wenn sie nicht mehr referenziert werden, sondern man es von Hand tut, was hie und da auch Probleme birgt.

Hier wäre ein Beispiel, wie man den GC normalerweise verwenden sollte BlitzMax: [AUSKLAPPEN]
Type MyType
Field BigMap[ 1024*1024 ]
End Type

Print GCMemAlloced()

Local A:MyType = New MyType
Print GCMemAlloced()

A = Null
GCCollect()
Print GCMemAlloced()
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

BladeRunner

Moderator

BeitragFr, Jun 25, 2010 11:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Gegenfrage: bist Du denn auf die unsagbar langsamen Integerhandles angewiesen? Ansonsten würde ich Dir nämlich empfehlen immer mit Superstrict zu programmieren, Objekte auch als Objekte zu handhaben und den Garbage Collector automatisch seine Arbeit tun zu lassen - in der Regel tut er das nämlich sehr gut.

Weshalb das aus der Doku entnommene Beispiel so nicht mehr funktioniert, das wissen die Götter (aka Mark Sibly), aber wie gesagt, das Problem lässt sich durch 'sauberes' Programmieren umgehen.
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
 

Dreamora

BeitragFr, Jun 25, 2010 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
@Noobody: Selbst das ist ein schlechtes beispiel.
GCCollect sollte soweit wie möglich niemals manuel aufgerufen werden.

Die einzige ausnahme ist wenn du massiv daten erzeugt hast die du gleich wieder trasht.
Und in so einem fall, einer loop zb, würdest du vermutlich den GC temporär suspenden damit er nicht automatisch rein geht zusätzlich.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Noobody

BeitragFr, Jun 25, 2010 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Beispiel hätte man ohne GCCollect wohl kaum die Abnahme des zugesicherten Speichers beobeachten können.

Und mal abgesehen davon, warum sollte man GCCollect nicht manuell aufrufen? Klar muss man es nicht, da er sich ja sowieso selber aufruft, wenn der Speicherverbrauch um einen bestimmten Betrag zugenommen hat, aber schlechte Auswirkungen hat es mit Sicherheit nicht.
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

BtbN

BeitragFr, Jun 25, 2010 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, der GC verwendet frei gewordenen speicher wieder, was er nicht kann, wenn man das collect manuell erzwingt.
Das wiederverwenden ist in jedem fall schenller, als ein erneutes allocieren des Speichers, und vermeiden zudem fragmentierung.

Noobody

BeitragFr, Jun 25, 2010 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum kann er den Speicher denn nicht wiederverwenden, wenn man ihn manuell aufruft?

Der GC macht ja genau dasselbe, ob man ihn nun manuell aufruft oder er automatisch aufgerufen wird.
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

BtbN

BeitragFr, Jun 25, 2010 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, wenn man ihn manuel aufruft, gibt er den Speicher frei, wenn man ihn machen lässt, benutzt er bei neuen Allokationen den freien, aber noch nicht freigegebenen Speicher für neue Objekte, was schneller als ewiges freigeben/neu allocieren ist.

koril-k

BeitragSa, Jun 26, 2010 8:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@All: Danke zunächst für eure Antworten. Ich habe nicht vor, den Garbage Collector selbst aufzurufen, doch ich wollte mich zunächst von seiner Funktionsweise überzeugen, ehe ich mich darauf verlasse. Die Modifikation von Noobody bringt das erhoffte Ergebnis.

@BladeRunner: Ich verwende SuperStrict, da ich aus der C++-Ecke komme und mir daher beim Gedanken an schwammige Deklarationen kalte Schauer den Rücken runterlaufen. Allerdings fällt es mir schwer, die saubere Syntax von BlitzMax zu lernen, wenn die mitgelieferten Beispiele diesbezüglich nicht sehr vorbildlich sind.

@Generell: Was spricht eigentlich gegen eine explizite Delete/Release-Funktion mit aktiviertem Garbage Collector? Das sind keine sich inhaltlich widersprechenden Konzepte.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group