JavaRush /Java-Blog /Random-DE /Objektlebenszyklus

Objektlebenszyklus

Veröffentlicht in der Gruppe Random-DE
Hallo! Ich denke, Sie werden nicht allzu überrascht sein, wenn wir Ihnen sagen, dass die Speichergröße Ihres Computers begrenzt ist :) Selbst eine Festplatte, die um ein Vielfaches größer ist als der Arbeitsspeicher, kann mit Ihren Lieblingsspielen, Fernsehserien usw. vollgestopft werden. und so weiter. Um dies zu verhindern, müssen Sie den aktuellen Speicherstatus überwachen und unnötige Dateien von Ihrem Computer löschen. Was hat die Java-Programmierung damit zu tun? Direkte! Denn wenn ein Objekt von der Java-Maschine erstellt wird, wird ihm Speicher zugewiesen. In einem wirklich großen Programm werden Zehntausende und Hunderttausende Objekte erstellt, denen jeweils ein eigener Speicher zugewiesen ist. Objektlebenszyklus - 1Aber wie lange existieren Ihrer Meinung nach all diese Objekte? „Leben“ sie die ganze Zeit, in der unser Programm läuft? Natürlich nicht. Trotz aller Vorteile von Java-Objekten sind sie nicht unsterblich :) Objekte haben ihren eigenen Lebenszyklus. Heute machen wir eine kleine Pause beim Schreiben von Code und schauen uns diesen Prozess an :) Darüber hinaus ist es sehr wichtig, um die Funktionsweise des Programms zu verstehen und Ressourcen zu verwalten. Wo beginnt also das Leben eines Objekts? Wie ein Mensch – von seiner Geburt, also der Schöpfung an.
Cat cat = new Cat();//вот сейчас и начался lebenswichtig цикл нашего ein Objektа Cat!
Zunächst weist die Java Virtual Machine die erforderliche Speichermenge zu, um das Objekt zu erstellen. Dann erstellt sie in unserem Fall einen Link dazu – catum es verfolgen zu können. Danach werden alle Variablen initialisiert, der Konstruktor aufgerufen und siehe da, unser frisches Objekt lebt bereits sein eigenes Leben :) Die Lebensdauer von Objekten ist unterschiedlich, genaue Zahlen gibt es hier nicht. Auf jeden Fall lebt es einige Zeit im Programm und führt seine Funktionen aus. Genauer gesagt ist ein Objekt „lebendig“, solange es Hinweise darauf gibt. Sobald keine Links mehr 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 Methode main()erlischt das Autoobjekt Lamborghini Diablo bereits in der zweiten Zeile. Es gab nur einen Link dazu, und jetzt wurde dieser Link zugewiesen null. Da es keine Hinweise mehr auf den Lamborghini Diablo gibt, wird er zum „Schrott“. Es ist nicht erforderlich, den Link zurückzusetzen:
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, anschließend die Referenz genommen lamborghiniund sie diesem neuen Objekt zugewiesen. Es gibt jetzt Lamborghini Gallardozwei Referenzen auf das Objekt, aber Lamborghini Diablokeine auf das Objekt. Daher wird das Objekt Diablozu Müll. Und in diesem Moment kommt der integrierte Java-Mechanismus namens Garbage Collector, oder mit anderen Worten 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 daraus zu entfernen. Nicht umsonst haben wir uns zur Darstellung für ein Bild mit einem Staubsaugerroboter entschieden. Schließlich funktioniert der Garbage Collector ganz ähnlich: Im Hintergrund „reist“ er durch Ihr Programm, sammelt Müll ein, und gleichzeitig interagieren Sie praktisch nicht mit ihm. Seine Aufgabe besteht darin, Objekte zu entfernen, die nicht mehr im Programm verwendet werden. Dadurch wird Speicherplatz im Computer für andere Objekte frei. Erinnern Sie sich, dass wir zu Beginn der Vorlesung gesagt haben, dass man im normalen Leben den Zustand seines Computers überwachen und alte Dateien löschen muss? Im Fall von Java-Objekten erledigt dies der Garbage Collector für Sie. Garbage Collector wird während der Ausführung Ihres Programms viele Male gestartet: Es ist nicht erforderlich, ihn gezielt aufzurufen und ihm Befehle zu erteilen, obwohl dies technisch möglich ist. Später werden wir mehr darüber sprechen und den Prozess seiner Arbeit genauer analysieren. In dem Moment, in dem der Garbage Collector das Objekt erreicht, kurz vor seiner Zerstörung, wird eine spezielle Methode für das Objekt aufgerufen – finalize(). Es kann verwendet werden, um einige zusätzliche Ressourcen freizugeben, die das Objekt verwendet hat. Die Methode finalize()gehört zur Klasse Object. Das heißt, zusammen mit equals(), hashCode()und toString(), die Sie bereits kennengelernt haben, hat jedes Objekt es. Der Unterschied zu anderen Methoden besteht darin, dass sie... wie man es ausdrückt... sehr kapriziös ist. Es wird nämlich nicht immer vor der Zerstörung eines Objekts aufgerufen. Programmieren ist eine präzise Sache. Der Programmierer weist den Computer an, etwas zu tun, und der Computer führt es aus. Sie sind wahrscheinlich bereits an dieses Verhalten gewöhnt und es fällt Ihnen möglicherweise zunächst schwer, die Idee zu akzeptieren: „Bevor Objekte zerstört werden, wird die finalize()Klassenmethode aufgerufen Object. Oder es heißt nicht. Wenn wir Glück haben!“ Dies ist jedoch wahr. finalize()Ob die Methode im Einzelfall aufgerufen wird oder nicht, bestimmt die Java-Maschine selbst . Versuchen wir zum Beispiel, den folgenden Code versuchshalber 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;//вот здесь первый ein Objekt становится доступен сборщику мусора
       }
   }

   @Override
   protected void finalize() throws Throwable {
       System.out.println("Объект Cat уничтожен!");
   }
}
Wir erstellen ein Objekt Catund setzen in der nächsten Codezeile den einzigen Verweis darauf zurück. Und so – eine Million Mal. Wir haben die Methode explizit überschrieben finalize()und sie sollte den String jedes Mal eine Million Mal auf der Konsole ausgeben, bevor das Objekt zerstört wird Cat. Aber nein! Um genau zu sein, lief es auf meinem Computer nur 37.346 Mal! Das heißt, nur in einem von 27 Fällen entschied sich die von mir installierte Java-Maschine, eine Methode aufzurufen finalize()– in anderen Fällen wurde die Speicherbereinigung ohne diesen Aufruf durchgeführt. Versuchen Sie, diesen Code selbst auszuführen: Das Ergebnis wird höchstwahrscheinlich anders ausfallen. Wie Sie sehen, finalize()kann man es kaum als zuverlässigen Partner bezeichnen :) Daher ein kleiner Rat für die Zukunft: Sie sollten sich nicht auf die Methode verlassen, finalize()wenn es darum geht, wichtige Ressourcen freizugeben. Vielleicht ruft die JVM es auf, vielleicht auch nicht. Wer weiß? Wenn Ihr Objekt während seiner Lebensdauer einige Ressourcen belegt, die für die Leistung äußerst wichtig sind, beispielsweise eine offene Verbindung zur Datenbank aufrechterhält, ist es besser, eine spezielle Methode in Ihrer Klasse zu erstellen, um diese freizugeben und sie explizit aufzurufen, wenn das Objekt vorhanden ist nicht mehr gebraucht. So können Sie sicher sein, dass die Leistung Ihres Programms nicht beeinträchtigt wird. Ganz am Anfang haben wir gesagt, dass Speicherverwaltung und Müllbeseitigung sehr wichtig sind, und das stimmt. Unsachgemäßer Umgang mit Ressourcen und mangelndes Verständnis für den Prozess der Zusammenstellung unnötiger Objekte können zu Speicherverlusten führen. Dies ist einer der bekanntesten Programmierfehler. Falsch geschriebener Code durch den Programmierer kann dazu führen, dass jedes Mal neuer Speicher für neu erstellte Objekte zugewiesen wird, während alte, unnötige Objekte nicht für die Entfernung durch den Garbage Collector verfügbar sind. Da wir einen Vergleich mit einem Roboterstaubsauger gezogen haben, stellen Sie sich vor, was passieren würde, wenn Sie vor dem Starten des Roboters Socken im Haus verstreuen, eine Glasvase zerbrechen und ein zerlegtes Lego-Set auf dem Boden liegen lassen würden. Der Roboter wird natürlich versuchen, etwas zu tun, aber irgendwann bleibt er stecken.
Objektlebenszyklus - 3
Damit es richtig funktioniert, müssen Sie den Boden in gutem Zustand halten und alles entfernen, was der Staubsauger nicht bewältigen kann. Der Garbage Collector funktioniert nach dem gleichen Prinzip. Wenn im Programm noch viele Objekte vorhanden sind, die es nicht einsammeln kann (z. B. eine Socke oder Legosteine ​​für einen Staubsaugerroboter), ist irgendwann der Speicher erschöpft. Und nicht nur das von Ihnen geschriebene Programm friert ein, sondern auch alle anderen Programme, die in diesem Moment auf dem Computer ausgeführt werden. Auch für sie wird es nicht genügend Speicher geben. So sehen der Objektlebenszyklus und der Garbage Collector in Java aus. Das müssen Sie sich nicht merken: Verstehen Sie einfach das Funktionsprinzip. In der nächsten Vorlesung werden wir detaillierter auf diese Prozesse eingehen, aber jetzt können Sie sich wieder der Lösung von JavaRush-Problemen widmen :) Viel Glück!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION