不知不覺中,我在NewsGator Online訂閱的Feed已超過100個,每天的閱讀壓力也在逐漸增加。在使用NewsGator的過程中,發(fā)現(xiàn)一個很生動的當(dāng)代GC(垃圾收集器)實現(xiàn)的類比,拿出來和大家分享,能幫助其他人理解GC當(dāng)然再好不過,幫不上的話(言下之意你已經(jīng)知道分代式GC的原理),就當(dāng)是消遣吧。
我不知道大家平時怎么用NewsGator來閱讀訂閱的Feed,我的習(xí)慣是先簡單瀏覽一遍,把感興趣但是暫時沒時間看的話題加入My Clippings目錄,然后把當(dāng)前這一頁全部標(biāo)記為已讀,繼續(xù)瀏覽下一頁或者下一個目錄。等到空閑的時候,打開My Clippings仔細(xì)閱讀那些被我加進(jìn)來的文章和鏈接。My Clippings目錄和其他目錄一樣,默認(rèn)都是時間降序排列的,越新的Feed越靠前,而我通常都會把My Clippings里面的Feed數(shù)量控制在100以內(nèi)。
由于我訂閱的Feed很多,涉及到的領(lǐng)域也較廣,加上閱讀時間有限,第一遍總會有一些原本不是我想細(xì)看的溜進(jìn)My Clippings目錄,當(dāng)我進(jìn)入My Clippings,發(fā)現(xiàn)這樣的Feed,對待它們我就是一個字:刪。然后會陸續(xù)讀掉一些Feed,分享一些Feed,這些閱讀掉和分享掉的Feed,我也會清理出My Clippings。而我的閱讀順序,默認(rèn)也是先讀新的,再讀舊的,因為越新的,越值得關(guān)注。我每次打開My Clippings也不一定總能把整個目錄從頭到尾瀏覽一遍,不過幾乎也總能發(fā)現(xiàn)、閱讀和清理掉一些Feed。這樣通過一倫又一倫的新陳代謝,我的My Clippings目錄能夠長時間保持在100個條目之內(nèi),也總是能夠留下我感興趣但是還沒來得及細(xì)看或者分享的Feed。
想想看,一個分代式GC背后的想法和實現(xiàn)不也是這樣么?當(dāng)內(nèi)存不夠或者應(yīng)用程序主動提出垃圾收集的要求時,GC會在最新的一代對象池中找出垃圾(可能是沒有意義的,被錯誤創(chuàng)建的對象,也可能是被使用掉,失去作用的對象),清理掉,留下的被升級為第二代。為什么GC可以認(rèn)定第一代中的對象最有可能是垃圾,而第二代、第三代對象相對而言不大可能是垃圾呢?比對一下剛才的例子,沒有經(jīng)歷過清理同時又是新加進(jìn)來的Feed,最有可能是被錯誤加進(jìn)來或者已經(jīng)閱讀和分享過的,而經(jīng)歷過一次和多次清理都沒有被清除或者分享掉的,則更有可能是那些等待我閱讀和分享的Feed。換作對象的概念:那些沒有經(jīng)歷過GC、新創(chuàng)建的對象,即第一代對象中,最有可能發(fā)現(xiàn)錯誤創(chuàng)建或者已經(jīng)處理結(jié)束的對象(超出生命周期),而第二代或者更老的對象,經(jīng)歷過GC,卻沒有被清掉(因為有其他對象還在使用它),則更有可能可能是真正有用的對象。把有限的精力用在真正值得的地方,這就是分代式GC相對傳統(tǒng)GC的更高效率的來源。