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

Lyt
posts - 16,comments - 61,trackbacks - 0

      已經講述過垃圾收集器的工作機制總體實現了,這篇文章主要針對標記和內存縮并進行具體闡述。

1. 標記

      我們知道,標記存活對象是為了識別出垃圾,依靠對所有存活對象進行一次全局遍歷來確定哪些內存可以回收。這個遍歷從根出發,利用相互引用關系,標記所有存活對象,除此之外,其他內存就是垃圾。這里強調下,標記并不會沿著已經被標記的單元追蹤下去,這確保了標記能夠終止。

      對于對象間的相互引用關系,這針對不同的對象類型又有所不同。對象類型指的是ObjectHandle可被解釋為整型、布爾型、字符串、數組等等。顯然,基本數據類型比如整型,只需要看看自己是否被標記就可以了,但是對于復合數據類型,比如數組,必須再繼續跟蹤每個數組元素到底有沒有被標記。于是我們發現,針對不同的對象類型,遍歷方法是不一樣的,所以想辦法把不同對象類型的遍歷方法分開來寫,萬一需求增加了,想再增加別的對象類型,比如結構體,只需要增加代碼,就沒有必要因此大幅度地修改代碼了。

      上文提到,我們會為每個對象類型寫自己的遍歷方法,這里我們將這件事封裝在Walker里。Walker提供接口,具體的對象類型可以繼承并實現之,這里用整型對象類型,即IntWalker舉例。

        class Walker
        {
        
public:
            
virtual void WalkObject(ObjectHandle* handle)const=0;
        };

        
class IntWalker : public Walker
        {
        
public:
            
virtual void WalkObject(ObjectHandle* handle)const
            {
                handle
->Marked=true;
            }
        };
      自然地,我們還需要根據ObjectHandle的對象類型來選擇不同的Walker,這里把它封裝在WalkerSelector里。
        enum ObjectType        //對象類型
        {
            objectINT,
            objectBOOL,
            objectSTRING,
            objectARRAY,
            objectSTRUCT
        };

        
class WalkerSelector
        {
        
private:
            
static IntWalker* intWalker;
        
public:
            
static Walker* GetWalker(ObjectHandle* handle)
        };

        Walker
* WalkerSelector::GetWalker(ObjectHandle* handle)
        {
            ObjectType type
=Describer::GetType(handle);
            
switch(type)
            {
            
case objectINT:
                
return intWalker;
            
default:
                
throw "handle類型出錯";
            }
        }

      GC里Mark的實現就顯得非常容易了。  

        void GC::Mark(ObjectHandle* handle)
        {
            WalkerSelector::GetWalker(handle)
->WalkObject(handle);
        }

2. 內存縮并

      內存縮并可以解決內存碎片的問題,垃圾收集器的工作機制中已經提過。本文主要針對其具體算法和實現。這里我們先明確一下,如果是對第n代進行垃圾收集,那么意味著第0-n代都會進行操作。假設我們只有3代,如果是對第2代進行垃圾收集,那么存活對象就不需要進行提升;反之,如果是第0代或第1代的存活對象,則需要對其進行提升。所以我們的討論分兩種情況。(下圖紅色區域表示存活對象,藍色區域表示非存活對象,綠色區域表示已清掃到一起的空閑內存)

      對第0代或第1代進行垃圾收集:只需把存活對象提升到更高一代的空閑內存即可。

      對第2代進行垃圾收集:我們需要記錄FreeIndex和FreeCount,分別表示空閑內存的起始位置和大小。在掃描過程中,我們需要把存活對象往前移,把空閑內存往后移,具體如下圖:

      代碼實現如下:
        void SmallObjectHeap::Collect(const int generationIndex)
        {
            
for (int i=generationIndex; i>=0; i--)
            {
                
int count=ObjectHandles.ObjectHandleCount[i];
                ObjectHandles.Clear(i);
                
if (i==GenerationCount-1)    //對第2代進行收集
                {
                    
int FreeIndex=Generations[i].Start;        //空閑內存起始位置
                    int FreeCount=0;    //空閑內存大小
                    for (int j=0; j<count; j++)
                    {
                        ObjectHandle
* handle=ObjectHandles.Data[i][j];
                        
if (handle->Marked || handle->Type==handlePINNED)
                        {
                            
if (FreeCount) handle->Move(FreeIndex);
                            FreeIndex
+=handle->Size;
                            ObjectHandles.Add(handle, i);
                        }
                        
else FreeCount+=handle->Size;
                    }
                }
                
else    //對第0代或第1代進行收集
                {
                    
int FreeIndex=Generations[i+1].Start;
                    
for (int j=0; j<count; j++)
                    {
                        ObjectHandle
* handle=ObjectHandles.Data[i][j];
                        
if (handle->Marked || handle->Type==handlePINNED)
                        {
                            handle
->Move(FreeIndex);
                            FreeIndex
+=handle->Size;
                            ObjectHandles.Add(handle, i);
                        }
                    }
                }
            }
        }
