2013-09-16 55 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

公共语言运行库维持 表节省字符串存储,叫实习生池,包含一个参考 每一个独特的文本字符串声明或 编程方式创建你的程序。因此,具有 特定值的文字字符串的实例仅在系统中存在一次。