Wo ist die zugewiesene variable-Referenz im stack oder im heap?
Ich habe eine Frage
Was passiert, wenn ich eine variable deklarieren, die innerhalb einer Methode, zum Beispiel.
void myMethod() { Schiff myShip = new Schiff(); }
Wo ist zugeteilt myShip-Referenz im stack oder im heap ?
Denke ich in der stack-aber ich bin verwirrt, weil ich gelesen hatte, in J2ME Game Programming Buch
"Java-Klassen werden instanziiert, auf dem Java-heap"
Alle java-Klassen ?
Vielen Dank im Voraus
Diese Frage ist ein wenig unklar, wie Sie ist. Es könnte entweder sein: "Wo ist der Verweis auf myShip im Speicher abgelegt?" oder "Wo ist das Objekt verweist myShip im Speicher abgelegt?" Die konzeptionelle Antwort auf die erste ist der Stapel, und die konzeptionelle Antwort auf die letztere ist der heap, abgesehen von Optimierungen und verrückt-Implementierungen, und gibt es Antworten zu beantworten, in beide Richtungen.
InformationsquelleAutor iberck | 2009-05-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
myShip
ist ein Verweis auf eineShip
ObjektmyShip
ist auf die Methodenaufruf-stack, der bezeichnet wird als "stack". Wenn eine Methode aufgerufen wird, ein Speicherblock, der geschoben wird, auf die Spitze des Stacks, das Speicher-block hat Platz für alle primitive (int, float, boolean etc.) und Objekt-Referenzen von der Methode, die beinhaltet der Parameter der Methode. Der Haufen ist, wo der Speicher für die eigentlichen Objekte zugeordnet ist.So
myShip
auf dem Stapel und dieShip
- Objekt auf dem heap.Hinweis: jeder thread hat seinen eigenen stack, sondern teilen sich den heap.
InformationsquelleAutor nash
Java wirklich Dinge ein wenig anders. Die Referenz ist grundsätzlich auf dem stack. Der Speicher für das Objekt reserviert ist, was geht für den heap. Allerdings ist die Umsetzung davon-Speicher ist nicht ganz die Art, wie die heap-Implementierung in C/C++ - Modell.
Wenn Sie ein neues Objekt erstellen, ist es effektiv bringt den Namen in der Tabelle von Referenzen für diesen Bereich. Das ist ähnlich wie ein Zeiger auf ein Objekt in C++. Wenn es geht, out of scope, dass die Referenz verloren; die zugewiesenen Speicher nicht mehr referenziert wird, und Sie können garbage-collected.
Ship ship;
Dies bedeutet, dass das Schiff Referenz auf den stack, aber kein Objekt erstellt wird. Heißt das aber, dass dieShip
Klasse geladen wird, an dieser Stelle?Wirklich? Ich dachte, dass zu tun, schafft ein Schiff Referenz initialisiert mit null. Gibt es einen Unterschied?
Sie sind falsch, <code> Schiff Schiff;</code> kein Schiff bauen! Die variable mit null initialisiert.
Wenn es eine lokale variable (d.h. eine variable in einer Methode), es ist nicht initialisiert
null
es sei denn man explizit einstellen, dass esnull
!Ich habe testen Sie den code: <code>Schiff Schiff; System.aus.println(""+Schiff)"</code> und es Falle nicht kompilieren mit javac 1.8.0_31 es sagt mir, "Schiff might not have been initialized" also ich denke, @Bombe ist Recht
InformationsquelleAutor Charlie Martin
Derzeit werden alle Java-Objekte zugeordnet, die auf dem heap. Es ist im Gespräch, dass Java 7 machen könnte, escape-Analyse und in der Lage sein zu reservieren auf dem stack, aber ich weiß nicht, ob der Vorschlag Finalisiert ist noch. Hier der RFE.
Edit: Anscheinend ist schon in frühen builds von JDK 7. (Der Artikel sagt, es wird auch in der JDK-6u14, aber ich kann nicht finden, eine Bestätigung.)
Richtig, aber escape-Analyse (implementiert seit Java SE 6u23, btw) trägt dazu bei, heute ist Java nicht die lahme Ente, es war vor 15 Jahren.
InformationsquelleAutor Michael Myers
Notionally, das Objekt geht auf den "heap". Dann, weil es ein Verfahren-lokale Referenz, die tatsächliche Referenz wird auf den stack. Von "der" stack -, meinen wir, dass die native thread-stack (d.h. den gleichen Stapel, dass eine lokale variable in C zugeordnet werden würde) im Fall von Sun ' s VM zumindest, aber ich glaube nicht, dass das tatsächlich eine Anforderung (die JVM muss nur etwas abstrakten Begriff der "stack frames" , weist er auf jede Methode aufrufen, werden Sie aus dem native stack oder nicht).
Aber... auf modernen VMs (mit zugegebenermaßen der möglichen Ausnahme von einfacher embedded/mpbile VMs), gibt es wirklich keine solche Sache wie "die" heap. In der Praxis gibt es verschiedenen heap-Bereichen.
Die einfachste von diesen ist in der Regel fast wie ein "mini-stack", entworfen, um schnell zu reservieren für Objekte, die nicht herumhängen für lange und wahrscheinlich de-allokiert fast auf einmal.
Wie bereits von einem anderen poster, eine hoch optimierte JVM könnte im Prinzip allocate-Objekt-Daten auf dem Stapel und es sind konkrete Vorschläge für diese. Obwohl, wie auch schon in einem der Verweise, eine Kritik an dieser ist, dass die schnelle "eden" heap ist fast wie ein stack sowieso (eben nicht "die" - Stapel).
InformationsquelleAutor Neil Coffey