Dies ist nur eine einfache theoretische Frage aus Neugier. Ich war immer wie ein Java-Fan-Junge. Aber eine Sache lässt mich wundern, warum Java keinen Mechanismus zum Erstellen von Objekten auf dem Stapel bereitstellt? Wäre es nicht effizienter, wenn ich nur ein kleines Point (int x, int y) -Objekt auf dem Stapel anstelle des Heaps erstellen könnte, als würde ich eine Struktur auf C# erstellen. Gibt es einen besonderen Sicherheitsgrund hinter dieser Einschränkung in Java? :)Erstellen von Objekten im Stapelspeicher in Java?
Antwort
Die Strategie hier ist, dass, anstatt diese Entscheidung in die Sprache zu leasen, lässt Java die JVM/Hotspot/JIT/Laufzeit entscheiden, wo und wie es Speicher reservieren will.
Es wird geforscht, "Escape-Analyse" zu verwenden, um herauszufinden, welche Objekte nicht wirklich auf den Heap gehen und sie stattdessen stapeln müssen. Ich bin mir nicht sicher, ob dies bereits zu einer Mainstream-JVM geworden ist. Aber wenn es das tut, wird es von der Laufzeit (Sache -XX: etwas) gesteuert, nicht vom Entwickler.
Der Vorteil davon ist, dass auch alter Code von diesen zukünftigen Erweiterungen profitieren kann, ohne selbst aktualisiert zu werden.
Wenn Sie dies manuell verwalten möchten (aber der Compiler überprüft, ob es "sicher" bleibt), werfen Sie einen Blick auf Rust.
http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html aktiviert in 6u23 und später – jtahlborn
@jtlborn: +1. Ich denke, die aktuelle Menge an Optimierungen geht jedoch nicht so weit, dass tatsächlich Objekte auf dem Stapel zugewiesen werden. Aus den Versionshinweisen klingt es nach Beseitigung von Sperren und redundanten Kopien vorhandener Objekte. – Thilo
+1 aus dem Link jtahlborn gepostet: "Es ersetzt nicht eine Heap-Zuweisung mit einer Stapelzuweisung für nicht-globale Entweichen von Objekten." Das bedeutet, dass * ArgEscape * und * NoEscape * auf dem Stack zugewiesen werden. Aber dann wieder wird es nicht explizit erwähnt ... – alfasin
Ein häufiges Problem wäre die Initialisierung eines globalen Verweises mit einem Objekt, das auf dem Stapel erstellt wurde. Wenn die Methode, mit der das Objekt erstellt wurde, beendet wird, worauf verweisen Sie?
Das genannte Objekt wird auf dem Stack in Java erstellt, es wird nur hinter Ihrem Rücken mit dem escape analysis durchgeführt, der dafür sorgt, dass das obige Szenario nicht auftritt.
Dies wird vorläufig auf Java kommen werden, gibt es keine wirkliche ETA für diesen Satz so könnte man es nur 10. von Java kommen hoffen
Der Vorschlag Werttypen genannt wird, und Sie können es in the mailing list of Project Valhalla folgen.
Ich weiß nicht, ob es irgendwelche früheren Gründe gab, warum es nicht in der Sprache war, vielleicht wurde es ursprünglich als unnötig angesehen oder es gab einfach keine Zeit, dies zu implementieren.
In Ordnung! Java wird "versuchsweise" C# einholen? "Sometime" (tm) – csauve
@skiwi Können Sie bitte kurz erklären, welche Wertetypen sind? –
- 1. Erstellen von Objekten in Java Frage
- 2. Erstellen von Java-Objekten mit JQuery
- 3. Löschen von Objekten in Java
- 4. Verwenden von Paketnamen zum Erstellen von Objekten in Java
- 5. Erstellen Array von Objekten zur Laufzeit mit Klassennamen in Java
- 6. So erstellen Sie ein Array von Objekten in Java
- 7. Deserialisieren von Objekten in Java
- 8. Python, Erstellen von Objekten
- 9. Probleme beim Verschieben von Objekten in Java
- 10. Erstellen von unveränderlichen Objekten von Javabean
- 11. Objekt eine Klasse von Objekten in Java
- 12. Java Reflexion in zwei Ebenen von Objekten
- 13. Intercept-Feldzugriff von Java-Objekten in Rhino
- 14. Zuweisen und Zurückgeben von Objekten in Java
- 15. Verwenden von Operatoren mit Objekten in Java
- 16. Installieren oder Erstellen von Objekten
- 17. Verschieben von Objekten im Massenansichtsfenster
- 18. Generisch erstellen von Objekten in C#
- 19. Erstellen von Objekten in Loop C#
- 20. Erstellen einer Liste von Objekten in Python
- 21. Java - Kopieren von Arraylist-Objekten
- 22. Vergleichen von XML-Objekten java
- 23. Mehrere Arten von Objekten in Java-Containern
- 24. Gemeinsame Nutzung von Objekten in Java-Prozessen
- 25. Erstellen von neuen Objekten aus eingefrorenen übergeordneten Objekten
- 26. Lucene Indizierung von Objekten im Speicher
- 27. Erstellen von Threads in Java zum Ausführen im Hintergrund
- 28. C++ Template-Methode zum Erstellen von Objekten
- 29. Zuordnung von Java-Objekten zu Prolog-Darstellung
- 30. Erstellen von Javascript-Objekten aus einer Vorlage
Was passiert, wenn Sie es in einen Container legen, der nicht auf dem Stapel liegt? Wenn Sie zurückkehren, hat der Container jetzt einen Verweis auf freigegebenen Speicher. – Max
@Max: Vermutlich müsste die Sprache auch Konstrukte enthalten, die es dem Compiler ermöglichen, dies zu überprüfen. – Thilo
@Max: Der Container hat keinen Verweis auf das Original, es hat entweder eine Kopie oder eine Kopie davon. .NET/C# hat dies seit 15 Jahren. https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx – csauve