当前位置: 首页 > 知识库问答 >
问题:

C#中的字符串常量内存池

祁增
2023-03-14

每个人都知道这一点。Net framework字符串对象直接存储在堆内存中

我只是想弄清楚里面是否有保留的记忆。Net字符串框架。在java中,有一个为字符串保留的内存,称为SCMP(字符串常量内存池),在这里字符串被初始化和垃圾收集,就像堆内存中的其他对象一样。

共有3个答案

郝昊东
2023-03-14

在。NET文字字符串被“驻留”,因此每个文字字符串只有一个副本。

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

卫焕
2023-03-14

...Net框架在表Intern Pool中保存字符串存储。你可能会看到:

String interning和String。空-埃里克·利伯特

如果在一个编译单元中有两个相同的字符串文字,那么我们生成的代码将确保CLR仅为程序集中该文字的所有实例创建一个字符串对象。这种优化被称为“字符串实习”。

字符串实习。Net框架

公共语言运行时通过维护一个称为实习生池的表来保存字符串存储,该表包含对程序中以编程方式声明或创建的每个唯一文本字符串的单个引用。因此,具有特定值的文本字符串的实例在系统中只存在一次。

沈宏朗
2023-03-14

我不认为世界上有这样的事情。网

相反,我读了这个有趣的字符串是如何使用的:

CLR维护一个名为intern pool的表,该表包含程序中的文本字符串。这确保了在代码中重复使用相同的常量字符串将使用相同的字符串引用。系统。String类提供了一个Intern方法,确保字符串位于Intern池中,并返回对它的引用。

也检查这个MSDN:-

我们已经看到了许多托管堆包含相同字符串重复数千次的场景。结果是一个很大的工作集,其中大部分内存被字符串消耗。在这种情况下,使用字符串驻留通常更好。

 类似资料:
  • 在Java 7或更低版本中,如果使用以下语法创建字符串 根据此链接,每当我们创建一个字符串对象时,都会创建两个对象,即堆区域中的一个和字符串常量池中的一个,并且字符串对象引用始终指向堆区域对象,如下所示。 如果我们创建另一个与 具有相同值的String对象,内存表示将是什么 这会在堆中创建另一个具有相同值的对象吗? 还是只会创建引用字符串常量池到堆中的对象?

  • 根据Java, 字符串存储在两个地方。字符串字面池和堆内存根据其创建。我需要知道,当字符串赋值到另一个字符串时,新创建的字符串将存储在哪里? 我对堆和字符串池中的字符串类型都进行了赋值操作。我得到了这样的结果。 但是当, 如果我这么做 同样地, 现在 以上是我在IDE上得到的输出。根据该输出,strNew的一个新引用对象在字符串池中创建,strNew的一个新引用对象在堆中创建。对吗?

  • 当使用文字创建字符串时,它会存储在池中。但当使用new运算符创建字符串对象时,它会将对象存储在堆中。 但是,堆中的对象只是一个指向存储在池中的文本的指针,还是一个存储在堆中的简单字符串对象,符合GC的条件?

  • 如这些问题中所述:问题1 在以下情况下,JVM将创建一个新的字符串对象,而不是使用字符串池中的现有对象: 然而,在阅读了下面两个类似的陈述之后,我有一个疑问。 从SCJP准备书: 当编译器遇到字符串文字时,它会检查池中是否已经存在相同的字符串。如果找到匹配项,对新文本的引用将指向现有的String,并且不会创建新的String文本对象。 来自JavaRanch: 在本例中,由于关键字“new”,我

  • 问题内容: 在C ++中,创建多行字符串的最佳规范方法是创建相邻字符串,并让编译器在编译时将它们连接起来,如下所示: 在Java中,我唯一知道的方法是串联: 问题是,这是在运行时生成单个字符串,还是Java实际上也在编译时进行连接?出现此问题的原因是由于以下行为: 问题答案: String s3 = “a”; s3 += “bc”; 与: 因此,它创建了一个新实例。 您甚至可以尝试:

  • 我在网站上读到了这个问题:java内存池是如何划分的?我想知道“字符串常量池”属于这些扇区中的哪一个? 还有池中的文字是否曾经被 GC 化? 方法从池中返回文字的基链接。 如果池确实被 GC 处理,那么它不会对字符串池的想法适得其反吗?将再次创建新的文本,使 GC 无效。 (假设池中仅存在一组特定的文本,它们永远不会过时,迟早会再次需要它们)