Forum: Compiler & IDEs Garbage Collection - braucht man immer ?


von Sam (Gast)


Lesenswert?

Hi,

eine Frage:


Prozess hat Speicherbereich a->b

Prozess endet, also a->b ist frei


Wozu brauch ich jetzt einen Garbage Collecter ?

Gruß

Sam

von Christian H. (thunder2002) Benutzerseite


Lesenswert?

Wenn du mit Prozessen komplette Programminstanzen und deren Prozesse 
meinst ist das soweit richtig, der komplette Speicherbereich der 
Anwendung wird geleert nach dem beenden.

Anders sieht es aus wenn das Programm noch läuft, hier spart dir ein 
Garbage Collector (GC) die Arbeit Speicherplatz freizugeben aber was 
noch wichtiger ist, er hilft dir keinen Speicherplatz zu vergessen. Bei 
großen Projekten wo man 1000mal eine Variable per Pointer weitergibt 
weiss nachher eh keiner mehr wer die jetzt freigeben darf oder ob noch 
irgendwo anders einer den Wert hinter dem Pointer braucht. Wird zu früh 
aufgeräumt crasht das Programm, räumt es zu spät bis gar nicht auf, so 
blät es sich auf und setzt schlimmstenfalls das System außer Gefecht.

von Frank K. (fchk)


Lesenswert?

Sam schrieb:

> Wozu brauch ich jetzt einen Garbage Collecter ?

Gar nicht. Das Betriebssystem sollte die vom Prozess belegten Resourcen 
am Ende wieder freigeben. Ausnahmen gibts: AmigaOS hatte kein Resource 
Tracking, d.h. der Programmierer war dafür verantwortlich, vor dem 
Programmende alles wieder sauber freizugeben.

Garbage erzeugen nur Java-Programmierer, weil diese nur neue Objekte 
konstruieren, aber nicht wieder manuell zerstören können sollen. Für die 
Müllbeseitigung ist dort die Runtime gedacht.

fchk

von Sven P. (Gast)


Lesenswert?

Christian Hunke schrieb:
> Bei
> großen Projekten wo man 1000mal eine Variable per Pointer weitergibt
> weiss nachher eh keiner mehr wer die jetzt freigeben darf oder ob noch
> irgendwo anders einer den Wert hinter dem Pointer braucht.

Was wiederum einen der wichtigsten Kritikpunkte um GC bildet: Sollte ein 
Programm nicht in der Art strukturiert sein, dass zu keinem Zeitpunkt 
Zweifel existieren, wer welchen Speicherbereich besitzt und freizugeben 
hat?

Ein Schelm, wer jetzt an faule Programmierer denkt.

von Christian H. (thunder2002) Benutzerseite


Lesenswert?

P.S. (leider zu spät):
Für kleine Tools ist ein GC was feines, es spart Arbeit und der Overhead 
ist heute meist selbst auf Handys relativ egal ;) Kritisch sind Projekte 
in Echtzeit, klassischerweise Spiele. Wenn man in jedem von z.B. 60 
Bildern pro Sekunde Sachen für den GC erzeugt darf man sich nicht 
wundern wenn nachher 1 Kern des neuen Multicore Rechners für den GC 
draufgeht ;)

von mano (Gast)


Lesenswert?

Sam schrieb:
> Prozess hat Speicherbereich a->b

jetzt muss ich mal blöd fragen, aber was willst Du damit sagen?

von Rolf Magnus (Gast)


Lesenswert?

Frank K. schrieb:

> Garbage erzeugen nur Java-Programmierer, weil diese nur neue Objekte
> konstruieren, aber nicht wieder manuell zerstören können sollen. Für die
> Müllbeseitigung ist dort die Runtime gedacht.

Das gilt allerdings nur für den Speicher, nicht für andere Ressourcen. 
Das ist der große Haken am Garbage Collector. Bei C++ kann man z.B. das 
Handling aller Ressourcen automatisieren (Stichwort "RAII"), aber man 
muß das eben selbst ausprogrammieren. In Java dagegen wird der Speicher 
grundätzlich vom GC verwaltet, der Rest muß dann zwangsweise immer 
manuell verwaltet werden, da einem da die Destruktoren fehlen.

von Sam (Gast)


Lesenswert?

...ich danke euch, das hat mir sehr geholfen !!!!

von Sam (Gast)


Lesenswert?

Hi,

noch eins ist unklar

In C:

