Nein, das garantiert dies nicht. Es ist durchaus möglich, dass ein Programmierer Objekte fälschlicherweise erstellt, die niemals außerhalb des Gültigkeitsbereichs liegen und mehr und mehr Speicher verbrauchen, bis der gesamte Heap erschöpft ist.
Es liegt in der Verantwortung des Programmierers sicherzustellen, dass nicht mehr verwendete Objekte von der Anwendung nicht mehr referenziert werden . Auf diese Weise kann der Garbage Collector seine Arbeit erledigen und den von diesen Objekten belegten Speicher zurückfordern.
Beispiel
%Vor%Nein, es ist immer möglich, dass Sie versuchen, mehr Speicher zuzuweisen, als verfügbar ist.
Automatische Speicherbereinigung bedeutet nur, dass Speicher (d. h. nicht referenzierter Speicher) automatisch gesammelt wird (d. h. für die weitere Verwendung zurückgewonnen wird). Wenn Sie Verweise darauf halten, ist es kein Müll und nicht gesammelt.
Nein, es gibt noch viele Möglichkeiten, den Speicher zu leeren. Der Garbage Collector kann nur Speicher für Objekte freigeben, die nicht mehr referenziert werden - es liegt an Ihnen, sicherzustellen, dass Sie nicht auf Objekte verweisen, die Sie nicht benötigen, oder Soft References für Objekte zu verwenden, die Sie haben möchten, aber don Verschwinde nicht, wenn die Erinnerung knapp wird.
Um Ihre Frage zu beantworten, NO
. Garbage Collection garantiert nicht, dass ein Programm nicht über genügend Arbeitsspeicher verfügt.
Nicht referenzierte Objekte werden automatisch vom Garbage Collector gesammelt. In Java werden die meisten Verweise auf Objekte automatisch freigegeben, sobald Sie die Methode verlassen haben.
Objekte haben einen Verweis auf andere Objekte, die wiederum auf andere Objekte verweisen, die einen vollständigen Objektgraphen erzeugen. So, wie ein solches Objekt von mehr als einem Objekt referenziert werden kann.
OutOfMemoryError
Beispiel mit Garbage Collection bei der Arbeit
%Vor%.
Beispiel mit Speicherleck bei der Arbeit
%Vor%Nein. Wenn Sie viele Objekte (Millionen) konstruieren und einen Verweis auf sie behalten, damit sie nicht außerhalb des Gültigkeitsbereichs liegen (z. B. durch Hinzufügen zu einer ArrayList), könnte der adressierbare Speicher knapp werden.
Absolut nicht. Sogar in einer Müll-gesammelten Sprache wie Java können Sie leicht Referenzen verlieren, was bedeutet, dass Objekte niemals Müll gesammelt bekommen.
Selbst dann können Sie einfach zu viele Objekte instanziieren (und auf diese verweisen), damit das System sie verarbeiten kann.
Wie kann irgendetwas sicherstellen, dass einem Programm nicht zu wenig Speicherplatz zur Verfügung steht, ohne dass ein Element aus dem Speicher gelöscht werden muss, um Platz für neue Zuweisungen zu schaffen?
Nun, was ist, wenn Sie tatsächlich einen Verweis auf das Objekt halten, das nach dem Zufallsprinzip ausgewählt wurde, um es zu räumen? Sie werden bald falsches Verhalten haben.
Nein. Garbage Collection schützt nur vor einer Art von Speicherleck. Dies ist insbesondere dann der Fall, wenn Sie Speicher nicht explizit freigeben, wenn er von Ihrer Anwendung nicht mehr benötigt wird. Wenn Ihre Anwendung Verweise auf nicht benötigte Objekte (z. B. ständig wachsende Listen) enthält, kann der Garbage Collector sie nicht bereinigen, und Ihrer Anwendung kann immer noch nicht genügend Arbeitsspeicher zur Verfügung stehen.
Nein, überhaupt nicht.
In Sprachen ohne Speicherbereinigung ist der Programmierer (oder eine Bibliothek, die er verwendet) dafür verantwortlich, Speicheranforderungen zu stellen und den zugewiesenen Speicher für "Recycling" zurückzugeben. Es gibt keine Garantien, dass der Speicher verfügbar wäre, wenn er angefordert wird. Wenn Sie jedoch nie explizit "recyceln", kann eine Situation vorliegen, in der eine Anforderung abgelehnt wird, weil kein Speicher verfügbar ist. Wenn der Speicher jedoch wiederverwendet wurde, könnte dieser Block für diese Anforderung zurückgegeben worden sein.
Eine automatische Speicherbereinigung bedeutet, dass das System für Sie recyceln kann. Als Ergebnis wurden bestimmte Anfragen mit "recyceltem" Speicher gefüllt. Wie bei Nicht-GC-Sprachen können jedoch einige Anforderungen nicht ausgefüllt werden.
Wenn Ihr System zum Beispiel 1000 Blöcke zur Verfügung hat und Sie 1500 zur gleichen Zeit benötigen, wird kein GC auf der Welt Ihnen helfen, da wirklich nichts für das Recycling verfügbar ist.
Nein, die Garbage Collection kann nicht garantieren, dass nicht genügend Speicherplatz in Ihrer Anwendung verfügbar ist. Es wird nicht einmal garantieren, dass Ihre Anwendung nicht über genügend Arbeitsspeicher verfügt, wenn Speicher verfügbar ist. Wenn Sie kurz davor sind, nicht mehr genügend Arbeitsspeicher zu haben oder viele Objekte zuweisen, kann dies dazu führen, dass GC einen Thrash ausführt und eine Ausnahme wegen zu wenig Speicher auslöst. Das Programm kann auch nicht mehr genügend Arbeitsspeicher haben, wenn es den gesamten physischen Speicher (aktuell und virtuell) verwendet hat oder das Programm den von der JVM zugelassenen maximalen Arbeitsspeicher überschreitet (siehe -Xmx).
Nein. Der Garbage Collector hilft Ihnen, ungenutzten Speicher automatisch freizugeben.
Wenn ein Objektreferenz nicht erreicht werden kann, ist der Speicher für dieses Objekt möglicherweise Garbage Collection.
Zum Beispiel:
%Vor%Aber wenn Sie niemals Objektverweise freigeben, sammelt der Garbage Collector nie etwas und ein OutOfMemoryError wird ausgelöst.
%Vor%Wenn Sie dies mehrmals verwenden:
%Vor%Die Liste wird unbegrenzt wachsen, bis Sie keinen Speicher mehr haben
Tags und Links java