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

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

      已經(jīng)講述過垃圾收集器的工作機(jī)制總體實(shí)現(xiàn)了,這篇文章主要針對(duì)標(biāo)記和內(nèi)存縮并進(jìn)行具體闡述。

1. 標(biāo)記

      我們知道,標(biāo)記存活對(duì)象是為了識(shí)別出垃圾,依靠對(duì)所有存活對(duì)象進(jìn)行一次全局遍歷來確定哪些內(nèi)存可以回收。這個(gè)遍歷從根出發(fā),利用相互引用關(guān)系,標(biāo)記所有存活對(duì)象,除此之外,其他內(nèi)存就是垃圾。這里強(qiáng)調(diào)下,標(biāo)記并不會(huì)沿著已經(jīng)被標(biāo)記的單元追蹤下去,這確保了標(biāo)記能夠終止。

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

      上文提到,我們會(huì)為每個(gè)對(duì)象類型寫自己的遍歷方法,這里我們將這件事封裝在Walker里。Walker提供接口,具體的對(duì)象類型可以繼承并實(shí)現(xiàn)之,這里用整型對(duì)象類型,即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;
            }
        };
      自然地,我們還需要根據(jù)ObjectHandle的對(duì)象類型來選擇不同的Walker,這里把它封裝在WalkerSelector里。
        enum ObjectType        //對(duì)象類型
        {
            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類型出錯(cuò)";
            }
        }

      GC里Mark的實(shí)現(xiàn)就顯得非常容易了。  

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

