对String的几个错误认识

昨天调试一段程序发现内存始终释放不掉,最后终于发现是对String 的错误使用造成,这促使我今天 又仔细研究了一下String类型,不研究不知道,一研究发现我过去对String 的很多认识都是错误的,感 觉这种错误认识还比较有典型性,于是写下此文和大家一起探讨。

1. String 类型变量追加,或修改后的新String对象是驻留(Interned)的。

如下面代码

string s1 = "abcd";
string s2 = s1 + "e";

我过去想当然的认为s2 是驻留的,但实际上并非如此,用 string.IsInterned 方法检测s2是非驻留 的。后来研究发现只有常量字符串才会默认驻留,其他的字符串变量哪怕是采用 new string  构造出来 的,默认都非驻留,除非用string.Intern 强行驻留。后面我将提到驻留对内存的影响,微软之所以不让 所有的字符串都驻留,我认为还是处于内存方面的考虑。

2. String 变量不再引用后CLR会通过GC自动释放其内存。

string s1 = "abcd";
s1 = null;

上面代码,我想当然的认为s1 = null 后已经不再对 "abcd" 这个字符串引用,如果没有其他引用指 向这个字符串,GC会释放"abcd"这块内存。实际结果却是否定的。因为s1 被赋予了一个常量,导致 "abcd"这个字符串是驻留的,驻留的字符串在进程结束之前无法被自动释放。更糟糕的是,我昨天调试的 那段程序里面大量的字符串变量被采用 string.Intern 强制驻留,这导致我把所有的托管对象都释放了 依然无法释放那部分大概30多M的内存。

遗憾的是微软的MSDN中文版中string.Intern 的帮助信息里面竟然漏掉了性能考谅(Performance consideration) 这一节,我估计大多数中国程序员包括我在内如果有中文的帮助是懒得去看英文的。很 遗憾微软中文的帮助不知道为什么把最重要的部分给漏了。下面是英文帮助中Performance consideration 一节。

Performance Considerations

If you are trying to reduce the total amount of memory your application allocates, keep in mind that interning a string has two unwanted side effects. First, the memory allocated for interned String objects is not likely be released until the common language runtime (CLR) terminates. The reason is that the CLR's reference to the interned String object can persist after your application, or even your application domain, terminates. Second, to intern a string, you must first create the string. The memory used by the String object must still be allocated, even though the memory will eventually be garbage collected.

The .NET Framework version 2.0 introduces the CompilationRelaxations..::.NoStringInterning enumeration member. The NoStringInterning member marks an assembly as not requiring string-literal interning. You can apply NoStringInterning to an assembly using the CompilationRelaxationsAttribute attribute. Also, when you use the Native Image Generator (Ngen.exe) to compile an assembly in advance of run time, strings are not interned across modules.

看了英文的帮助就知道Intern 后的字符串是无法释放的了。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, string
, 字符串
, 变量
, intern()
, The
, Ngen.exe
, 对象驻留
Android对象驻留
string创建了几个对象、string占几个字节、empty string什么错误、string几个字节、string类型占几个字节,以便于您获取更多的相关知识。

时间: 2024-10-05 19:13:29

对String的几个错误认识的相关文章

visual studio- vs2013 C++ <string>编译错误 大神这是什么原因

问题描述 vs2013 C++ <string>编译错误 大神这是什么原因 解决方案 提示什么错误?我这里没有. 你新建一个C++控制台项目(不要创建成C#或者别的了) 删除别的但是保留include stdafx.h 贴上你上面的代码 应该是可以的. 解决方案二: 是否建立正确得vc++工程.

对 String 的几个错误认识

昨天调试一段程序发现内存始终释放不掉,最后终于发现是对String 的错误使用造成,这促使我今天又仔细研究了一下String类型,不研究不知道,一研究发现我过去对String 的很多认识都是错误的,感觉这种错误认识还比较有典型性,于是写下此文和大家一起探讨. 1. String 类型变量追加,或修改后的新String对象是驻留(Interned)的. 如下面代码 string s1 = "abcd";             string s2 = s1 + "e"

IE保存图片时出现“800700de错误”的解决方法

IE中打开网站图片,右键-图像另村为的时候-发生如下错误 --------------------------- Windows Internet Explorer --------------------------- 由于出现错误 800700de 而导致此项操作无法完成. --------------------------- 确定 帮助 --------------------------- 我在服务器上分别用两种方式输出图片都有如上错误 第一种方式为:Response.Transmit

全面了解javascript中的错误处理机制_javascript技巧

前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较差的用户体验.由于任何javascript错误都可能导致网页无法使用,因此作为开发人员,必须要知道何时可能出错,为什么会出错,以及会出什么错.本文将详细介绍javascript中的错误处理机制 error对象 error对象是包含错误信息的对象,是javascript的原生对象.当代码解析或运行时发生错误,javascript引擎就会自动产生并抛出一个error对象的实例,然后整个程序

深入分析javascript中的错误处理机制_javascript技巧

前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较差的用户体验.由于任何javascript错误都可能导致网页无法使用,因此作为开发人员,必须要知道何时可能出错,为什么会出错,以及会出什么错.本文将详细介绍javascript中的错误处理机制 error对象 error对象是包含错误信息的对象,是javascript的原生对象.当代码解析或运行时发生错误,javascript引擎就会自动产生并抛出一个error对象的实例,然后整个程序

tring format报错-在myEclipse9.0中运行String.format报错

问题描述 在myEclipse9.0中运行String.format报错 错误信息:The method format(String, Object[]) in the type String is not applicable for the arguments (String, String) 源代码: public void test1(){ String str=null; str=String.format("Hi, %s", "林计钦"); // 格式化

js-判断从文本框输入的字符串格式是否正确 正确格式为 0:正确,1:错误,2:是,3:否

问题描述 判断从文本框输入的字符串格式是否正确 正确格式为 0:正确,1:错误,2:是,3:否 在js或者C#实现 定义一个var a,文本框输入的放入a中,判断a 是否满足格式 0:正确,1:错误,2:是,3:否 实现后截取 数字 冒号 中文字或英文 逗号 解决方案 c#字符串有一个split方法,根据冒号分割成数组,自己去第一个和第二个元素即可 解决方案二: 提问题 提清楚点 你可以叫string 转 array string str="正确,错误,是,否"; string[] a

我的Android进阶之旅------&amp;gt;Java字符串格式化方法String.format()格式化float型时小数点变成逗号问题

    今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.好吧,又是我来维护.     好吧,先把系统语言切换到波兰语,切换到波兰语的方法查看文章 我的Android进阶之旅------>Android[设置]-[语言和输入法]-[语言]列表中找到相应语言所对应的列表项   地址:http://blog.csdn.net/ouyang_peng/article/details/50209789 ======================

c字符串,string对象,字符串字面值的区别详解_C 语言

一.字符串字面值字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符.字符串没有变量名字,自身表示自身 复制代码 代码如下: "Hello World!" //simple string literal"" //empty string literal"\nCC\toptions\tfile.[cC]\n" //string literal us