Garantiert Garbage Collection, dass einem Programm nicht genügend Arbeitsspeicher zur Verfügung steht?

8

Ich hörte am meisten elegante Eigenschaft von Java ist Garbage Collection Ich will wissen, garantiert es, dass ein Programm nicht über genügend Arbeitsspeicher verfügt?

    
giri 19.01.2010, 22:00
quelle

12 Antworten

11

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%     
Adamski 19.01.2010, 22:02
quelle
22

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.

    
Ken 19.01.2010 22:02
quelle
4

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.

    
Alex Vigdor 19.01.2010 22:02
quelle
3

Um Ihre Frage zu beantworten, NO . Garbage Collection garantiert nicht, dass ein Programm nicht über genügend Arbeitsspeicher verfügt.

  • Betrachte das Objekt, das du nicht möchtest benutzen Sie mehr sind wie Müll.
  • Verweise auf diese Objekte werden als ob du diesen Müll in deinem hast Haus.
  • Müllsammlung ist wie deine Müllwagen der Stadt, der sammelt Müll.
  • Wenn Sie diese nicht freigeben Referenzen, es ist wie nicht zu nehmen Müll raus und bald wird dein Haus mit Müll überfüllt sein Müllwagen Jungs werden nicht rausnehmen Müll von deinem Haus.

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.

  • Wenn das Objekt keine Referenzen hat, es ist geeignet für Müll Sammlung.
  • Objekte werden auf Heap zugeordnet.
  • Müllsammler läuft von Zeit zu Zeit, um nicht referenzierte Objekte zu löschen von Haufen.
  • Wenn Sie weitere Objekte anlegen haufen, ohne dich loszulassen eventuell erhalten OutOfMemoryError

Beispiel mit Garbage Collection bei der Arbeit

%Vor%

.

Beispiel mit Speicherleck bei der Arbeit

%Vor%     
Gladwin B 19.01.2010 22:43
quelle
2

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.

    
Mark Byers 19.01.2010 22:02
quelle
1

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.

    
Jason Nichols 19.01.2010 22:03
quelle
1

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.

    
Vinko Vrsalovic 19.01.2010 22:04
quelle
0

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.

    
Asaph 19.01.2010 22:07
quelle
0

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.

    
Uri 19.01.2010 22:12
quelle
0

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).

    
Michael Krauklis 19.01.2010 22:13
quelle
0

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

    
OscarRyz 19.01.2010 22:22
quelle
0

Es ist jedoch garantiert, dass vor dem Auslösen der OutofMemoryException durch die JVM alle gesammelten Referenzen gesammelt werden und der jetzt freie Speicher verwendet wird.

    
sibidiba 20.01.2010 00:16
quelle

Tags und Links