class Hi
{
int zahl=5;
public:
void ausgabe()
{
cout << zahl";
}
~Hi(){};






In Java gibt es zwei Methoden, die eine


Finalize()

soll schlecht sein, weil der GC eingreift,



Dispose()


soll direkt arbeiten.



Verstehe ich nicht  -  warum Finalize() benutzen ?  Warum gibt es die 
Funktion überhaupt ?


... sorry in Java bin ich nicht fit ;)


Gruß

von Sam (Gast)


Lesenswert?

schieb   :-)

von Karl H. (kbuchegg)


Lesenswert?

Sam schrieb:


> In Java gibt es zwei Methoden, die eine
>
>
> Finalize()
>
> soll schlecht sein, weil der GC eingreift,


Was ist daran schlecht, hinter sich aufzuräumen?
Finalize ist genau die Methode, die vom GC noch aufgerufen wird, ehe 
dann das Objekt den großen Bitabfluss hinuntergeht. Das ist der 
Zeitpunkt andem ein Objekt noch eine letzte Chance hat hinter sich 
aufzuräumen (Files zu schliessen, falls das Objekt noch eines in 
Beschlag hat. Den Drucker wieder freigeben. Handles zu GUI Objekten 
wieder zurückgeben. etc ....)

> Dispose()
> soll direkt arbeiten.

dispose ist eine Methode aus einem GUI Framework und macht im Grunde 
dasselbe: Resourcen freigeben.

> Verstehe ich nicht  -  warum Finalize() benutzen ?

Weil der Benutzer deiner Library vergessen haben könnte, auf einem 
Objekt dispose aufzurufe. Beispielsweise.

Du vergleichst hier Äpfel mit Birnen. Beide Funktionalitäten machen zwar 
im Grunde dasselbe, aber zu verschiedenen Anlässen und aus 
unterschiedlichen Gründen. Dazu kommt, dass sie von verschiedenen 
Quellen aus aufgerufen werden. Finalize wird vom GC aus aufgerufen, 
dispose vom Usercode. Der Zweck von Finalize ist es´, dem Objekt eine 
letzte Chance zu geben, wenn der Usercode dispose nicht aufgerufen hat.

Allerdings solltest du jetzt schön langsam in ein Java Forum 
überwechseln.

von klaus (Gast)


Lesenswert?

Sam schrieb:
> Finalize()
>
>
>
> soll schlecht sein, weil der GC eingreift,

Es kann vor allem nicht garantiert werden, dass die finalize() Methode 
vom GC überhaupt aufgerufen wird. Auch kann nichts darüber gesagt werden 
wann der Aufruf erfolgt. Joshua Bloch rät auch aufgrund einiger anderer 
Probleme mit Finalizers in "Effective Java" dazu finalize() wenn es 
vermeidbar ist besser nicht zu verwenden ...

von Andreas F. (aferber)


Lesenswert?

klaus schrieb:
> Es kann vor allem nicht garantiert werden, dass die finalize() Methode
> vom GC überhaupt aufgerufen wird.

Doch, der Garbage Collector ruft immer finalize() auf. Es kann aber per 
default nicht garantiert werden, dass beim Programmende wirklich alle 
dann noch existierenden Objekte explizit aufgeräumt werden, weshalb ggf. 
einige Finalizer nicht mehr aufgerufen werden. Entgegenwirken kann man 
dem mit
1
System.runFinalizersOnExit(true);

> Auch kann nichts darüber gesagt werden
> wann der Aufruf erfolgt.

Das ist der entscheidende Punkt. In vielen Fällen will man externe 
Ressourcen kontrolliert an bestimmten Stellen im Programm freigeben, 
z.B. sollen die 5 GB an temporären Dateien sofort gelöscht werden und 
nicht erst drei Wochen später, wenn die Runtime sich irgendwann mal 
bequemt den Garbage Collector laufen zu lassen. Letzteres ist nur mit 
einer explizit aufzurufenden Cleanup-Methode zu erreichen.

Andreas

von klaus (Gast)


Lesenswert?

> Entgegenwirken kann man dem mit System.runFinalizersOnExit(true);

"The only methods that claim to guarantee finalization are 
System.runFinalizersOnExit and its evil twin, 
Runtime.runFinalizersOnExit. These methods are fatally flawed and have 
been deprecated" [Effective Java]

"This method is inherently unsafe. It may result in finalizers being 
called on live objects while other threads are concurrently manipulating 
those objects, resulting in erratic behavior or deadlock. [Java SDK]

=> besser nicht verwenden

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.