Garbage Collection

Encera

Aktives Mitglied
Hallo zusammen,
ich lerne gerade für meine Oracle OCA Zertifizierung und bin mir noch etwas unsicher was die Garbage Collection anbelangt und zwar folgendes Beispiel;
Java:
public class Phone {

    public static void main(String[] args) {
        Phone phoneA = new Phone();
        Phone phoneB = new Phone();
        
        phoneA = phoneB; //Zeile 1
        phoneB = null; //Zeile 2
        

    }

}

Liege ich richtig in der Annahme dass nach Zeile 1 ein Objekt bereit für die GarbageCollection ist, nämlich PhoneA da im Speicher sowohl phoneA als auch phoneB auf "phoneB" zeigen? Und direkt nach Zeile 2 müssten dann doch beide Objekte bereit für den GarbageCollector sein, da nun phoneB auf null gesetzt wurde oder?
Vielleicht kann mir da kurz wer helfen ob das so stimmt, vor Allem der zweite Teil :)

lg. ~
 

httpdigest

Top Contributor
Male es dir auf. :)

Am Anfang (vor deiner als "Zeile 1" markierten Zeile) gilt:
Code:
phoneA ---> {Phone1}
phoneB ---> {Phone2}
Nach "Zeile 1" gilt:
Code:
            {Phone1}

phoneB ---> {Phone2} <--- phoneA
Nach "Zeile 2" gilt:
Code:
            {Phone1}

            {Phone2} <--- phoneA

phoneB ---> null
Nach "Zeile 2" ist also in der Variablen phoneA weiterhin eine Referenz auf das {Phone2} Objekt gespeichert.
Das Objekt {Phone1} hängt "in der Luft" und kann abgeräumt werden, weil niemand mehr darauf verweist (schon nach "Zeile 1" nicht mehr).
Die Variable phoneB enthält die Nullreferenz, zeigt also auf kein Objekt.
Also: Das Objekt {Phone1} kann ab diesem Zeitpunkt (theoretisch) abgeräumt werden, nicht jedoch das Objekt {Phone2}, da es noch von der Variablen phoneA referenziert wird.
 

Encera

Aktives Mitglied
Male es dir auf. :)

Am Anfang (vor deiner als "Zeile 1" markierten Zeile) gilt:
Code:
phoneA ---> {Phone1}
phoneB ---> {Phone2}
Nach "Zeile 1" gilt:
Code:
            {Phone1}

phoneB ---> {Phone2} <--- phoneA
Nach "Zeile 2" gilt:
Code:
            {Phone1}

            {Phone2} <--- phoneA

phoneB ---> null
Nach "Zeile 2" ist also in der Variablen phoneA weiterhin eine Referenz auf das {Phone2} Objekt gespeichert.
Das Objekt {Phone1} hängt "in der Luft" und kann abgeräumt werden, weil niemand mehr darauf verweist (schon nach "Zeile 1" nicht mehr).
Die Variable phoneB enthält die Nullreferenz, zeigt also auf kein Objekt.
Also: Das Objekt {Phone1} kann ab diesem Zeitpunkt (theoretisch) abgeräumt werden, nicht jedoch das Objekt {Phone2}, da es noch von der Variablen phoneA referenziert wird.
Ahh ich verstehe, danke für die ausführliche Erklärung! :)
 

Oneixee5

Top Contributor
Moin,

tl;dr: Das ursprüngliche phoneB ist weiterhin referenziert und wird folglich vom gc nicht abgeräumt. (Zumindest, solange die Anwendung nicht beendet ist).

phoneA ist nach Zeile 7 theoretisch wech.
Ich glaube langsam, du machst das mit Absicht.
Java:
public class Phone {

    public static void main(final String[] args) {
        Phone phoneA = new Phone();
        Phone phoneB = new Phone();

        phoneA = phoneB; //Zeile 1
        phoneB = null; //Zeile 2

        System.out.println("A:" + phoneA);
        System.out.println("B:" + phoneB);
    }

}
 

Encera

