garbage collector prog

sh33p

Bekanntes Mitglied
Java:
public class Alpha {

  
  static int nummer;
  
  public Alpha (){
  nummer++;
  System.out.println("Objekt " + nummer + " wurde erzeugt.");
  }
  
  protected void finalize() throws Throwable{ 
  
    super.finalize();
          System.out.println("Objekt " + nummer + " wurde gelöscht.");   
          nummer--;
       }
    }
  public class GarbageTest {
    
    static public void main (String[] args) {
      
      int n = 8; /* Anzahl zu erzeugender Objekte */
      
      java.util.Scanner scanner = new java.util.Scanner (System.in);
      System.out.println ("Gib die Anzahl " + "zu erzeugender Objekte ein: ");
    
      try {
        n = scanner.nextInt();
      }
      catch (NumberFormatException e) {
        System.out.println (e.toString());
        System.exit (1);
      }
      for (int lv = 0; lv < n; lv++) {
        Alpha alphaRef = new Alpha();
      }
    }
}

Kann mir mal jemand erklären was das Prog und der Garbage Collector hier genau macht?
danke🙂
 
ich erklär nurmal mit eigenen worten die funktion des garbage collector. Bei jeder instanziierung von einem objekt wird irgendwo im speicher das objekt erstellt und in eine variable xyz die referenz auf das objekt geschrieben. wenn die variable xyz jetzt auf ein neues objekt2 referenziert (das einen ganz anderen speicherort wie objekt1 hat), ist objekt1 auschuss, weil es nicht mehr zu erreichen ist. diesen ausschuss beseitigt der garbage collector.

das ganze mal an einem beispiel:
Java:
	  String xyz = new String("Objekt1"); //1
	  xyz = "Objekt2"; //2

1, Ein Stringobjekt wird instantiiert und die Referenz (den ort, wo es zu finden ist) in die Variable xyz geschrieben.
2, Ein neues Stringobjekt wird instantiiert und die Referenz (den ort, wo es zu finden ist) in die Variable xyz geschrieben.
-> das erste Stringobjekt kann nicht mehr, auf keinem denkbaren weg, aufgerufen werden und ist deshalb ausschuss! die bereinigung übernimmt der garbage collector.
 
Zuletzt bearbeitet:
Bei einer Vorlesung hat der Lehrer mal ein schönes Beispiel gegeben:

Man geht Gassi und hat mehrere Hunde an der Leine. Die Hunde sind die Objekte und die Leinen sind die Referenzen auf die Objekte.
Solange die Hundeleine existiert, kann ich den Hund steuern.
Verliere ich jedoch eine Hundeleine, ist der Hund nicht mehr zu steuern und wird vom Tierfänger(Garbage Collector) geholt, damit der Hund nicht unbeaufsichtigt rumläuft.
...
der Garbage Collector entsorgt dann jedoch das Objekt und hält es nicht irgendwo zwischen, der Tierfänger sollte es nicht tun 😀

Also:
Sobald du keine Referenz auf ein Objekt hast, kannst du dieses Objekt nie wieder ansprechen und es ist Datenmüll -> entsorgen.
 
Sobald du keine Referenz auf ein Objekt hast, kannst du dieses Objekt nie wieder ansprechen und es ist Datenmüll -> entsorgen.

Leider nein. In der finalize()-Methode existiert das Objekt noch. Ein nicht sehr umsichtiger Programmierer kann jetzt wieder Referenzen auf das Objekt aufbauen...
Ähnliche Szenarien gibt es für Soft-, Weak- und Phantomreferences, die sind aber oft ein wenig konstruiert ;-)
 

Zurück
Oben