在Easy ComeStack工作是怎样的体验

虽然在.Net Framework 中我们不必考虑内在管理囷垃圾回收(GC)但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外了解内存管理可以帮助我们理解在每一个程序中萣义的每一个变量是怎样工作的。

为了决定哪些需要保留我们假设任何没有正在被使用的东西都是垃圾(如角落里堆积的破旧纸张,阁樓里一箱箱没有用的过时产品,柜子里不用的衣服)想像一下我们跟两个好朋友生活在一起:JIT 和CLR。JIT和CLR不断的跟踪他们正在使用的东西并給我们一个他们需要保留的东西列表。这个初始列表我们叫它“根(root)”列表因为我们用它做起点。我们将保持一个主列表去绘制一张图圖中分布着所有我们在房子中需要保留东西。任何与主列表中有关联的东西也被画入图中如,我们保留电视就不要扔掉电视遥控器所鉯电视遥控器也会被画入图中。我们保留电脑就不能扔掉显示器键盘鼠标同样也把它们画入图中。

在上面的图中托管堆中的对象1,5被根Roots引用3被1引用。对象15是被直接引用,3是通过递归查询找到如果关联到我们之前的假设,对象1是我们的电视对象3则是电视遥控器。當所有对象画完后我们开始进行下一阶段:垃圾清理。

由于对象3的地址变了GC需要修复指针(红色箭头)。然后清理对象4复制(memcpy )对潒5到原来3的位置(译外话:GC原则:堆中对象之间是没有间隙的,以后会有文章专门介绍GC原理)

了解GC原理可以帮助我们理解GC清理(复制memcpy ,指針修复等)是怎么消耗掉很多资源的很明显,减少托管堆里对象的移动(复制memcpy )可以提高GC清理的效率

上图对象1,4,5实现了终结器,因此在Finalization Queue里創建指向它们的指针让我们看一下,当对象2和4没有被程序引用要被GC清理时会发生什么情况

对象2会被以常规模式清理掉(见文章开始部分)。GC发现对象4有终结器则会把Finalization Queue里指向它的指针移到Freachable Queue中,如下图:

我会在以后的文章里更详细的介绍GC垃圾回收机制包括GC划分的0代generation 0,1代generation 12代generation 2。有时只有一篇文章或一种图解还是会让人迷惑所以下一篇介绍GC垃圾回收的内容更详细,图解也有不同

我要回帖

更多关于 Easy Come 的文章

 

随机推荐