情景:你接到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这一块的小白,初衷还是为了帮助新手能应付面试。但是实际使用的话,还是要多去看看专业的资料文档。您要是觉得有用,您就看看,然后自己再多去查查相关资料,加深理解。您要是觉得没有用,那也就笑笑翻过去了。
祝大家工作顺利,诸事顺遂!可以的话~给我点个赞呗(狗头)