通俗易懂.NET GC垃圾回收机制(适用于小白面试,大牛勿喷)

情景:你接到xx公司面试邀请,你怀着激动忐忑的心坐在对方公司会议室,想着等会的技术面试。技术总监此时走来,与你简单交谈后....

技术:你对GC垃圾回收机制了解的怎么样?

你:还行,有简单了解过。

技术:那我考考你...

一、GC全称

答:Garbage Collector(垃圾收集器)

二、GC有什么用?(垃圾回收的目的)

答:主要就是为了提高内存利用率

三、GC回收哪些垃圾?

答:只回收“托管堆中的内存资源”,没有引用的对象。不回收“栈”上的资源(比如值类型)。

四、什么时候回收?

答:不确定,当程序需要新内存的时候执行回收。

五、GC垃圾回收机制(重点!)

答:引入“代”的概念,

①总共有三代,0~2代。

②每次新建对象都在第0代中。

③每代有固定大小。

图解:新建了a、b、c、d四个对象,第0代内存满了,但此时又新建了一个e对象,那这个时候会发生什么?e对象会被放在哪里?1代里吗?还是2代?

通俗易懂.NET GC垃圾回收机制(适用于小白面试,大牛勿喷)

错!不会放在1代里,也不会放在2代里。这个时候会触发“垃圾回收”,CLR会去遍历这a、b、c、d这四个对象,打上标记。假设a和b对象已经没有被引用了,c和d还在被引用,那a和b就会被当做垃圾回收掉,c和d就会被放到1代里,e也就进入0代了。

通俗易懂.NET GC垃圾回收机制(适用于小白面试,大牛勿喷)

进过GC回收后,就变成了下面这样:

通俗易懂.NET GC垃圾回收机制(适用于小白面试,大牛勿喷)

如此往复。

备注:这个叫“自动回收”,肯定有小朋友会问,那是不是可以手动回收。答案是肯定的,比如析构函数就可以达到这个目的。还不知道什么是“析构函数”的小朋友,请偷偷出门去自行百度。

六、弱引用

人就是这样,得不到的永远在骚动,得到的有恃无恐。当失去了,才追悔莫及。假如对象要被回收了,但是我又想再次用这个对象,该怎么办?这个时候就出来了这个--“弱引用”。

为什么需要弱对象呢?因为,有一些数据创建起来很容易,但是却需要很多内存。

例如:有一个程序需要去访问用户硬盘上的所有文件夹和文件名;你可以在程序第一次需要这个数据时访问用户磁盘生成一次数据,数据生成之后你就可以访问内存中的数据来得到用户文件数据,而不是每次都去读磁盘获得数据,这样做可以提升程序的性能。

你可以这么理解,你跟你女朋友闹分手,微信电话什么的全部删除了,但是还留着QQ,以后想要联系,可以通过这个QQ来联系,而此时的这个QQ,就相当于是弱引用了。至于为什么分手了还要联系,这个原因也就是为什么要有弱引用的原因了~

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

结尾:以上都是我个人的一些粗略见解,专业术语长篇大论可能看的晕头转向,所以有了这个通俗易懂版,适合没有怎么接触过GC这一块的小白,初衷还是为了帮助新手能应付面试。但是实际使用的话,还是要多去看看专业的资料文档。您要是觉得有用,您就看看,然后自己再多去查查相关资料,加深理解。您要是觉得没有用,那也就笑笑翻过去了。

祝大家工作顺利,诸事顺遂!可以的话~给我点个赞呗(狗头)

上一篇:window.history


下一篇:Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法