Was machen mit nicht mehr verwendeten Instanzen ?

Carcharoth

Bekanntes Mitglied
Guten Tag

Ich habe gelesen, dass in Java der Garbage Collector dafür sorgt, dass nicht mehr verwendete Objekte eingesammelt und entsorgt werden.

Ich frage mich was eine gute Praxis ist.
Kann man einfach auf den Garbage Collector vertrauen - der wird's schon richten - oder sollte man, nach Verwendung, die Objekte manuell freigeben (wie man es vielleicht aus anderen Sprachen sich angewöhnt hat) ?

Danke für eure Expertenmeinungen.

Gruss
 

httpdigest

Top Contributor
oder sollte man, nach Verwendung, die Objekte manuell freigeben
Nein, brauchst du nicht, und geht in Java auch gar nicht. Einfach nichts tun mit den Objekten.
Es sei denn natürlich, dass du als Teil deines Objektes auch andere Systemressourcen mit Plattform abhängigen APIs alloziierst, die nicht durch die JVM gemanaged werden, und die du auch wieder explizit freigeben musst. Das ist aber eher selten der Fall.
 

Carcharoth

Bekanntes Mitglied
Also auch kein meinObjekt = null; ?

Zusatzfrage: wann kommt der Garbage Collector vorbei? Während der Ausführung oder am Schluss?
Ich habe grössere Berechnungen und bin möglicherweise froh, wenn der Speicher unterwegs schon freigegeben wird.
 

Oneixee5

Top Contributor
Du kannst i.d.R. auf den GC vertrauen. Zu beachten ist aber, dass native Ressourcen u.U. geschlossen werden müssen. Also z.B.: alles was mit JDBC oder Streams/Filesystem zu tun hat. Es gibt aber trotzdem die Möglichkeit sich selbst eine Falle zu stellen. Wenn es dazu kommst, dass Referenzen auf erzeugte Objekte nie aufgelöst werden, Dann kann der GC nicht erkennen das diese Objekte beseitigt werden können. Das führt zu s.g. Speicherlecks und in der Folge zum Absturz deines Programms. Als Anfänger solltest du dir aber deswegen nicht das Hirn zermartern sondern einfach sauber programmieren lernen.
 
K

kneitzel

Gast
Also auch kein meinObjekt = null; ?
Nein, da ist nichts notwendig. So eine Optimierung wäre evtl. denkbar, wenn Du eine große Instanz hast (z.B. große Bitmap) und es sich um eine Instanzvariable handelt die nicht neu überschrieben wird oder so ... Aber sowas habe ich irgendwie noch nie gehabt und es ist auch normalerweise nicht notwendig.
Zusatzfrage: wann kommt der Garbage Collector vorbei? Während der Ausführung oder am Schluss?
Ich habe grössere Berechnungen und bin möglicherweise froh, wenn der Speicher unterwegs schon freigegeben wird.
Das ist Abhängig von der genauen Implementation. Es gibt diverse GC Implementationen.

In dem "Normalfall" läuft der GC in einem eigenen Thread nebenher und wird von Zeit zu Zeit aktiv. Des Weiteren kann er an getriggert werden, wenn Speicher reserviert werden soll aber derzeit nicht genug freier Speicher zur Verfügung steht.

Eine Übersicht über die Standard Vorgehensweise findet sich z.B. unter https://docs.oracle.com/javase/10/gctuning/garbage-collector-implementation.htm

Eine Übersicht über ein paar mögliche Garbage Collectors findet sich z.B. unter https://www.baeldung.com/jvm-garbage-collectors
 

Carcharoth

Bekanntes Mitglied
Danke für die sehr vollständigen Antworten.

Zusatz-(und letzte) Frage zum Thema Speicher:
Beide folgende Varianten funktionnieren. Ich habe aber das Gefühl, die erste Variante ist speichertechnisch verschwenderisch. Stimmt das so ? Sprichst sonst etwas für die eine oder für die andere Variante.

Java:
while (...) {
    double zwischenResultat = ...;
            
    ...
}

Java:
double zwischenResultat;
        
while (...) {
    zwischenResultat = ...;

    ...
}
 

httpdigest

