当我们不再使用某个对象的时候,此对象会被 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++知识,欢迎大家前来学习哦。
网友评论