Forum: PC-Programmierung Sollte man in Java Objekte aufräumen, wenn das Programm beendet wird?


von JJ (Gast)


Lesenswert?

Wenn ich z.b. eine Klasse mit einer Main Methode habe, in der Objekte 
erzeugt wurden, soll ich die nicht mehr benötigten Objekte dann am Ende 
derefenzieren so dass sie der GC explizit aufräumt oder lässt man das 
weg, weil das Programm ja eh beendet wird?
1
  public static void main(String[] args) {
2
              Person per1 = new Person("Fritz");
3
              Person per2 = new Person("Hans");
4
              Boolean ende = false;
5
6
              do{
7
                // mach was, bis ende gleich true
8
9
              while(!ende)
10
11
              /* Soll man hier die Objekte dann derefenzieren, 
12
                 so dass der GC sie expliztit aufräumt oder
13
                 soll man das weg lassen? * /
14
              // z.b. könnte ich ja schreiben:
15
              per1 = null;
16
              per2 = null;
17
18
        }

von Speichen (Gast)


Lesenswert?

Es gibt auch andere Ressourcen außer Speicher die ggf. kontrolliert 
abgeräumt werden sollten.

von Tilo R. (joey5337) Benutzerseite


Lesenswert?

Nicht aufräumen. Es sei denn, andere Ressourcen, z.B. offene 
Filehandles, DB-Connections oder was auch immer, hängen da mit dran. Die 
sollte man natürlich zumachen.

Das selbe gilt übrigens auch während des Programms.
Der Garbage-Collector weiß am besten, was nicht mehr gebraucht wird. Ein 
Aufruf von finalize() oder nullen der Objektreferenzen ist i.A. nicht 
sinnvoll, insbesondere wenn die Variablen eh bald aus dem Scope laufen.

von whatt (Gast)


Lesenswert?

file handles schließt das Betriebssystem automatisch wenn der Prozess 
hops geht.

von Tilo R. (joey5337) Benutzerseite


Lesenswert?

whatt schrieb:
> file handles schließt das Betriebssystem automatisch wenn der Prozess
> hops geht.

Ja, war eher so als allgemeiner Hinweis gedacht.
Man soll nicht aufräumen aber sich angewöhnen, externe Ressourcen schon 
irgendwann zumachen, zumindest wenn das Programm noch länger läuft.

(Strategien wie Connection Pooling jetzt mal außen vor)

von basti (Gast)


Lesenswert?

Der GC räumt hinter dir auf.
alles was keine Referenz mehr hat wird vom GC gelöscht.
xx o;
o = new xx(); //erstes obj
o = new xx(); // zweites obj

jetzt existiert auf das erste obj keine Referenz mehr und der GC löscht 
dieses.

wenn du jetzt die main verlassen werden wird die Referenz auf das zweite 
obj auch gelöscht(Geistlichkeit Bereich), sodass dann auch das zweite 
obj vom GC eingesammelt wird.

von basti (Gast)


Lesenswert?

> obj auch gelöscht(Geistlichkeit Bereich), sodass dann auch das zweite
> obj vom GC eingesammelt wird.

natürlich "Gültigkeitsbereich" ...

von Peter II (Gast)


Lesenswert?

basti schrieb:
> o = new xx(); //erstes obj
> o = new xx(); // zweites obj
>
> jetzt existiert auf das erste obj keine Referenz mehr und der GC löscht
> dieses.

so einfach ist es leider nicht. Es gibt Resourcen (Filehandels, 
Schriftarten) wo man nicht funktioniert.

Es wird zwar das Objekt gelöscht aber die Resource nicht freigegeben.

von basti (Gast)


Lesenswert?

> Es wird zwar das Objekt gelöscht aber die Resource nicht freigegeben.

ja das stimmt.
Aber ich lasse doch keine Resourcen offen, wenn ich sie nicht mehr 
brauche :)

von JJ (Gast)


Lesenswert?

Danke.

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.