2014-09-18 9 views
12

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?

+1

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

+1

@Max: Vermutlich müsste die Sprache auch Konstrukte enthalten, die es dem Compiler ermöglichen, dies zu überprüfen. – Thilo

+0

@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

Antwort

15

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.

+4

http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html aktiviert in 6u23 und später – jtahlborn

+1

@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

+0

+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

2

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.

4

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.

+0

In Ordnung! Java wird "versuchsweise" C# einholen? "Sometime" (tm) – csauve

+0

@skiwi Können Sie bitte kurz erklären, welche Wertetypen sind? –

Verwandte Themen