Wo muss der Java-und der .NET string-Literale wohnen?
Einer aktuellen Frage zu string-literalen in .NET caught my eye. Ich weiß, dass string-Literale sind interniert so, dass unterschiedliche Saiten mit dem gleichen Wert auf das gleiche Objekt beziehen. Ich weiß auch, dass ein string sein kann, interniert Laufzeit:
string now = DateTime.Now.ToString().Intern();
Offensichtlich ein string, der ein Praktikum in runtime befindet sich auf dem heap, aber ich hatte angenommen, dass ein literal ist, wird in die Programm Daten-segment (und sagte das auch so in meinem Antwort die besagte Frage). Aber ich erinnere mich nicht sehen, dieses überall. Ich nehme an, dies ist der Fall, da es, wie ich es tun würde und die Tatsache, dass die ldstr
IL-Anweisung wird verwendet, um Literale und keine Verrechnung stattzufinden scheint, scheint mich unterstützen.
Zu schneiden eine lange Geschichte kurz, wo string-Literale wohnen? Ist es auf dem heap, das Daten-segment oder einige Ort, den ich noch nicht gedacht?
Edit:, Wenn string-Literale tun befinden sich auf dem heap, Wann werden Sie verteilt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Strings in .NETTO sind Referenz-Typen, so sind Sie immer auf dem heap (auch wenn Sie interniert). Sie können dies überprüfen, mit einem debugger wie WinDbg.
Wenn Sie die Klasse unter
Und rufen Sie
Foo()
auf eine Instanz, die Sie verwenden können, WinDbg, um zu überprüfen heap.Den Verweis werden die meisten wahrscheinlich werden gespeichert in einem register für ein kleines Programm, so dass die einfachste zu finden, ist der Verweis auf die bestimmte Zeichenfolge ist, indem Sie eine
!dso
. Dies gibt uns die Adresse der Zeichenkette in Frage:Nun verwenden
!gcgen
um herauszufinden, welche generation die Instanz, in:Ist es in der generation null - das heißt, es hat einfach zugeordnet werden. Wer verwurzelung es?
ESP ist der stack für unsere
Foo()
Methode, aber beachten Sie, dass wir eineobject[]
als gut. Das ist die interne Tabelle. Lassen Sie uns nehmen einen Blick.Reduzierte ich die Ausgabe etwas, aber Sie bekommen die Idee.
Abschließend: strings auf dem heap - selbst wenn Sie interniert. Die Internierten Tabelle enthält einen Verweis auf die Instanz auf dem heap. I. e. interniert Zeichenfolgen werden nicht gesammelt, während die GC, weil die Internierten Tabelle Wurzeln Sie.
In Java (von der Java-Glossar):
Mich korrigieren, wenn ich falsch bin, aber nicht alle Objekte befinden sich auf dem heap in Java und .NET?
In .Net, string-Literale als "interniert", werden in einer speziellen Datenstruktur genannt, die "interne Tabelle". Dieser ist getrennt vom heap und den stack. Nicht alle strings sind interniert, aber... ich bin mir ziemlich sicher, dass diejenigen, die nicht gespeichert sind, über den Haufen.
Weiß nicht, über Java
Fand ich diese auf der MSDN-Website über die
ldstr
IL instruction:Dies bedeutet, dass die string-Literale sind in der Tat gespeichert, die auf dem heap in .NET (im Gegensatz zu Java als hingewiesen von mmyers).
In Java, Zeichenketten, wie alle Objekte befinden sich in den heap.
Nur lokale primitive Variablen (int, chars und Verweise auf Objekte) befinden sich im stack.
Interniert String ist in java befinden sich in einem separaten Pool " der String-Pool. Dieser pool ist gepflegt, die von der Klasse "String" und befindet sich an der normalen Heap (nicht die Perm-Pools, wie oben erwähnt, verwendet für die Speicherung der Klasse).
Wie ich es verstehe, sind nicht alle Strings interniert, aber anrufen myString.intern() gibt einen String zurück, der garantiert, dass aus dem String-Pool.
Siehe auch:
http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html
und die javadoc -
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#intern()