2013-09-16 56 views
9

大家都知道,.NET Framework中的String對象直接存儲在堆內存字符串常量內存池

我只是想了解如果在絃樂Net框架任何保留的存儲器。在java中,有一個名爲SCMP(字符串常量內存池)的保留內存,其中字符串被初始化並被垃圾收集,就像堆內存中的其他對象一樣。

+1

我認爲Java具有這樣的功能,因爲在過去,我們的移動設備內存有限。現在我們不需要這樣的功能。編譯器和垃圾收集器要簡單得多。 –

+0

相關http://stackoverflow.com/questions/372547/where-do-java-and-net-string-literals-reside/372559#372559 –

回答

2

在.NET中,文字字符串是「interned」的,因此每個文字字符串只有一個副本。

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

+0

這個答案有誤導性。 *文字*字符串被禁用。動態構建的字符串作爲普通對象分配在堆上,並不一定是唯一的。快速示例:'Object.ReferenceEquals(「abc」,「ABC」.ToLowerInvariant())'計算結果爲'false',因爲只有第一個字符串被攔截。 – Douglas

+0

@Douglas - 無意誤導。答案是每個* literal *字符串都有一個副本。引用的MSDN引用明確指出,編程式構建的字符串不會被攔截,除非您使用'String.Intern'方法明確強制它們被攔截。 –

+1

另外,僅僅因爲一個字符串被攔截並不意味着字符串內存在一個單獨分配的地方。沒有理由它不能只是在普通的堆內存中。關鍵是編譯器會跟蹤所有這些字符串,並確保所有文字都使用相同的引用,因此它們不需要位於單獨的內存池中即可。 – Servy

5

我不認爲有這樣的在.net事情。

相反,我已閱讀this及其多麼有趣字符串用於:

的CLR維護的表中調用包含在程序中 文字字符串實習生池。這可確保在您的代碼中重複使用相同的常量字符串將使用相同的字符串 參考。 System.String類提供了一個Intern方法, 確保字符串在intern池中,並返回引用到 它。

還要檢查這個MSDN: -

我們已經看到許多場景中託管堆中包含 相同的字符串重複數千次。結果是一個很大的工作 集大量內存被字符串佔用。在這種情況下 ,它往往是更好地使用string interning.

1

Net框架節省字符串存儲在一個表中,Intern Pool。您可能會看到:

String interning and String.Empty - Eric Lippert

如果你有一個編譯單元兩個相同的字符串文字然後 我們生成的代碼可確保只有一個字符串對象由 創建該文本的所有實例的CLR在大會內。這個 優化被稱爲「字符串實習」。

String Interning .Net framework

公共語言運行庫維持 表節省字符串存儲,叫實習生池,包含一個參考 每一個獨特的文本字符串聲明或 編程方式創建你的程序。因此,具有 特定值的文字字符串的實例僅在系統中存在一次。