美文网首页程序园C语言
.NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 G

.NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 G

作者: 编程小世界 | 来源:发表于2019-06-16 20:43 被阅读0次

当我们不再使用某个对象的时候,此对象会被 GC 垃圾回收掉。当然前提是你没有写出内存泄漏的代码。我们也知道如果生成了大量的字符串,会对 GC 造成很大的压力。

但是,如果在编译期间能够确定的字符串,就不会被 GC 垃圾回收掉了。

示例代码

下面,我创建了几个字符串,我关心的字符串是 "walterlv" , "lindexi" 以及一个当前时间。

于是使用下面的代码来验证:

usingSystem;usingSystem.Linq;usingSystem.Runtime.CompilerServices;namespaceWalterlv.Demo{classProgram{staticvoidMain(string[] args){vartable =newConditionalWeakTable            {                {"walterlv",newFoo("吕毅")},                {"lindexi",newFoo("林德熙")},            };vartime = DateTime.Now.ToString("T");            table.Add(time,newFoo("时间"));            time =null;            Console.WriteLine($"开始个数:{table.Count()}");            GC.Collect();            Console.WriteLine($"剩余个数:{table.Count()}");        }    }publicclassFoo{publicstringValue {get; }publicFoo(stringvalue)=> Value =value;    }}

"walterlv" 和 "lindexi" 是在编译期间能够完全确定的字符串,而当前时间字符串我们都知道是编译期间不能确定的字符串。

在 GC 收集之前和之后, ConditionalWeakTable 中的对象数量从三个降到了两个。

并没有清除成 0 个,说明字符串现在仍然是被引用着的。

另外,即便设置了 CompilationRelaxations.NoStringInterning ,编译期间能确定的字符串在上述代码中也是不会被垃圾回收的。

如果有想学习c++的程序员,可来我们的C/C++学习扣qun:589348389,

免费送C++的视频教程噢!

我每晚上8点还会在群内直播讲解C/C++知识,欢迎大家前来学习哦。

相关文章

  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 G

    当我们不再使用某个对象的时候,此对象会被 GC 垃圾回收掉。当然前提是你没有写出内存泄漏的代码。我们也知道如果生成...

  • String内存分析

    1、了解常量池 字符串常量池中存储的就是各种字符串,在常量池中这些字符串都是唯一的。字符串常量池中存储的是在编译期...

  • Java基础-String可以多长

    主要分编译期和运行期。1.编译期 这样定义的字符串在编译期就已经确定了,aaa字符串存放在方法区的常量池。代码编译...

  • jvm关于String

    先上代码 输出结果为 接下来先复制一段概念:凡是编译期能推断出值内容的字符串, 都会在编译时期编程字符串常量, 从...

  • String

    String类的特点: 字符串对象一旦被初始化就不会被改变。"abc"存储在字符串常量池中。池中没有就建立,池中有...

  • iOS之NSString的内存

    一、字符串的存储 在OC中,对字符串的处理,一个@"aaa"的字符串是字符串常量,在编译的时候已经确定了他的值,不...

  • java常用类

    一、String特性: 二、String字面量定义的说明: String定义的字符串会在方法区当中的字符串常量池中...

  • 一个高频面试题,考考大家对 Java String 常量池的理解

    问题:下面两行代码,会在JAVA字符串常量池中产生几个字符串。 String str1 = "ab"; Strin...

  • 字符串内存分配

    对于字符串,其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果...

  • 字符串相加

    字符串相加,原理:String str = "a"+"b"; 会被编译成 StringBuilder sb = n...

网友评论

    本文标题:.NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 G

    本文链接:https://www.haomeiwen.com/subject/eaqnfctx.html