Top Contributor
Es kommt hier auf die ganz konkrete JVM Implementierung an. Und in einer "tiered compilation" JVM wie HotSpot, kommt es auch noch darauf an, mit welchem Compiler der Code dieser Methode kompiliert wurde. Und das wieder hängr davon ab, wie gross die Methode ist und wie oft sie ausgeführt wurde. Sagen wir mal, dass alle Bedingungen erfüllt sind und mit C2 compiliert wird. Dann findet sowieso eine Liveness und Escapeanalyse statt und die Variable wird sofort abgeräumt nach der Methode, wenn keine Instanz die Methode (bzw. ganz korrekt den "Inline-Boundary") verlässt.
 

LimDul

Top Contributor
Grundsätzlich ist das eine eher akademische Diskussion - interessant, aber nicht praxisrelevant. Denn das was man optimieren könnte ist nicht messbar. Wichtiger ist es sauberen Code zu schreiben - und da ist die erste Variante in der Regel besser als die erste, weil der Scope der Variablen damit kleiner und klarer ist.
 

Carcharoth

Bekanntes Mitglied
Ok verstehe ich.
Ich mache gerade sehr grosse Berechnungen mit Millionen von Iterationen und da fragte ich mich eben, ob es nicht doch auch relevant sein könnte.
 

LimDul

Top Contributor
Wenn man in Java Probleme mit dem Speicher hat, dann sind es nicht einzelne Instanzen, sondern Referenzen die man auf Listen nicht mehr benötigter Daten (wie z.B. Bilder) hält.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich mache gerade sehr grosse Berechnungen mit Millionen von Iterationen und da fragte ich mich eben, ob es nicht doch auch relevant sein könnte.
Optimierungsmöglichkeiten gibt es da bestimmt - einen double vor oder in der Schleife zu deklarieren macht da aber keinen Unterschied. Kleinerer Scope ist grundsätzlich schon sinnvoll, allein schon zum vermeiden von Fehlern, und könnte u.U. auch dem Compiler bei Escape Analysis helfen Ausnahmen gibt es aber auch dort, zb wenn man damit deutlich weniger Objekte alloziieren muss, und der Compiler das nicht selbst optimieren kann.

Je nach Art der Berechnungen macht vielleicht auch Nutzung der Vector API Sinn.
 

White_Fox

Top Contributor
da ist die erste Variante in der Regel besser als die erste
Jo...

Aber es stimmt schon: In Hochsprachen zu optimieren ist grober Käse, da kommst du nicht weit. Ein neues Javaupdate, ein anderer Compiler - und schon verhält sich dein Programm wieder etwas anders bezüglich der Laufzeit und Speicherverhalten. Und dann kommt noch dazu, daß in Java ja noch zur Laufzeit etwas umherkompiliert wird. Das genaue Laufzeitverhalten ist da praktisch unvorhersehbar, wenn man nicht gerade direkt an der JMV-Entwicklung beteiligt ist (und womöglich selbst dann nicht einmal).

Bei hardwarenahen Sprachen wie C wird das zwar oft gemacht, aber da hat man eigentlich genau dieselben Probleme: Anderer Compiler, andere Optimierungsoptionen - und schon läuft das Programm etwas anders als gewollt/gedacht.

Daher: Wenn man ernsthaft Ressourcen optimieren will/muß, macht man das in Assembler - oder gar nicht. Hochsprachen sind mal dafür entwickelt worden, um von der konkreten Maschine zu abstrahieren, und daher ist es schon rein vom Ansatz her völlig unsinnig, in Hochsprachen irgendwas optimieren zu wollen. Und wenn du dich in diese Gegend einarbeiten willst würde ich dir raten, tatsächlich mal ASM zu programmieren. Kleine 8-Bit-Mikrocontroller oder so etwas...da lernt man sehr viel und man sieht dann auch, wieviele Möglichkeiten man auf der Maschine hat, einen Haufen Anweisungen abzuarbeiten. Ich greife dein Beispiel mal auf:

Danke für die sehr vollständigen Antworten.

Zusatz-(und letzte) Frage zum Thema Speicher:
Beide folgende Varianten funktionnieren. Ich habe aber das Gefühl, die erste Variante ist speichertechnisch verschwenderisch. Stimmt das so ? Sprichst sonst etwas für die eine oder für die andere Variante.

Java:
while (...) {
    double zwischenResultat = ...;
           
    ...
}

Java:
double zwischenResultat;
       
while (...) {
    zwischenResultat = ...;

    ...
}