Aktives Mitglied
Hallo zusammen, jetzt muss ich mich diesbezüglich doch nochmal melden weil mir ein Beispiel untergekommen ist bei dem ich zu einem anderen Ergebnis gekommen bin bzw. das ich nicht ganz nachvollziehen kann:

Java:
public class Test {
    public static void main (String[] args) {
        Student s1 = new Student("Alice");
        Student s2 = new Student("Bob");
        Student s3 = new Student("Carol");
        s1 = s3;
        s3 = s2;
        s2 = null;               // Line 14
        System.out.println(s1);  // Student@4554617c
        System.out.println(s2);  // null
        System.out.println(s3);  // Student@74a14482
    }
}

Wenn ich mir das ganze Aufzeichne dann sieht das bei mir so aus:
Code:
s1 --> {s1}
s2 --> {s2}
s3 --> {s3}

       {s1}
s2 --> {s2}
s3 --> {s3} <-- s1

       {s1}
s2 --> {s2} <-- s3, s1
       {s3}
      
s2 --> null
       {s1}
       {s2} <-- s3, s1
       {s3}

Also sind doch nach Line 14 zwei Objekte bereit vom Garbage Collector gesammelt zu werden, nämlich s1 und s2. Die richtige Antwort wäre jedoch das es sich nur um ein Objekt handelt...
 

KonradN

Super-Moderator
Mitarbeiter
Nein, du solltest deine Skizze noch einmal prüfen.

nach s1 = s3 stimmt es noch.
Aber dann stimmt es nicht mehr.

s1 Alice
s2 Bob
s3 Carol

Nach s1 = s3 ist dann:
s1 Carol
s2 Bob
s3 Carol ==> Alice ist bereit für den Garbage Collector

Nun kommt s3 = s2:
s1 Carol
s2 Bob
s3 Bob

Und dann s2 = null:
s1 Carol
s2 null
s3 Bob

Daher sind Carol und Bob beide noch referenziert.
 

mihe7

Top Contributor
Du kommst vermutlich durcheinander, wiel Du die Objekte genauso bezeichnet hast wie Deine Variablen. Unterscheide wenigstens in Klein- und Großbuchstaben.

In Zeile drei wird ein neues Objekt erstellt, nennen wir es mal S1. Die Referenz darauf wird dann in Variable s1 gespeichert. Analog gilt dies für die Zeilen 4 und 5:
Code:
s1 -> {S1}
s2 -> {S2}
s3 -> {S3}

In Zeile 6 wird der Variablen s1 der Inhalt der Variablen s3 zugewiesen. Das ist die Referenz auf S3:
Code:
      {S1}
s2 -> {S2}
s3 -> {S3} <- s1
In Zeile 7 wird der Variablen s3 der Inhalt der Variablen s2 zugewiesen. Das ist die Referenz auf S2:
Code:
      {S1}
s2 -> {S2} <- s3
      {S3} <- s1
In Zeile 8 wird der Variablen s2 null zugewiesen, wird also im Diagramm nicht mehr dargestellt:
Code:
      {S1}
      {S2} <- s3
      {S3} <- s1
Am Ende ist s2 == null, S2 und S3 werden referenziert, S1 nicht mehr und kann daher abgeräumt werden.
 

KonradN

Super-Moderator
Mitarbeiter
Du kannst das übrigens sehr gut an der Ausgabe erkennen. Du hast ja geschrieben:
Java:
        System.out.println(s1);  // Student@4554617c
        System.out.println(s2);  // null
        System.out.println(s3);  // Student@74a14482

Du erkennst also klar zwei Instanzen: @45... und @74...

Besser wäre es natürlich, beim Test der Klasse Student eine toString Methode zu geben so dass man da dann auch die Namen sieht: Carol und Bob.
 

Encera

