Release ohne Wirkung (Garbage Collector)
Übersicht

![]() |
koril-kBetreff: Release ohne Wirkung (Garbage Collector) |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group