Es ist keineswegs gesagt, daß der Computer diese Schleife tatsächlich als Schleife ausführt. 'Schleife' heißt, am Ende einen Rücksprung zum Startpunkt der Schleife zu haben - und Sprungbefehle kosten Rechenzeit. Einmal zum Zurückspringen, und dann zum Prüfen der Abbruchbedingung der Schleife.
Jetzt gibt es aber nichts, was den Compiler z.B. daran hindert, die Anweisungen in der Schleife einfach dreimal hintereinander zu kopieren - ohne Sprungbefehle. Wenn der Speicher egal ist, aber ein paar Takte gespart werden können - warum nicht?
Nicht selten weiß man als Programmierer ja auch nicht, wie oft die Schleife ausgeführt wird. Aber die JVM hat vielleicht schon eine Ahnung, und macht zur Laufzeit, was sie gerade für richtig hält - je nach JVM-Implementierung, Rechner, Mondphase und ob die JVM um Mitternacht von 12 Jungfrauen kompiliert wurde oder nicht.

Es wäre auch durchaus denkbar, daß deine Variable 'zwischenResultat' nur in einem Rechenregister existiert. Da muß sie sowieso rein, um eben darauf zu rechnen. Dann würde dafür aber überhaupt kein Speicher alloziiert werden, und jede Diskussion über den Speicherbedarf wäre völlig gegenstandslos.

Aber das sind alles Dinge, die weißt du zur Programmierzeit einfach nicht. Sie sind sogar so gebaut, daß du sie nicht wissen mußt. Also vertrau den Machern der JVM und dem ganzen Drumherum - einerseits sind das kluge Leute, andererseits hast du sowieso keine andere Wahl (sofern du nicht JVM-Assembler lernen willst).
 

White_Fox

Top Contributor
Noch ein kleiner Nachtrag:
Ich mache gerade sehr grosse Berechnungen mit Millionen von Iterationen und da fragte ich mich eben, ob es nicht doch auch relevant sein könnte.
Numerik ist eine Wissenschaft für sich. Ein Kollege auf Arbeit befaßt sich gerade etwas mit der Berechnung von elektrischen Feldern in Python. (Und ich selber habe auch etwas ähnliches vor, wenn mein aktuelles Projekt ausgereift ist.)

Der erzählte mir neulich mal, daß es einen großen Unterschied macht wie man berechnet. Man nehme z.B. ein sehr großes Array von Fließkommazahlen und bilde die Summe. Wenn man einfach über das Array iteriert und stumpf alles in einer Schleife aufsummiert läuft man irgendwann in das Problem, daß die Addition von sehr großen und sehr kleinen Werten nach und nach zu Fehlern führt.
Dann gibt es Verfahren, daß man z.B. erst ähnlich große Zahlen addiert, und dann die Zwischensummen davon, usw.

Das sind Dinge, die würde ich mir an deiner Stelle mal ansehen, denn die prinzipiellen Unzulänglichkeiten moderner Rechentechnik, wie sie z.B. durch die Darstellung von Fließkommazahlen zustangekommen, kann dir die JVM auch nicht wegoptimieren. Ich muß jedoch noch hinzufügen daß ich mich damit selber noch nicht beschäftigt habe und das nur vom Hörensagen weiß.
 

Carcharoth

Bekanntes Mitglied
Danke für eure Gedanken.
Ich sehe ein, dass die Optimierung auf der Ebene auf der ich programmiere, schwierig wenn nicht ganz unmöglich ist.

Der erzählte mir neulich mal, daß es einen großen Unterschied macht wie man berechnet.

