いるJava。純文字列リテラルに居住?
-
21-08-2019 - |
質問
最近の ご質問が文字列リテラル ます。純っっ!!知っている文字列リテラルは 房 異なる文字列と同じ値をご参照が同じオブジェクトです。いることも分かっていることで、この文字列で味でのランタイム:
string now = DateTime.Now.ToString().Intern();
ある文字列房での実行時の氏名、住所、電話番号等のヒントがあったかを想定してリテラルでのプログラムのデータセグメントといっ 答え と言ったい。しかし記憶してないことです。っているものと推察されるのかどうか、その ldstr
IL指示を取得するために使用されるリテラルな配分のう場のように戻った。
長い話を短い文字列リテラルに居住?では、ヒープのデータセグメントまたは一部の場所んな思いか?
編集: 場合は文字列リテラル い 居住のヒープとき、彼らは割り当て?
解決
文字列です。純参照型のないヒープもその味).を確認することができるこのデバッガを使用などwindbgの.
場合は以下のクラス
class SomeType {
public void Foo() {
string s = "hello world";
Console.WriteLine(s);
Console.WriteLine("press enter");
Console.ReadLine();
}
}
お電話 Foo()
にインスタンスを使用できwindbgの検査のヒント.
の参照が格納され、登録のための小さなプログラムの中で最も容易な方法としては、最初の参照の文字列をすることによって !dso
.このアドレスの文字列の質問:
0:000> !dso
OS Thread Id: 0x1660 (0)
ESP/REG Object Name
002bf0a4 025d4bf8 Microsoft.Win32.SafeHandles.SafeFileHandle
002bf0b4 025d4bf8 Microsoft.Win32.SafeHandles.SafeFileHandle
002bf0e8 025d4e5c System.Byte[]
002bf0ec 025d4c0c System.IO.__ConsoleStream
002bf110 025d4c3c System.IO.StreamReader
002bf114 025d4c3c System.IO.StreamReader
002bf12c 025d5180 System.IO.TextReader+SyncTextReader
002bf130 025d4c3c System.IO.StreamReader
002bf140 025d5180 System.IO.TextReader+SyncTextReader
002bf14c 025d5180 System.IO.TextReader+SyncTextReader
002bf15c 025d2d04 System.String hello world // THIS IS THE ONE
002bf224 025d2ccc System.Object[] (System.String[])
002bf3d0 025d2ccc System.Object[] (System.String[])
002bf3f8 025d2ccc System.Object[] (System.String[])
現在利用中の !gcgen
している世代のインスタンスは:
0:000> !gcgen 025d2d04
Gen 0
この世代のゼロになるで割り当てられてしまいます。人の応援です。
0:000> !gcroot 025d2d04
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 0 OSTHread 1660
ESP:2bf15c:Root:025d2d04(System.String)
Scan Thread 2 OSTHread 16b4
DOMAIN(000E4840):HANDLE(Pinned):6513f4:Root:035d2020(System.Object[])->
025d2d04(System.String)
のESPのスタックのための当社の Foo()
の方法で通知するには、こちらをクリックして object[]
しています。このインターンテーブル。みましょう。
0:000> !dumparray 035d2020
Name: System.Object[]
MethodTable: 006984c4
EEClass: 00698444
Size: 528(0x210) bytes
Array: Rank 1, Number of elements 128, Type CLASS
Element Methodtable: 00696d3c
[0] 025d1360
[1] 025d137c
[2] 025d139c
[3] 025d13b0
[4] 025d13d0
[5] 025d1400
[6] 025d1424
...
[36] 025d2d04 // THIS IS OUR STRING
...
[126] null
[127] null
私の出力を少しでご利用いただけます。いかねます。
その結果:文字列は、ヒープにいるときでも、が保持されます。の味でテーブルの開催を参考にインスタンスは、ヒープ.I.。房文字列で収集されていない時のGCが味でテーブルルーツです。
他のヒント
Javaでは(のJava用語するから)
は、SunのJVM(文字列リテラルを含む)インターン文字列内のRAMの特別なプールに格納されているJVMはまた、クラス格納ネイティブコンパイルされたコードをロードパーマ世代と呼ばれます。しかし、intered文字列は、彼らは通常のオブジェクトヒープに格納されていたよりも全く異なる動作をしない。
私は正しいですか?
「インターン」.NET、文字列リテラルでは、「インターンテーブル」と呼ばれる特殊なデータ構造に格納されます。これは、ヒープとスタックから分離されています。すべての文字列がしかし、抑留されるわけではありません...私はそうでないものは、ヒープ上に格納されていることを確信しています。
Javaのを知ってはいけない。
私は<のhref = "http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldstr.aspx" のrel = "nofollowをnoreferrer" についてのMSDNのサイトでこれを見つけました> ldstr
IL命令するます:
ldstr
命令は、メタデータに格納されたリテラル特定の文字列を表す新しい文字列オブジェクトへのオブジェクト参照(O型)を押します。ldstr
命令のは、メモリの必要量]を割り当て、実行時に必要な文字列形式にファイルで使用されるフォームからリテラル文字列を変換するために必要なフォーマット変換を行います。共通言語基盤(CLI)は、同じ文字シーケンスを持つ2つのメタデータトークンを参照する2つのldstr命令の結果が正確に同じ文字列オブジェクト(「文字列はインターン」として知られるプロセス)を返すことが保証されます。
これは<のhref = "https://stackoverflow.com/questions/372547/where-do-java-and-net-としてのJavaとは異なり、(文字列リテラルは、実際には.NETでヒープ上に格納されていることを意味します#372610" を文字列リテラル-常駐>) mmyers のことでに指摘します。
Javaでは、すべてのオブジェクトのような文字列は、ヒープ内に存在します。 のみ(オブジェクトにint型、文字や参照)プリミティブの変数ローカルスタック内に存在します。
インターン文字列のJavaでは、文字列プールと呼ばれる別のプールに位置しています。このプールは、(それはクラスのデータを格納するために使用され、上述したようにしないパーマプール)Stringクラスによって維持し、通常のヒープ上に存在している。
私は、すべての文字列が抑留され、それを理解しないが、myString.intern()を呼び出すと、文字列プールから保証されている文字列を返します。
のようも参照してください: http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally。 HTML の そして、Javadoc ます。http:// javaの。 sun.com/j2se/1.5.0/docs/api/java/lang/String.html#intern()の