Aktives Mitglied
Ah okay ich denke ich verstehe danke euch. Mein Fehler lag darin anzunehmen dass, da s1 ja auf s3 zeigt und s3 nun auf s2 automatisch s1 auch auf s2 zeigen muss (wegen s1 = s3)...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L-ectron-X Speicher freigeben - Garbage Collection Java Basics - Anfänger-Themen 6
T Variable in Schleife deklarieren, Speicherplatz, Garbage Collector Java Basics - Anfänger-Themen 10
H Frage zum Garbage Collector Java Basics - Anfänger-Themen 2
K Frage zum Garbage Collector Java Basics - Anfänger-Themen 5
T garbage collector Java Basics - Anfänger-Themen 2
S Vernichtung von objekten mit dem garbage collector Java Basics - Anfänger-Themen 14
I Problem mit garbage collector/Speicherfreigabe Java Basics - Anfänger-Themen 8
J Warum werden Threads nicht vom Garbage-Collector gelöscht? Java Basics - Anfänger-Themen 14
T Memory Leak und der Garbage Collector Java Basics - Anfänger-Themen 21
P Timer-Objekt und Garbage Collector Java Basics - Anfänger-Themen 6
P Garbage Collector beschleunigen Java Basics - Anfänger-Themen 25
U Garbage collector Java Basics - Anfänger-Themen 8
C Garbage Collector Java Basics - Anfänger-Themen 3
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
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
M Collection.sort sortiert nicht Java Basics - Anfänger-Themen 7
D public ArrayList(Collection<? extends E> c); Java Basics - Anfänger-Themen 2
O Verwirrt beim Java Collection Framework aufruf! Java Basics - Anfänger-Themen 9
T Collections Geeignete Collection/Liste/Datenbank Java Basics - Anfänger-Themen 17
E Interface List nicht als Collection an erkannt. Java Basics - Anfänger-Themen 14
F Collection Aufgabe mit LinkedList Java Basics - Anfänger-Themen 3
N Collections Werte aus .txt in einer Collection speichern Java Basics - Anfänger-Themen 11
M Collection Aufgabe Java Basics - Anfänger-Themen 22
Arif Collections Unkonstruiertes Objekt einer Collection hinzufügen Java Basics - Anfänger-Themen 2
W Collection-Problem Java Basics - Anfänger-Themen 35
P Klassen In einer Autoklasse das Objekt Auto mittels Collection Speichern Java Basics - Anfänger-Themen 4
N Collection sortieren/ filtern Java Basics - Anfänger-Themen 7
K Collections Zugriff auf ein bestimmtes Element in der Collection Java Basics - Anfänger-Themen 1
J Objekt in Collection speichern Java Basics - Anfänger-Themen 4
A Interface in Collection (Liste) angeben Java Basics - Anfänger-Themen 2
J Collection Objekt Java Basics - Anfänger-Themen 3
T Collections Zusammengehörende Strings in einer Collection Java Basics - Anfänger-Themen 2
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
B Collections Collection soll nur einen bestimmten Datentyp aufnehmen Java Basics - Anfänger-Themen 12
B addAll(Collection<? extends E> c) Java Basics - Anfänger-Themen 9
K Collections Collection für 12 mio Strings Java Basics - Anfänger-Themen 7
Y Collection der eigenen Klasse Java Basics - Anfänger-Themen 10
S Collections Welche Collection ist am geeignetsten? Java Basics - Anfänger-Themen 3
R Passende Collection gesucht Java Basics - Anfänger-Themen 11
G Collections Wahl der richtigen Collection Java Basics - Anfänger-Themen 11
O Frage zu Verständnis von Collection Java Basics - Anfänger-Themen 4
D Scala Iterable zu Java Collection konvertieren Java Basics - Anfänger-Themen 3
D Frage zu Collection und deren Anwendung Java Basics - Anfänger-Themen 2
S Welche Collection kann sich selber sortieren? Java Basics - Anfänger-Themen 8
J Collection soll übergeben werden... Java Basics - Anfänger-Themen 7
C Vector - obsolete collection Java Basics - Anfänger-Themen 1
B Iterator und Collection Java Basics - Anfänger-Themen 11
G Java Collection Frameworks Java Basics - Anfänger-Themen 5
D Collection Konvertieren Java Basics - Anfänger-Themen 7
K Datentypen Über Collection iterieren bringt fehler Java Basics - Anfänger-Themen 8
K OOP Aus Collection Objekte bestimmter Subklassen entfernen Java Basics - Anfänger-Themen 7
S Welche Collection? Java Basics - Anfänger-Themen 5
S Collection rückwärts durchsuchen Java Basics - Anfänger-Themen 4
W Wie kann ich auf Object meiner Collection zugreifen Java Basics - Anfänger-Themen 7
J Collection Vector Java Basics - Anfänger-Themen 8
B Collection während Iteration verändern Java Basics - Anfänger-Themen 7
T Collection in collection Java Basics - Anfänger-Themen 6
T Collection von Objekten verschiedener Klassen Java Basics - Anfänger-Themen 4
J Collection ArrayList und mit erweitertem for iterieren Java Basics - Anfänger-Themen 7
J Probleme mit Collection ArrayList Java Basics - Anfänger-Themen 2
C Collection vs. LinkedList, Abstrakt vs. Konkret Java Basics - Anfänger-Themen 9
G Collection<BufImg> in Datei speichern Java Basics - Anfänger-Themen 8
A Collection auslesen ohne Objekttyp zu kennen? Java Basics - Anfänger-Themen 11
G Collection<Strings> - Liste von Strings verwalten Java Basics - Anfänger-Themen 9
A Struts: Über Collection iterieren mir Taglibs? Java Basics - Anfänger-Themen 13
S Collection<Typ> sort Java Basics - Anfänger-Themen 4
0x7F800000 elemente aus einer Collection korrekt löschen Java Basics - Anfänger-Themen 8
T Frage zu Vererbung beim Collection-Framework Java Basics - Anfänger-Themen 4
I Frage zu Collection und List Interfaces Java Basics - Anfänger-Themen 2
M Object [][] ist nicht vom Typ Collection? Java Basics - Anfänger-Themen 3
S Collection wie LinkedHashMap Java Basics - Anfänger-Themen 7
J LinkedList, Collection, ArrayList, List. was denn bitte? Java Basics - Anfänger-Themen 6
S Collection Sort Java Basics - Anfänger-Themen 15
A Welche Collection? Java Basics - Anfänger-Themen 13
C Collection in Verbindung mit String.split speicherlastig Java Basics - Anfänger-Themen 20
S Collection in einer Collection Java Basics - Anfänger-Themen 5
A Welche Collection soll ich nehmen? Java Basics - Anfänger-Themen 4
E welche Datenstruktur (Collection) Java Basics - Anfänger-Themen 4
K Collection und Iterator Java Basics - Anfänger-Themen 7
I Bestimmte Variablen in Collection Classes Java Basics - Anfänger-Themen 2
M Source Code von Collection Framework, etc. Java Basics - Anfänger-Themen 3
vogella Cast from Collection.toArray to String[] Java Basics - Anfänger-Themen 2
K Verständnisfrage Collection, ArrayList und Referenzen Java Basics - Anfänger-Themen 4
S Mit Collection<int[]> umgehen Java Basics - Anfänger-Themen 2
S welche collection ? String und object Java Basics - Anfänger-Themen 5
M gibt es eine collection mit definierter maximaler größe Java Basics - Anfänger-Themen 4
G Collection Framework Java Basics - Anfänger-Themen 8
V Mehrdimensionale Collection? Java Basics - Anfänger-Themen 4
U JSTL: Collection auslesen mit forEach Java Basics - Anfänger-Themen 1
A Interface Collection implementieren? Java Basics - Anfänger-Themen 4
I Collection sortieren, ":" höchste "Priorität& Java Basics - Anfänger-Themen 4
P Äquivalent zu Visual Basic Collection Java Basics - Anfänger-Themen 6
G Collection, aber welche? Java Basics - Anfänger-Themen 6
A Collection<String> Java Basics - Anfänger-Themen 4
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
E Strings in Collection Java Basics - Anfänger-Themen 6
R welche Collection nehmen? Java Basics - Anfänger-Themen 4
P Collection Vector speichern mittels Serialisierung? Java Basics - Anfänger-Themen 2
megachucky Collection Vector: ausgabe klappt nicht richtig Java Basics - Anfänger-Themen 9
T Welche Collection nehmen? HashMap? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben