CodeGym /Java-Blog /Random-DE /Objektlebenszyklus
Autor
John Selawsky
Senior Java Developer and Tutor at LearningTree

Objektlebenszyklus

Veröffentlicht in der Gruppe Random-DE
Hallo! Ich denke, Sie wären nicht sehr überrascht, wenn ich Ihnen sagen würde, dass Ihr Computer nur über eine begrenzte Speicherkapazität verfügt :)
Objektlebenszyklus – 1
Sogar Ihre Festplatte (die um ein Vielfaches größer ist als der Arbeitsspeicher) kann mit Ihren Lieblingsspielen, Fernsehsendungen und anderen Dingen vollgestopft sein. Um dies zu verhindern, müssen Sie den aktuellen Zustand des Arbeitsspeichers Ihres Computers überwachen und unnötige Dateien löschen. Was hat das alles mit der Java-Programmierung zu tun? Ganz direkt! Schließlich führt die Erstellung eines Objekts dazu, dass die Java-Maschine ihm Speicher zuweist . Ein großes reales Programm erstellt Zehntausende oder Hunderttausende von Objekten, und jedem von ihnen wird ein Teil des Speichers zugewiesen. Aber was glauben Sie, wie viele dieser Objekte gibt es? Sind sie die ganze Zeit „lebendig“, während unser Programm läuft? Natürlich nicht. Trotz all ihrer Vorteile sind Java-Objekte nicht unsterblich :) Objekte haben ihren eigenen Lebenszyklus. Heute machen wir eine kleine Pause beim Schreiben von Code und erkunden diesen Prozess :) Es ist auch sehr wichtig, um zu verstehen, wie ein Programm funktioniert, und um Ressourcen zu verwalten. Wo beginnt also das Leben eines Objekts? Wie ein Mensch, von Geburt an, also bei seiner Erschaffung.

Cat cat = new Cat();// Our Cat object's lifecycle begins now!
Zunächst weist die Java Virtual Machine den zum Erstellen des Objekts erforderlichen Speicher zu. Anschließend erstellt es einen Verweis darauf (in unserem Fall cat), um den Überblick zu behalten. Dann werden alle Variablen initialisiert, der Konstruktor aufgerufen und unser neues Objekt lebt nun sein eigenes Leben :) Die Lebensdauer von Objekten variiert. Genaue Zahlen gibt es hier nicht. In jedem Fall lebt ein Objekt im Programm und führt seine Funktionen für einen bestimmten Zeitraum aus. Genauer gesagt ist das Objekt „lebendig“, solange es Hinweise darauf gibt. Sobald keine Referenzen vorhanden sind, „stirbt“ das Objekt. Zum Beispiel:

public class Car {
  
   String model;

   public Car(String model) {
       this.model = model;
   }

   public static void main(String[] args) {
       Car lamborghini  = new Car("Lamborghini Diablo");
       lamborghini = null;

   }

}
Bei dieser main()Methode erlischt das Autoobjekt „Lamborghini Diablo“ in der zweiten Zeile. Es gab nur einen Verweis darauf und der Verweis wurde auf null gesetzt. Da es keine Hinweise mehr auf Diablo gibt, wird es zu „Müll“. Dazu muss eine Referenz nicht auf Null gesetzt werden:

public class Car {

   String model;

   public Car(String model) {
       this.model = model;
   }

   public static void main(String[] args) {
       Car lamborghini  = new Car("Lamborghini Diablo");

       Car lamborghiniGallardo = new Car("Lamborghini Gallardo");
       lamborghini = lamborghiniGallardo;
   }

}
Hier haben wir ein zweites Objekt erstellt und es der Lamborghini-Referenz zugewiesen. Jetzt verweisen zwei Referenzen auf das Lamborghini GallardoObjekt, aber das Lamborghini DiabloObjekt hat keine. Das bedeutet, dass das DiabloObjekt zu Müll wird. Hier kommt der in Java integrierte Garbage Collector (GC) zum Einsatz.
Objektlebenszyklus – 2
Der Garbage Collector ist ein interner Java-Mechanismus, der dafür verantwortlich ist, Speicher freizugeben, also unnötige Objekte aus dem Speicher zu entfernen. Es gibt einen Grund, warum wir uns dafür entschieden haben, dies mit einem Roboterstaubsauger darzustellen. Der Garbage Collector funktioniert ungefähr auf die gleiche Weise: Er „bewegt“ sich im Hintergrund durch Ihr Programm und sammelt Müll. Sie müssen praktisch nicht damit interagieren. Seine Aufgabe besteht darin, Objekte zu löschen, die im Programm nicht mehr verwendet werden. Dadurch wird Speicher für andere Objekte frei. Erinnern Sie sich daran, dass wir zu Beginn der Lektion gesagt haben, dass Sie im wirklichen Leben den Zustand Ihres Computers überwachen und alte Dateien löschen müssen? Wenn es um Java-Objekte geht, übernimmt der Garbage Collector dies für Sie. Der Garbage Collector wird während der Ausführung Ihres Programms viele Male gestartet: Sie müssen ihn nicht explizit aufrufen und ihm Befehle erteilen (obwohl dies technisch möglich ist). Wir werden später mehr über den Garbage Collector sprechen und seine Funktionsweise genauer analysieren. Wenn der Garbage Collector ein Objekt erreicht – kurz bevor es zerstört wird – finalize()wird die spezielle Methode des Objekts aufgerufen. Diese Methode kann aufgerufen werden, um bestimmte zusätzliche vom Objekt verwendete Ressourcen freizugeben. Die finalize()Methode gehört zur Object-Klasse. Mit anderen Worten, es ähnelt equals(), hashCode()und toString()(das Sie bereits kennengelernt haben). Jedes Objekt hat es . Sie unterscheidet sich von anderen Methoden dadurch, dass sie, wie sollen wir das sagen, sehr vorsätzlich ist. Damit meinen wir dasEs wird nicht immer aufgerufen, bevor ein Objekt zerstört wird . Programmieren ist eine sehr präzise Tätigkeit. Der Programmierer weist den Computer an, etwas zu tun, und der Computer führt es aus. Ich gehe davon aus, dass Sie sich an diese Art von Verhalten gewöhnt haben, daher fällt es Ihnen zunächst möglicherweise schwer, die folgende Idee zu akzeptieren: „Bevor ein Objekt zerstört wird, wird die Methode der Object-Klasse aufgerufen. Oder auch nicht. finalize()Wenn wir Glück haben!“ " Dennoch ist dies die Realität. Die Java-Maschine selbst bestimmt von Fall zu Fall, ob finalize() aufgerufen werden soll. Versuchen wir als Experiment, den folgenden Code auszuführen:

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public Cat() {
   }

   public static void main(String[] args) throws Throwable {

       for (int i = 0 ; i < 1000000; i++) {

           Cat cat = new Cat();
           cat = null;// The first object becomes available for garbage collection here
       }
   }

   @Override
   protected void finalize() throws Throwable {
       System.out.println("The Cat is destroyed!");
   }
}
Wir erstellen ein CatObjekt und löschen in der nächsten Zeile die einzige Referenz darauf. Und das machen wir millionenfach. Wir haben die finalize()Methode explizit überschrieben. Jedes Mal, wenn ein CatObjekt zerstört wird, muss es eine Zeichenfolge anzeigen – insgesamt eine Million Mal. Aber nein! Um genau zu sein, wurde es auf meinem Computer nur 37346 Mal ausgeführt ! finalize()Mit anderen Worten: Nur in einem von 27 Fällen entschied sich meine Java-Maschine, die Methode aufzurufen . In den anderen Fällen umfasste die Garbage Collection diesen Aufruf nicht. Versuchen Sie, diesen Code selbst auszuführen. Sie werden höchstwahrscheinlich ein anderes Ergebnis erhalten. Wie Sie sehen, ist es schwer, finalize()einen zuverlässigen Partner zu nennen :) Deshalb hier ein kleiner Tipp für die Zukunft: Verlassen Sie sich nicht auf die finalize()Methode, um kritische Ressourcen freizugeben.Die JVM kann es aufrufen oder auch nicht. Wer weiß? Wenn Ihr Objekt zu Lebzeiten einige leistungskritische Ressourcen enthielt (z. B. eine offene Datenbankverbindung), wäre es besser, eine spezielle Methode zu erstellen und explizit aufzurufen, um diese freizugeben, wenn das Objekt nicht mehr benötigt wird. Auf diese Weise können Sie sicher sein, dass die Leistung Ihres Programms nicht beeinträchtigt wird. Wir begannen damit, dass die Arbeit mit Speicher und Garbage Collection sehr wichtige Themen sind, und das sind sie auch. Ein falscher Umgang mit Ressourcen und ein Missverständnis darüber, wie unnötige Objekte bereinigt werden, können zu einem der unangenehmsten Fehler führen: Speicherlecks . Dies ist einer der bekanntesten Programmierfehler. Es gibt sogar einen eigenen Wikipedia- Artikel. Schlecht geschriebener Code kann dazu führen, dass jedes Mal Speicher für neu erstellte Objekte zugewiesen wird, alte, unnötige Objekte jedoch nicht für die Speicherbereinigung verfügbar sind. Da wir bereits eine Roboter-Staubsauger-Analogie erstellt haben, stellen Sie sich vor, was passieren würde, wenn Sie vor dem Starten des Roboters Socken im ganzen Haus verstreuen, eine Glasvase zerschlagen und überall Legosteine ​​auf dem Boden liegen lassen würden. Natürlich würde der Roboter versuchen, etwas zu tun, aber eines Tages wird er stecken bleiben.
Objektlebenszyklus – 3
Damit der Staubsauger ordnungsgemäß funktioniert, müssen Sie den Boden in gutem Zustand halten und alles aufsaugen, was er nicht verarbeiten kann. Der Garbage Collector folgt dem gleichen Prinzip. Wenn ein Programm viele Objekte enthält, die es nicht bereinigen kann (z. B. eine Socke oder Lego für unseren Roboterstaubsauger), wird uns eines Tages der Speicher ausgehen. Nicht nur Ihr Programm bleibt hängen, sondern auch alle anderen Programme, die gerade auf dem Computer ausgeführt werden. Schließlich wird ihnen auch das Gedächtnis fehlen (um auf unseren Vergleich zurückzukommen: Das zerbrochene Glas auf dem Boden stoppt nicht nur den Staubsauger, sondern auch die Menschen, die im Haus leben). Kurz gesagt, so sehen der Objektlebenszyklus und die Garbage Collection in Java aus. Sie müssen sich das nicht merken: Es reicht aus, einfach zu verstehen, wie es funktioniert. In der nächsten Lektion werden wir Auf diese Prozesse werde ich noch detaillierter zurückkommen. Aber vorerst können Sie wieder CodeGym-Aufgaben lösen :) Viel Glück!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION