内容简介:当我们不再使用某个对象的时候,此对象会被 GC 垃圾回收掉。当然前提是你没有写出内存泄漏的代码。我们也知道如果生成了大量的字符串,会对 GC 造成很大的压力。但是,如果在编译期间能够确定的字符串,就不会被 GC 垃圾回收掉了。下面,我创建了几个字符串,我关心的字符串是
当我们不再使用某个对象的时候,此对象会被 GC 垃圾回收掉。当然前提是你没有写出内存泄漏的代码。我们也知道如果生成了大量的字符串,会对 GC 造成很大的压力。
但是,如果在编译期间能够确定的字符串,就不会被 GC 垃圾回收掉了。
示例代码
下面,我创建了几个字符串,我关心的字符串是 "walterlv" , "lindexi" 以及一个当前时间。
于是使用下面的代码来验证:
using System;
using System.Linq;
using System.Runtime.CompilerServices;
namespace Walterlv.Demo
{
class Program
{
static void Main(string[] args)
{
var table = new ConditionalWeakTable<string, Foo>
{
{"walterlv", new Foo("吕毅")},
{"lindexi", new Foo("林德熙")},
};
var time = DateTime.Now.ToString("T");
table.Add(time, new Foo("时间"));
time = null;
Console.WriteLine($"开始个数:{table.Count()}");
GC.Collect();
Console.WriteLine($"剩余个数:{table.Count()}");
}
}
public class Foo
{
public string Value { get; }
public Foo(string value) => Value = value;
}
}
"walterlv" 和 "lindexi" 是在编译期间能够完全确定的字符串,而当前时间字符串我们都知道是编译期间不能确定的字符串。
在 GC 收集之前和之后, ConditionalWeakTable 中的对象数量从三个降到了两个。
并没有清除成 0 个,说明字符串现在仍然是被引用着的。
那被什么引用着呢?是字符串暂存池。要理解字符串暂存池,可以阅读我的另一篇博客:
另外,即便设置了 CompilationRelaxations.NoStringInterning ,编译期间能确定的字符串在上述代码中也是不会被垃圾回收的。
参考资料
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
奇点系列
彼得•蒂尔、里德•霍夫曼、本•霍洛维茨、埃里克•杰克逊等 / 高玉芳、路蒙佳、杨晓红、徐彬等 / 中信出版社 / 2015-6-20 / 182.00
1.硅谷创投教父、PayPal创始人彼得•蒂尔、LinkedIn创始人里德•霍夫曼、创业导师本•霍洛维茨、“PayPal黑帮”初创成员埃里克•杰克逊联合作品。 2.彼得•蒂尔与埃隆•马斯克的首次交锋,PayPal从0到1改变全球金融的生死突围,商业硬汉的创业史诗,揭秘“PayPal黑帮”的创业维艰与联盟关系。 3.《人民日报》推荐创业者必读书目!“奇点系列”的作者们以及“PayPal黑......一起来看看 《奇点系列》 这本书的介绍吧!