Da hast du bzw. dein Kollege absolut recht. Ich hantiere gerade mit sehr grossen Zahlen herum, und da liegt tatsächlich viel Optimierungspotential in der Organisation der Berechnungen! Anspruchsvoll aber sehr interessant, kann ich nur empfehlen ;-)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
R Kann jemand diese Java Programmierung machen? Versteh ich leider nicht Java Basics - Anfänger-Themen 17
O Will ein Jar-Archive machen mit FAT JAR - geht nicht ! Java Basics - Anfänger-Themen 2
G JTable nicht änderbar machen Java Basics - Anfänger-Themen 2
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
A Methoden Guten Tag , ich wollte so machen dass wenn meine frog an eine fly/bee geht dann an meine Tafel geht der zahl +1 hoch. Java Basics - Anfänger-Themen 2
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
I Kamera anschließen / Bild machen / Live View / Externe Blitz Java Basics - Anfänger-Themen 19
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
A Wie könnte man diesen Code kürzer machen ? Java Basics - Anfänger-Themen 7
K mit <<1 kann man mal 2 machen, mit >>2 geteilt durch zwei und was bewirkt <<<1 und >>>1? Java Basics - Anfänger-Themen 5
U Char zu einem String machen Java Basics - Anfänger-Themen 1
N Java-Code abwärtskompatibel machen Java Basics - Anfänger-Themen 4
B Screenshots machen und zwar viele und speichern Java Basics - Anfänger-Themen 12
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
N Wie kann ich eine meine Variable Final machen? Java Basics - Anfänger-Themen 1
M Ist es möglich, das größte und zweitgrößte element in einem Array mit nur einer Schleife ausfindig zu machen ? Java Basics - Anfänger-Themen 19
H Array Slot frei machen Java Basics - Anfänger-Themen 3
H Array Slot frei machen Java Basics - Anfänger-Themen 4
A Algorithmus effizienter machen Java Basics - Anfänger-Themen 1
iman Eingabe von Benutzer Filter machen. Java Basics - Anfänger-Themen 7
F JTextField Kursiv und Fett machen Java Basics - Anfänger-Themen 4
F Aufgabenstellung genauer formulieren/verständlicher machen? Java Basics - Anfänger-Themen 10
A Ich habe das Gefühl etwas grundlegendes falsch zu machen Java Basics - Anfänger-Themen 6
J Variablen mit einer anderen Klasse bekannt machen Java Basics - Anfänger-Themen 7
I JFrame proportional verkleinerbar machen Java Basics - Anfänger-Themen 3
F Aus geraden eine Kurve machen Java Basics - Anfänger-Themen 6
G Boolschen Ausdruck true machen Java Basics - Anfänger-Themen 2
M Java Methode editierbar machen im Programm Java Basics - Anfänger-Themen 62
T Wie weiter machen? Java Basics - Anfänger-Themen 9
G Erste Schritte Fehler ausfindig machen Java Basics - Anfänger-Themen 4
J Anfänger: ActionListener und ProcessBuilder machen Probleme Java Basics - Anfänger-Themen 6
J Fenster wieder unsichtbar machen Java Basics - Anfänger-Themen 2
DaCrazyJavaExpert JScollPane scrollbar unsichtbar machen Java Basics - Anfänger-Themen 2
P Aus einem Array zwei Arrays machen Java Basics - Anfänger-Themen 3
G Objekt Instanziierung von Eingabe abhängig machen Java Basics - Anfänger-Themen 5
B Unique ID nochmal Unique machen Java Basics - Anfänger-Themen 20
S JLabel sichtbar machen/GUI Java Basics - Anfänger-Themen 3
T Jlabel durch Text in 2 anderen Jlabels sichtbar machen Java Basics - Anfänger-Themen 4
W Wie kann man zufällige Anordnungen machen? Java Basics - Anfänger-Themen 1
S Resourcen-Dateien im Jar-File verfügbar machen (Intellij 14) Java Basics - Anfänger-Themen 14
D Objekt Transparenter machen Java Basics - Anfänger-Themen 1
S OOP Frage: Methoden nur bei bestimmten Gegebenheiten aufrufbar machen? Java Basics - Anfänger-Themen 4
A Wie kann ich mein Programm noch effizienter machen? Java Basics - Anfänger-Themen 1
S BufferedImage heller/dunkler machen mit RescaleOp Java Basics - Anfänger-Themen 2
I OOP Wie kann ich diesen Code 'Objektorientiert machen' ? Java Basics - Anfänger-Themen 1
C Mit Java Musik machen? Java Basics - Anfänger-Themen 86
TheSorm String zu Methode machen Java Basics - Anfänger-Themen 1
S Funktionen/Atrribute nur innerhalb einer package Zugänglich machen Java Basics - Anfänger-Themen 8
O Zwei Methoden zueinander Thread-safe machen (Locken) Java Basics - Anfänger-Themen 9
Y Eingabe-Formular mit JSP dynamisch machen - j/n/wie? Java Basics - Anfänger-Themen 2
M Ausführen rückgängig machen Java Basics - Anfänger-Themen 2
K RGB Wert Heller machen (Dunkler machen klappt) Java Basics - Anfänger-Themen 2
G Spalte in JTable unsichtbar machen, Zugriff auf Daten ermöglichen Java Basics - Anfänger-Themen 2
T Text auf der Konsole farbig machen Java Basics - Anfänger-Themen 6
O Eigenen Addon-Loader machen? Java Basics - Anfänger-Themen 33
L Auf herunterfahren des PCs reagieren und Datensatz update machen Java Basics - Anfänger-Themen 15
J jar Dateien global erreichbar machen Java Basics - Anfänger-Themen 3
I Objekte verfügbar machen Java Basics - Anfänger-Themen 5
D Panel sichtbar/unsichtbar machen im ActionListener Java Basics - Anfänger-Themen 3
R Anzahl der ineinander verschachtelten for-Schleifen von Variable abhängig machen Java Basics - Anfänger-Themen 5
K Vererbung Methoden in klassen auslagern und in mehreren Klassen verfügbar machen Java Basics - Anfänger-Themen 8
B Datentypen Casts typesafe machen? ("unchecked") Java Basics - Anfänger-Themen 10
A Objekt global verfügbar machen Java Basics - Anfänger-Themen 4
B Threads Geschwindigkeit der Befehle auf verschiedenen PCs gleich machen Java Basics - Anfänger-Themen 3
H Ausgabe nebenläufig machen Java Basics - Anfänger-Themen 6
S Erste Schritte import für andere Klassenfiles verfügbar machen? (Java unter Eclipse) Java Basics - Anfänger-Themen 8
GianaSisters Methoden eigenes TableModel -> removeRow möglich machen Java Basics - Anfänger-Themen 30
G Eingabe beliebig lang machen Java Basics - Anfänger-Themen 8
S Kapselung Member korrekt nach aussen verfügbar machen Java Basics - Anfänger-Themen 6
C Threads Methode unterbrechbar machen Java Basics - Anfänger-Themen 12
S Bytecode sichtbar machen Java Basics - Anfänger-Themen 2
L Aus ArrayInformationen Objekt machen? Java Basics - Anfänger-Themen 6
E Klasse abstract machen Java Basics - Anfänger-Themen 3
K Klasse für andere Klassen sichtbar machen Java Basics - Anfänger-Themen 6
P Aus einer Klasse ein Interface machen? Java Basics - Anfänger-Themen 5
B String zu int machen Java Basics - Anfänger-Themen 23
M Programm lauffähig machen ohne Run Configurations Java Basics - Anfänger-Themen 5
M aus vielen backsalshs einen machen Java Basics - Anfänger-Themen 6
M Backslash aus mehreren einen machen? Java Basics - Anfänger-Themen 7
B Variablen Variablen in try / catch "public" machen? Java Basics - Anfänger-Themen 3
F Was soll dieses Programm genau machen ? Java Basics - Anfänger-Themen 9
J Wie java programm noch schneller machen? Java Basics - Anfänger-Themen 30
R Problem: Threads Synchronized machen Java Basics - Anfänger-Themen 5
TheKing Bild nur in Kreis sichtbar machen Java Basics - Anfänger-Themen 6
V JFrame erst sichtbar machen wenns geladen ist Java Basics - Anfänger-Themen 8
J Oracle XE bekannt machen Java Basics - Anfänger-Themen 8
K Farbe heller machen Java Basics - Anfänger-Themen 4
C OOP Klassen in der "Hauptklasse" bekannt machen Java Basics - Anfänger-Themen 4
Q Iteration wie machen Java Basics - Anfänger-Themen 5
T Applet zentrieren / Rand machen Java Basics - Anfänger-Themen 5
M Fenster unsichtbar machen Java Basics - Anfänger-Themen 9
J binaerbaum aus listen machen Java Basics - Anfänger-Themen 8
A snapshot machen Java Basics - Anfänger-Themen 4
C Wie Objekte am besten anklickbar machen ? Java Basics - Anfänger-Themen 9
J arraylist ausserhalb der main Methode zugänglich machen (Elemente adden und updaten) Java Basics - Anfänger-Themen 4
H Parameterobjekt in App anwendungsweit verfügbar machen Java Basics - Anfänger-Themen 6
H JTable editierbar machen Java Basics - Anfänger-Themen 2
N 2 Befehle zu einem machen Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben