Java-Speicherfragen zum 'neuen' Schlüsselwort

8

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!

    
Rohan Agarwal 25.02.2013, 09:08
quelle

3 Antworten

7
  

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.

    
EJP 25.02.2013, 09:14
quelle
2

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.

    
vikingsteve 25.02.2013 09:12
quelle
-1

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

    
Fabien 25.02.2013 09:13
quelle

Tags und Links