Read Sean

大胃眼中的.NET和其他

导航

[导入]换个角度理解GC

Posted on 2006-04-27 23:30  大胃  阅读(240)  评论(0编辑  收藏  举报

不知不觉中,我在NewsGator Online订阅的Feed已超过100个,每天的阅读压力也在逐渐增加。在使用NewsGator的过程中,发现一个很生动的当代GC(垃圾收集器)实现的类比,拿出来和大家分享,能帮助其他人理解GC当然再好不过,帮不上的话(言下之意你已经知道分代式GC的原理),就当是消遣吧。

我不知道大家平时怎么用NewsGator来阅读订阅的Feed,我的习惯是先简单浏览一遍,把感兴趣但是暂时没时间看的话题加入My Clippings目录,然后把当前这一页全部标记为已读,继续浏览下一页或者下一个目录。等到空闲的时候,打开My Clippings仔细阅读那些被我加进来的文章和链接。My Clippings目录和其他目录一样,默认都是时间降序排列的,越新的Feed越靠前,而我通常都会把My Clippings里面的Feed数量控制在100以内。

由于我订阅的Feed很多,涉及到的领域也较广,加上阅读时间有限,第一遍总会有一些原本不是我想细看的溜进My Clippings目录,当我进入My Clippings,发现这样的Feed,对待它们我就是一个字:删。然后会陆续读掉一些Feed,分享一些Feed,这些阅读掉和分享掉的Feed,我也会清理出My Clippings。而我的阅读顺序,默认也是先读新的,再读旧的,因为越新的,越值得关注。我每次打开My Clippings也不一定总能把整个目录从头到尾浏览一遍,不过几乎也总能发现、阅读和清理掉一些Feed。这样通过一伦又一伦的新陈代谢,我的My Clippings目录能够长时间保持在100个条目之内,也总是能够留下我感兴趣但是还没来得及细看或者分享的Feed。

想想看,一个分代式GC背后的想法和实现不也是这样么?当内存不够或者应用程序主动提出垃圾收集的要求时,GC会在最新的一代对象池中找出垃圾(可能是没有意义的,被错误创建的对象,也可能是被使用掉,失去作用的对象),清理掉,留下的被升级为第二代。为什么GC可以认定第一代中的对象最有可能是垃圾,而第二代、第三代对象相对而言不大可能是垃圾呢?比对一下刚才的例子,没有经历过清理同时又是新加进来的Feed,最有可能是被错误加进来或者已经阅读和分享过的,而经历过一次和多次清理都没有被清除或者分享掉的,则更有可能是那些等待我阅读和分享的Feed。换作对象的概念:那些没有经历过GC、新创建的对象,即第一代对象中,最有可能发现错误创建或者已经处理结束的对象(超出生命周期),而第二代或者更老的对象,经历过GC,却没有被清掉(因为有其他对象还在使用它),则更有可能可能是真正有用的对象。把有限的精力用在真正值得的地方,这就是分代式GC相对传统GC的更高效率的来源。




大胃 2006-04-27 23:08

文章来源:http://www.blogjava.net/sean/archive/2006/04/27/43674.html