青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 119  文章 - 290  trackbacks - 0

博客搬家了哦,請移步
叫我abc

常用鏈接

留言簿(12)

隨筆分類

我的博客

搜索

  •  

積分與排名

  • 積分 - 306721
  • 排名 - 84

最新評論

閱讀排行榜

stack_pack將堆棧中的內存和所分配的函數之間建立依賴關系之后,就到了對 E.pool中所有管理的內存進行標記的時候了。

 1static void
 2gc_mark(int root)
 3{
 4    if (E.pool[root].mark <  E.mark+1{
 5        struct link *children=E.pool[root].u.n.children;
 6        E.pool[root].mark=E.mark+1;
 7        if (children) {
 8            int i;
 9
10                for (i=children->number-1;i>=0;i--{
11                    gc_mark(children->children[i]);
12                }

13        }

14    }

15}
由于暫時還不想考慮weak table的內容,我暫時將這一部分的代碼去掉。
來看看是如何對內存隊列進行標記的。首先,形參root是依賴關系的父節點,是 E.pool數組中的索引。在gc_collect中 root = 0,表示從全局根節點開始,更準確的說從main函數對象開始,遍歷整個依賴關系構成的樹,對每一個節點進行標記。
第4行,是對節點是否已經被標記的判斷。第6行對該節點進行標記。第10、11行則對該節點所引用的子節點重復這一標記過程。
整個依賴關系是樹狀的,利用先序遍歷標記所有還被引用的內存節點。這就是gc_mark所作的工作。

最后,是對所有沒有標記過的內存進行回收。
 1    for (i=0;i<E.size;i++{
 2        if (E.pool[i].mark < E.mark) {
 3            if (E.pool[i].mark >= 0{
 4                void *p=E.pool[i].u.n.mem;
 5                if (E.pool[i].u.n.finalizer && E.pool[i].u.c.weak!=WEAK_CONTAINER) {
 6                    E.pool[i].u.n.finalizer(p);
 7                }

 8                if ((intptr_t)p != FREED_POINTER) {
 9                    my_free(p);
10                    map_erase(i);
11                }

12                node_free(i);
13            }

14        }

15        else if (E.pool[i].mark == E.mark) {
16            void *p=E.pool[i].u.n.mem;
17            if (E.pool[i].u.n.finalizer && E.pool[i].u.c.weak!=WEAK_CONTAINER) {
18                E.pool[i].u.n.finalizer(p);
19                E.pool[i].u.n.finalizer=0;
20            }

21            my_free(p);
22            map_erase(i);
23            E.pool[i].u.c.mem=FREED_POINTER;
24        }

25    }
用for循環遍歷 E.pool,所有分配的內存,因為被標記的內存的值是 E.mark + 1,所以只要 E.pool[i].mark <= E.mark的,都算是垃圾內存了,因此for循環里面的兩個 if 和 else if在垃圾內存的角度上并沒有差別,都是被回收的內容,但是這兩個代碼塊多少還是有差異的,因此稍微想了一下。
首先,從之前做標記的代碼看,沒有被標記過的內存應該是小于 E.mark的,因此if代碼塊是理解上的正常流程。而else if 部分,檢測內存的標記等于 E.mark,這個怎么看都是沒有可能的,因為標記值是 E.mark+1,而E.mark以+2遞增。這有可能是其他一些我還沒看過的代碼,對節點進行了標記也說不定,畢竟還有一個weak_table沒有接觸呢。
此外還有一個細節,else if部分,沒有調用node_free(i),釋放了內存,但是節點保留著,這讓我更確認這是一塊還沒有開辟的代碼區域造成的,不過,這還是等以后看到相關內容的時候,再來考證這里的內容吧。

最后,來看看gc_link中解除依賴關系的代碼,現在已經對整個gc庫有了整體的認識,這部分代碼也就不在話下了
1    if (prev) {
2        int prev_id=map_id(prev);
3        stack_push(prev_id);
4        node_add(parent_id,prev_id | UNSET_MASK);
5    }
第3行,將被解除關系的內存id壓入堆棧,看起來目的是讓這塊內存再稍微活長久一點,至少要活到離開當前函數后。
然后第4行,解除了之前主動添加的依賴關系,在cache_flush的時候,將會從children數組中刪除prev_id。
posted on 2008-09-22 21:55 LOGOS 閱讀(4902) 評論(4)  編輯 收藏 引用 所屬分類: 垃圾收集

FeedBack:
# re: 垃圾收集的那點事(J) 2008-09-22 22:44 來支持
都還沒去下過云風原始的代碼,到是從博主這里看出一點頭緒來,這么感覺出有點LUA的味道啊。對lua研究不深,隨便說說,呵呵。  回復  更多評論
  
# re: 垃圾收集的那點事(J) 2008-09-23 10:32 cexer
哪里有下載的源碼  回復  更多評論
  
# re: 垃圾收集的那點事(J) 2008-09-23 10:57 LOGOS
# re: 垃圾收集的那點事(J) 2008-09-23 17:40 cexer
@LOGOS
多謝了,我也研究研究。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              久久国产精品电影| 鲁大师成人一区二区三区 | 欧美成人精品激情在线观看| 性欧美超级视频| 亚洲永久免费精品| 亚洲精品一区二| 欧美日精品一区视频| 亚洲视频一区二区在线观看 | 亚洲国产日韩在线一区模特| 久久国产夜色精品鲁鲁99| 激情成人综合| 亚洲综合色在线| 99国产精品私拍| 午夜久久久久久| 免费成人黄色av| 久久av一区二区三区亚洲| 亚洲美女网站| 最新国产拍偷乱拍精品| 欧美一级在线视频| 午夜精品一区二区在线观看 | 亚洲精品一区在线观看| 亚洲精品之草原avav久久| 另类激情亚洲| 性色av一区二区三区在线观看| 亚洲精品国产精品乱码不99按摩| 欧美激情综合| 国模精品一区二区三区| 国产午夜精品全部视频在线播放| 亚洲一区二区三区中文字幕| 亚洲国产精品久久久久婷婷884| 欧美国产免费| 免费观看一区| 在线观看免费视频综合| 久久久亚洲高清| 亚洲欧美一区二区原创| 国产精品美女999| 亚洲综合视频在线| 亚洲视频一二| 欧美一级网站| 午夜一区在线| 亚洲一区二区三区精品视频| 欧美黑人在线观看| 最新国产拍偷乱拍精品 | 欧美日韩999| 美女精品自拍一二三四| 亚洲国产电影| 欧美高清hd18日本| 亚洲国产欧美在线| 曰本成人黄色| 亚洲第一伊人| 91久久国产综合久久91精品网站| 欧美在线免费视屏| 依依成人综合视频| 欧美成人视屏| 日韩视频免费在线| 小黄鸭视频精品导航| 午夜国产一区| 国内精品久久久久久| 久热精品视频| 欧美成人综合一区| 一区二区三区四区五区视频| 欧美黑人国产人伦爽爽爽| 在线一区观看| 亚洲影院色无极综合| 久久亚洲国产成人| 激情综合色丁香一区二区| 噜噜噜91成人网| 久久天天躁夜夜躁狠狠躁2022| 免费观看一级特黄欧美大片| 亚洲网友自拍| 亚洲午夜激情在线| 国产亚洲欧洲一区高清在线观看 | 夜夜爽www精品| 欧美承认网站| 日韩视频一区二区三区在线播放免费观看 | 亚洲日产国产精品| 午夜一区二区三区在线观看| 精品88久久久久88久久久| 亚洲国产成人精品女人久久久 | 国产嫩草一区二区三区在线观看| 欧美一区二区私人影院日本| 久久婷婷综合激情| 亚洲美女黄网| 性伦欧美刺激片在线观看| 亚洲黄色尤物视频| 欧美日本亚洲| 久久综合久久综合久久综合| 欧美国产日本在线| 欧美在线网站| 日韩亚洲精品视频| 欧美一区二区三区播放老司机| 久久久免费av| 亚洲免费在线看| 蜜臀a∨国产成人精品 | 国产亚洲欧美日韩精品| 亚洲韩国青草视频| 中文精品视频| 亚洲国产精品精华液网站| 国产酒店精品激情| 午夜电影亚洲| 久久手机免费观看| 一区二区三区国产在线| 老牛国产精品一区的观看方式| 欧美日韩无遮挡| 玖玖综合伊人| 亚洲午夜日本在线观看| 久久久精品国产一区二区三区 | 亚洲欧美日韩精品在线| 久久夜色精品国产欧美乱极品| 亚洲中午字幕| 久久久五月婷婷| 欧美午夜性色大片在线观看| 久久久xxx| 一区二区欧美在线| 国产精品福利在线观看| 久久中文字幕一区| 久久精品国亚洲| 日韩亚洲一区二区| 国产精品亚洲综合天堂夜夜| 久久只精品国产| 久久野战av| 午夜精品网站| 日韩一级欧洲| 国语自产精品视频在线看8查询8| 亚洲五月六月| 亚洲欧洲综合| 亚洲欧洲精品成人久久奇米网| 国产欧美精品日韩区二区麻豆天美| 女人香蕉久久**毛片精品| 蜜月aⅴ免费一区二区三区 | 国产伦精品一区二区三区免费| 日韩亚洲不卡在线| 国产精品免费一区豆花| 欧美大片一区| 久久视频国产精品免费视频在线| 亚洲精品资源美女情侣酒店| 夜夜嗨av色一区二区不卡| 国产女主播在线一区二区| 欧美成人免费全部观看天天性色| 欧美日韩在线电影| 欧美综合激情网| 六十路精品视频| 亚洲欧洲在线视频| aa成人免费视频| 黄色成人在线网址| 亚洲第一主播视频| 欧美日韩99| 久久综合九色综合欧美就去吻 | 欧美中文在线观看| 噜噜噜噜噜久久久久久91| 亚洲色在线视频| 久久久国产视频91| 亚洲视频在线看| aⅴ色国产欧美| 亚洲一区二区免费在线| 亚洲电影第1页| 亚洲一区二区精品| 亚洲精品123区| 欧美在线观看视频一区二区三区 | 午夜精品亚洲| 一区二区成人精品 | 欧美午夜不卡视频| 午夜国产一区| 欧美另类视频在线| 欧美 日韩 国产一区二区在线视频| 欧美猛交免费看| 免费成人在线视频网站| 国产精品香蕉在线观看| 夜夜嗨av一区二区三区四季av| 在线国产精品播放| 欧美在线精品免播放器视频| 亚洲综合日韩中文字幕v在线| 欧美日韩18| 99re国产精品| 亚洲一区二区黄色| 欧美日韩免费高清| 日韩一区二区精品视频| 日韩午夜剧场| 欧美日韩专区| 亚洲久久一区| 亚洲一区二区三区视频| 欧美激情性爽国产精品17p| 亚洲激情视频在线| 亚洲精品美女免费| 欧美激情亚洲激情| 日韩午夜高潮| 欧美一区2区视频在线观看| 国产麻豆精品视频| 久久久久成人精品| 欧美成年人视频网站欧美| 亚洲电影天堂av| 欧美日本一道本在线视频| 一本一本久久| 久久久亚洲一区| 一本久久综合亚洲鲁鲁| 欧美日韩中文在线| 亚洲免费在线视频| 麻豆成人综合网| 一区二区欧美精品| 国产欧美一区二区视频|