2. 內(nèi)存縮并

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

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

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

      代碼實(shí)現(xiàn)如下:
        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)    //對(duì)第2代進(jìn)行收集
                {
                    
int FreeIndex=Generations[i].Start;        //空閑內(nèi)存起始位置
                    int FreeCount=0;    //空閑內(nèi)存大小
                    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    //對(duì)第0代或第1代進(jìn)行收集
                {
                    
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 閱讀(1631) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 垃圾收集器

FeedBack:
# re: 稚嫩版垃圾收集器 之 具體實(shí)現(xiàn)(二)
2010-05-14 16:47 | Any
文中圖用什么畫的? 可否相告?  回復(fù)  更多評(píng)論
  
# re: 稚嫩版垃圾收集器 之 具體實(shí)現(xiàn)(二)
2010-05-14 16:49 | Lyt
@Any
Microsoft Office Word 2007  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久视频一区二区| 亚洲在线第一页| 亚洲欧洲日产国产网站| 欧美激情亚洲一区| 亚洲三级免费电影| 久久精品人人爽| 在线一区观看| 亚洲成人在线视频播放| 国产精品theporn| 欧美不卡一区| 久久爱www久久做| 亚洲综合精品一区二区| 一本色道久久综合一区| 欧美成人dvd在线视频| 久久久国产精品一区二区中文| 亚洲啪啪91| 艳女tv在线观看国产一区| 免费观看日韩| 亚洲三级免费观看| 亚洲激情午夜| 在线视频亚洲| 欧美天堂亚洲电影院在线观看 | 欧美一区二区三区另类| 亚洲承认在线| 亚洲午夜国产成人av电影男同| 黄色资源网久久资源365| 日韩一二在线观看| 欧美中文在线字幕| 久久免费视频这里只有精品| 久久精品国产亚洲一区二区三区| 免费欧美网站| 欧美在线你懂的| 久久综合国产精品| 国产精品国产三级国产专播精品人 | 一区二区三区四区蜜桃| 一本到高清视频免费精品| 一区二区三区国产| 国产精品久久久免费| 国语精品一区| 亚洲免费伊人电影在线观看av| 久久综合激情| 午夜日韩电影| 欧美日韩在线视频首页| 亚洲高清网站| 欧美xart系列高清| 欧美一区二区三区四区在线| 欧美日韩在线亚洲一区蜜芽| 亚洲直播在线一区| 亚洲伊人网站| 国产精品综合色区在线观看| 久久综合激情| 亚洲人成77777在线观看网| 久久高清一区| 浪潮色综合久久天堂| 亚洲高清不卡在线| 亚洲国产一区二区精品专区| 久久亚洲不卡| 99视频在线观看一区三区| 亚洲福利视频网| 欧美成人激情视频| 亚洲欧美成人精品| 一区二区三区四区五区视频| 国产乱码精品| 美脚丝袜一区二区三区在线观看| 久久国产精品一区二区三区四区| 日韩一区二区精品| 欧美影院精品一区| 亚洲第一精品久久忘忧草社区| 欧美国产第一页| 欧美日韩色婷婷| 久久成年人视频| 欧美精品三区| 久久偷看各类wc女厕嘘嘘偷窃| 欧美精品久久久久久久久老牛影院 | 久久精品二区亚洲w码| 亚洲国产另类久久久精品极度| 亚洲美女视频在线观看| 国产精品综合不卡av| 欧美高清视频www夜色资源网| 久久先锋影音av| 中文精品视频| 亚洲午夜精品17c| 午夜精品一区二区三区四区| 在线观看欧美成人| 欧美在线首页| 美女精品网站| 国产日韩精品一区二区三区| 亚洲一区免费看| 欧美一区二区免费视频| 欧美日韩少妇| 中文日韩在线视频| 亚洲无亚洲人成网站77777| 久久综合五月| 快播亚洲色图| 国模私拍一区二区三区| 久久男人资源视频| 亚洲电影在线观看| 亚洲福利视频网站| 欧美**字幕| 亚洲精品日韩欧美| av成人免费在线观看| 欧美日韩爆操| 欧美影院精品一区| 久久尤物视频| 亚洲精选中文字幕| 欧美午夜无遮挡| 午夜一区在线| 欧美大片一区二区| 中文精品一区二区三区| 国产噜噜噜噜噜久久久久久久久| 久久婷婷国产综合精品青草| 99精品国产在热久久婷婷| 久久免费国产精品| 国产精品99久久久久久久久| 精品福利电影| 国产精品视频在线观看| 久久国产精品久久久久久电车| 亚洲第一网站免费视频| 久久精品国产成人| 欧美v国产在线一区二区三区| 亚洲精品在线免费| 亚洲成在线观看| 亚洲欧美日韩综合国产aⅴ| 在线精品国产欧美| 国产欧美欧美| 国产精品五月天| 欧美日本中文| 美女任你摸久久| 久久午夜精品| 久久综合激情| 久久亚洲精选| 久久精品二区| 久久精品一区二区三区四区 | 欧美特黄a级高清免费大片a级| 韩日在线一区| 日韩一区二区电影网| 亚洲精品日本| 亚洲午夜电影在线观看| 在线亚洲电影| 亚洲欧美成人网| 欧美专区在线观看一区| 久久久久久夜| 亚洲国产精品一区二区www在线| 亚洲国产一区二区三区青草影视| 亚洲片国产一区一级在线观看| 日韩视频一区二区| 亚洲一区二区三区久久| 久久激情一区| 欧美午夜在线观看| 1769国内精品视频在线播放| 一区二区国产精品| 免费观看成人鲁鲁鲁鲁鲁视频| 最新国产乱人伦偷精品免费网站 | 久久精品国产在热久久 | 欧美裸体一区二区三区| 国产精品婷婷| 亚洲午夜av在线| 91久久在线| 国产精品va在线播放我和闺蜜| 亚洲成在人线av| 欧美sm重口味系列视频在线观看| 亚洲欧美激情视频在线观看一区二区三区| 欧美大片在线看| 99在线热播精品免费99热| 欧美激情一区二区三区在线| 蜜臀av一级做a爰片久久| 狠狠色综合网| 亚洲精品一区二区三区不| 亚洲视频精选| 亚洲乱码精品一二三四区日韩在线 | 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲另类自拍| 亚洲欧洲日本国产| 久久综合电影| 欧美一区二区成人| 久久xxxx精品视频| 国产伦精品免费视频| 欧美~级网站不卡| 香蕉久久精品日日躁夜夜躁| 国产精品成人国产乱一区| 亚洲一区二区三区四区视频| 日韩一区二区精品葵司在线| 一区二区三区高清不卡| 亚洲欧美视频一区| 欧美日韩精品二区第二页| 99热免费精品| 欧美亚洲日本一区| 欧美日韩国产在线观看| 亚洲欧美日韩精品久久亚洲区| 久久精品人人| 亚洲一区二区三区在线看| 在线一区亚洲| 亚洲精品视频在线| 久久精品av麻豆的观看方式| 亚洲一区国产视频| 欧美精品日韩综合在线| 亚洲欧美日韩国产综合| 国产精品久久久久久久久搜平片 | 欧美日韩精品一区视频| 免费观看欧美在线视频的网站|