posted on 2010-05-14 16:30 Lyt 閱讀(1630) 評論(2)  編輯 收藏 引用 所屬分類: 垃圾收集器

FeedBack:
# re: 稚嫩版垃圾收集器 之 具體實現(二)
2010-05-14 16:47 | Any
文中圖用什么畫的? 可否相告?  回復  更多評論
  
# re: 稚嫩版垃圾收集器 之 具體實現(二)
2010-05-14 16:49 | Lyt
@Any
Microsoft Office Word 2007  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩一级精品视频在线观看| 亚欧成人在线| 国色天香一区二区| 亚洲精品免费网站| 午夜免费电影一区在线观看 | 欧美一级二级三级蜜桃| 免费不卡在线视频| 欧美国产日本| 亚洲激情成人在线| 亚洲人成啪啪网站| 欧美激情一区二区三区蜜桃视频 | 亚洲精品国产日韩| 久久本道综合色狠狠五月| 一区二区在线看| 亚洲欧美成人| 久久精品综合| 亚洲国产成人av| 久久精品中文字幕一区二区三区| 国产精品久久久久久久久久三级| 亚洲伦理精品| 亚洲第一伊人| 欧美aa国产视频| 亚洲第一偷拍| 六月丁香综合| 欧美在线播放一区| 国产视频精品网| 欧美一区二区精品| 亚洲国产精品尤物yw在线观看| 亚洲无限乱码一二三四麻| 免费不卡亚洲欧美| 国内综合精品午夜久久资源| 欧美一区二区三区喷汁尤物| 亚洲国产成人91精品| 亚洲一区二区三区777| 免费久久99精品国产自| 亚洲成色www久久网站| 欧美一区二区在线免费观看| 亚洲欧洲日产国产网站| 欧美成人情趣视频| 国产日韩一区二区三区在线| 一区二区三区久久网| 国产精品久久久久久福利一牛影视| 国内免费精品永久在线视频| 久久激情五月婷婷| 99精品黄色片免费大全| 欧美日韩在线免费| 亚洲一级片在线观看| 一本色道**综合亚洲精品蜜桃冫 | 欧美大片免费久久精品三p| 亚洲国产成人一区| 亚洲国产天堂久久国产91| 欧美激情亚洲一区| 亚洲性夜色噜噜噜7777| 亚洲欧美日韩国产一区二区三区 | 久久成人免费日本黄色| 亚洲欧洲在线视频| 国产精品日韩一区二区三区| 亚洲国产精品成人精品| 亚洲综合精品四区| 亚洲一品av免费观看| 国产午夜精品一区二区三区视频 | 久久亚洲电影| 亚洲美女网站| 一区二区欧美在线| 亚洲国产色一区| 欧美午夜剧场| 久久国产精品一区二区三区| 久久青青草原一区二区| 亚洲一级在线观看| 久久国产精品久久久久久电车| 亚洲国产另类精品专区| 亚洲免费观看高清完整版在线观看熊 | 亚洲欧美日本在线| 黄色日韩精品| 亚洲国产黄色| 国产情人节一区| 亚洲国产美女| 国产综合自拍| 亚洲最黄网站| 一区在线免费观看| 一本久道久久综合中文字幕| 国模套图日韩精品一区二区| 亚洲精品精选| 在线看不卡av| 亚洲一区二区三区在线| 最新亚洲一区| 欧美中在线观看| 亚洲一区精品视频| 蜜臀久久99精品久久久久久9| 亚洲欧美日韩第一区| 欧美剧在线免费观看网站| 久久这里有精品15一区二区三区| 欧美午夜一区| 亚洲国产精品视频一区| 国产精品久久久久久久久久久久| 久久大香伊蕉在人线观看热2| 久久精品一区中文字幕| 销魂美女一区二区三区视频在线| 欧美在线电影| 亚洲人永久免费| 亚洲视频在线免费观看| 亚洲久久在线| 欧美jjzz| 欧美激情精品久久久六区热门| 国产欧美日韩免费看aⅴ视频| 性欧美办公室18xxxxhd| ●精品国产综合乱码久久久久| 亚洲桃色在线一区| 99精品久久久| 欧美黑人在线播放| 欧美aⅴ一区二区三区视频| 国产日韩欧美亚洲一区| 亚洲——在线| 午夜精品久久久久久久久| 欧美日韩精品免费看| 亚洲娇小video精品| 亚洲精品影院在线观看| 欧美成人精品在线观看| 亚洲电影视频在线| 亚洲人成7777| 欧美女同在线视频| 99re热这里只有精品免费视频| 日韩亚洲国产欧美| 毛片一区二区三区| 久久人人爽人人爽爽久久| 国产精品视频免费在线观看| 欧美激情一区二区| 一本色道久久综合亚洲精品婷婷| 久久国产精品久久w女人spa| 亚洲综合国产| 国产伦精品一区二区三区视频黑人| 亚洲一区二区三区午夜| 欧美在线你懂的| 伊人精品久久久久7777| 蜜臀99久久精品久久久久久软件| 免费久久99精品国产自| 亚洲国产小视频在线观看| 欧美激情导航| 一区二区三区精品国产| 欧美在线网址| 亚洲二区视频| 欧美精品国产| 亚洲影院污污.| 免费观看成人www动漫视频| 午夜精品视频在线观看| 欧美一区二区三区视频| 国产一区二区三区高清在线观看| 亚洲自拍偷拍一区| 亚洲综合色在线| 韩国av一区二区三区在线观看| 看片网站欧美日韩| 中文日韩在线| 欧美成人免费在线| 亚洲午夜视频在线观看| 欧美日韩亚洲一区二| 亚洲欧美日产图| 亚洲高清在线播放| 久久av在线| 99re66热这里只有精品3直播| 欧美午夜视频| 久久亚洲欧美| 中文精品视频| 欧美高清视频在线观看| 亚洲素人在线| 亚洲国产精品成人一区二区| 国产精品av久久久久久麻豆网| 久久www免费人成看片高清 | 亚洲欧洲精品成人久久奇米网| 午夜精品久久久久久久99樱桃| 亚洲国产成人在线| 国产精品男女猛烈高潮激情| 免费视频一区二区三区在线观看| 亚洲一区在线免费| 亚洲精品在线二区| 欧美护士18xxxxhd| 99精品福利视频| 亚洲精品视频一区| 久久亚洲图片| 久久成人精品无人区| 一本色道久久99精品综合 | 亚洲欧洲精品一区二区三区波多野1战4| 欧美成人综合在线| 亚洲欧美日韩一区在线观看| 亚洲精品日韩精品| 亚洲国产精品t66y| 极品裸体白嫩激情啪啪国产精品| 国产精品国产三级国产aⅴ浪潮 | 久久久精品午夜少妇| 欧美亚洲综合网| 欧美一区二区三区精品电影| 亚洲欧美一区二区视频| 午夜一区在线| 久久久噜噜噜久久人人看| 久久综合激情| 欧美精品电影在线| 国产精品分类| 国产精品视频yy9099| 国产在线欧美日韩| 亚洲人成在线观看| 亚洲一区二区三区久久|