Was passiert, wenn Sie den folgenden Code ausführen ..
%Vor%in Bezug auf Speicher?
Ist String x auf dem Stapel oder auf dem Heap zugeordnet? Wird das Programm eventuell aufgrund eines Speicherüberlaufs abstürzen, oder verhindert die Speicherbereinigung das? Erstellt das neue Schlüsselwort immer das Objekt auf dem Heap? Wann wird ein Objekt auf dem Stapel erstellt?
Danke!
Ist String x auf dem Stapel oder auf dem Heap zugeordnet?
x
ist kein String
. Es ist ein Verweis auf ein String
. Die Referenz ist eine lokale Variable und geht so auf den Stapel. Das String
ist ein Objekt und geht damit auf den Haufen.
Scheitert das Programm eventuell aufgrund eines Speicherüberlaufs
Wahrscheinlich nicht.
oder verhindert die Garbage Collection das?
Es sollte.
Erstellt das neue Schlüsselwort immer das Objekt auf dem Heap?
Ja.
Wann wird ein Objekt auf dem Stapel erstellt?
Niemals ... es sei denn, die JVM entscheidet, dass sie dem aktuellen Geltungsbereich nicht entgehen kann und beschließt dies zu tun.
Mit new, yes, werden Objekte auf den Heap gestellt. Objekte, auf die kein Thread mehr zugreifen kann, können Garbage Collections sein. Ob Sie nicht genügend Arbeitsspeicher haben oder nicht, hängt von der Größe der Daten ab, die Ihr Programm verwendet, und wenn Sie Objekte "freigeben" können, brauchen Sie nicht mehr (denken Sie daran: Speicherlecks sind schlecht).
In Ihrem Beispiel werden Sie den Müllsammler wie verrückt laufen lassen, was ich denke, was Sie vorhaben zu demonstrieren.
Lokale Variablen gehen auf den Stapel.
Theoretisch erstellt new
auf dem Heap, und Nicht-Objekte (d. h. int
s, char
s usw.) werden auf dem Stapel erstellt. Die einzige Ausnahme, afaik, sind Strings, die ebenfalls auf dem Stack erstellt werden. In der Praxis sieht der JIT-Compiler vieler moderner JVMs, dass in einigen Fällen Objekte, die mit new
erstellt wurden, auf dem Stapel erstellt werden können (z. B. lokale Objekte, auf die nicht außerhalb der aktuellen Funktion verwiesen wird).
Der Garbage Collector kümmert sich um die Deallokation für Sie, das ist sein Zweck, aber natürlich können Sie nicht genügend Speicher haben, wenn Sie Referenzen auf zu viele Objekte gleichzeitig erstellen und behalten (versuchen Sie eine Liste mit einer Milliarde zu erstellen) Zeichenketten zum Beispiel).