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


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

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

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

    技术:那我考考你...

    一、GC全称

    答:Garbage Collector(垃圾收集器)

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

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

    三、GC回收哪些垃圾?

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

    四、什么时候回收?

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

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

    答:引入“代”的概念,

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

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

    ③每代有固定大小。

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

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

     

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

     如此往复。

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

    六、弱引用

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

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

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

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

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

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

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

  • 相关阅读:
    DuckHunter Attacks
    iOS10 UI教程视图的边界与视图的框架
    iOS10 UI教程视图的几何形状
    iOS10 UI教程禁用视图与用户的交互
    iOS10 UI教程基改变视图的外观与视图的可见性
    分享Kali Linux 2016.2第47周虚拟机
    iOS10 UI教程基础窗口的内容与设置起始窗口
    分享Kali Linux 2016.2第47周镜像
    Swift3.0语言教程字符串与URL的数据转换与自由转换
    人机接口设备攻击(HID Attack)
  • 原文地址:https://www.cnblogs.com/shenwan0906/p/12671466.html
Copyright © 2020-2023  润新知