Ich habe eine Array-Deklaration wie folgt:
int a[];
Hier a
ist ein Array vom primitiven int
Typ. Wo ist dieses Array gespeichert? Wird es auf einem Haufen oder Stapel gespeichert? Dies ist ein primitiver Typ int
. Alle primitiven Typen werden nicht auf dem Heap gespeichert.
Antworten:
Wie Gurukulki sagte, ist es auf dem Haufen gespeichert. Ihr Beitrag deutete jedoch auf ein Missverständnis hin, wahrscheinlich aufgrund einer gut gemeinten Person, die den Mythos verbreitet, dass "Primitive immer auf dem Stapel leben". Das ist falsch. Lokale Variablen haben ihre Werte auf dem Stapel, aber nicht alle primitiven Variablen sind lokal ...
Betrachten Sie zum Beispiel Folgendes:
Nun, wo tut
f.value
wohnt nun? Der Mythos würde vorschlagen, dass es auf dem Stapel liegt - aber tatsächlich ist es Teil des neuenFoo
Objekts und lebt auf dem Haufen 1 . (Beachten Sie, dass der Wert von sichf
selbst eine Referenz ist und auf dem Stapel lebt.)Von dort ist es ein einfacher Schritt zu Arrays. Sie können sich ein Array nur als eine Menge Variablen vorstellen - also
new int[3]
ein bisschen wie eine Klasse dieser Form:1 Tatsächlich ist es komplizierter. Die Unterscheidung zwischen Stapel und Heap ist meistens ein Implementierungsdetail. Ich glaube, einige JVMs, möglicherweise experimentelle, können erkennen, wann ein Objekt niemals einer Methode "entkommt", und können das gesamte Objekt auf dem Stapel zuordnen. Es ist jedoch konzeptionell auf dem Haufen, wenn Sie sich dafür interessieren.
quelle
String
von a unterstütztchar[]
. Ich glaube, dass wörtliche Zeichenfolgen im öffentlichen konstanten Pool gespeichert sind. Für die GC-Optimierung würde dies bedeuten, dass die Backing-Arrays ebenfalls gespeichert werden sollten (andernfalls müsste der konstante Pool während eines GC-Zyklus gescannt werden, in dem das Backing-Array ansonsten zur Sammlung berechtigt wäre).Es wird auf dem Haufen gespeichert
weil Array ein Objekt in Java ist.
EDIT : wenn du hast
Stellen Sie sich diesen Code so vor, als würde er dem Compiler sagen: "Erstellen Sie ein Array-Objekt, das vier Ints enthält, und weisen Sie es der Referenzvariablen mit dem Namen zu
testScores
. Setzen Sie außerdem jedesint
Element auf Null. Danke."quelle
-g
dem Compiler die Option zur Verfügung stellen. Andernfalls wird es weg optimiert.Es ist eine Reihe von primitiven Typen, die an sich nicht primitiv sind. Eine gute Faustregel lautet: Wenn das neue Schlüsselwort betroffen ist, befindet sich das Ergebnis auf dem Heap.
quelle
Ich wollte nur ein paar Tests teilen, die ich zu diesem Thema durchgeführt habe.
Array mit einer Größe von 10 Millionen
Ausgabe:
Wie Sie sehen, wird die Größe des verwendeten Heapspeichers um ~ 80 MB erhöht, was einer Größe von 10 m * (doppelt) entspricht.
Aber wenn wir Double anstelle von Double verwendet haben
Die Ausgabe zeigt 40 MB. Wir haben nur Doppelreferenzen, sie werden nicht initialisiert.
Füllen Sie es mit Double
Immer noch 40 MB. Weil sie alle auf dasselbe Double-Objekt zeigen.
Initialisierung stattdessen mit double
Linie
ist äquivalent zu
das ist äquivalent zu
Da wir jedes Mal neue Double-Objekte erstellen, blasen wir den Heap aus. Dies zeigt, dass Werte innerhalb der Double-Klasse im Heap gespeichert sind.
quelle
In der Java-Programmiersprache sind Arrays Objekte, werden dynamisch erstellt und können Variablen vom Typ Object zugewiesen werden.
http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html
quelle