不知不覺中,我在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的更高效率的來源。