<blockquote id="g5mpq"><rt id="g5mpq"></rt></blockquote>

    1. <pre id="g5mpq"></pre>
      <i id="g5mpq"><legend id="g5mpq"></legend></i>
      浪漫女家教主演:黛比地区:台湾 ,日本jiZz,爸爸的种子在线观看,特别的酒店2免费,哇嘎在线,荒野渔夫高清免费观看,新有菜在线免费观看,哇嘎美国
      網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

      Unity IL2CPP的GC原理

      0
      分享至


      【USparkle專欄】如果你深懷絕技,愛“搞點研究”,樂于分享也博采眾長,我們期待你的加入,讓智慧的火花碰撞交織,讓知識的傳遞生生不息!

      這是侑虎科技第1924篇文章,感謝作者Jamin發(fā)供稿。歡迎轉(zhuǎn)發(fā)分享,未經(jīng)作者授權(quán)請勿轉(zhuǎn)載。如果您有任何獨到的見解或者發(fā)現(xiàn)也歡迎聯(lián)系我們,一起探討。(QQ群:793972859)

      作者主頁:

      https://www.zhihu.com/people/liang-zhi-ming-70

      背景:前段時間在項目內(nèi)做了關(guān)于Mono內(nèi)存(堆內(nèi)存)的優(yōu)化。從結(jié)果上將Mono內(nèi)存從220MB降低到130MB,優(yōu)化過程中喚起了部分關(guān)于GC的消失的回憶,雖然實際的優(yōu)化工作中也許并用不到,但是更明確底層實現(xiàn)機制總歸是一件迭代自我的過程,在這里就來回顧一下。

      一、什么是垃圾回收 - GC(Garbage Collector)

      在游戲運行的時候,數(shù)據(jù)主要存儲在內(nèi)存中,當(dāng)游戲的數(shù)據(jù)在不需要的時候,存儲當(dāng)前數(shù)據(jù)的內(nèi)存就可以被回收以再次使用。內(nèi)存垃圾是指當(dāng)前廢棄數(shù)據(jù)所占用的內(nèi)存,垃圾回收(GC)是指將廢棄的內(nèi)存重新回收再次使用的過程。

      1. 什么時候觸發(fā)垃圾回收

      有三個操作會觸發(fā)垃圾回收:

      • 在堆內(nèi)存上進行內(nèi)存分配操作而內(nèi)存不夠的時候都會觸發(fā)垃圾回收來利用閑置的內(nèi)存。

      • GC會自動觸發(fā),不同平臺運行頻率不一樣。

      • GC被代碼強制執(zhí)行。

      2. GC操作帶來的問題

      直白點就兩個問題:一個是Stop-the-world導(dǎo)致的“卡”;一個是內(nèi)存碎片導(dǎo)致的“堆內(nèi)存太大”。

      • GC操作會需要大量的時間來運行,如果堆內(nèi)存上有大量的變量或者引用需要檢查,則檢查的操作會十分緩慢,這就會使得游戲運行緩慢。

      • GC可能會在關(guān)鍵時候運行,例如在CPU處于游戲的性能運行關(guān)鍵時刻,此時任何一個額外的操作都可能會帶來極大的影響,使得游戲幀率下降。

      • 另外一個GC帶來的問題是堆內(nèi)存的碎片。當(dāng)一個內(nèi)存單元從堆內(nèi)存上分配出來,其大小取決于其存儲的變量的大小。當(dāng)該內(nèi)存被回收到堆內(nèi)存上的時候,有可能使得堆內(nèi)存被分割成碎片化的單元。也就是說堆內(nèi)存總體可以使用的內(nèi)存單元較大,但是單獨的內(nèi)存單元較小,在下次內(nèi)存分配的時候不能找到合適大小的存儲單元,這也會觸發(fā)GC操作或者堆內(nèi)存擴展操作。

      • 堆內(nèi)存碎片會造成兩個結(jié)果:一個是游戲占用的內(nèi)存會越來越大;一個是GC會更加頻繁地被觸發(fā)。

      特別是在堆內(nèi)存上進行內(nèi)存分配時內(nèi)存單元不足夠的時候,GC會被頻繁觸發(fā),這就意味著頻繁在堆內(nèi)存上進行內(nèi)存分配和回收會觸發(fā)頻繁的GC操作。

      二、Unity托管堆

      在講具體的Unity GC機制之前再回顧一下Unity托管堆。

      1. 托管堆的工作原理及其擴展原因

      “托管堆”是由項目腳本運行時(Mono或IL2CPP)的內(nèi)存管理器自動管理的一段內(nèi)存。必須在托管堆上分配托管代碼中創(chuàng)建的所有對象。


      Unity官方文檔圖

      在上圖中,白框表示分配給托管堆的內(nèi)存量,而其中的彩色框表示存儲在托管堆的內(nèi)存空間中的數(shù)據(jù)值。當(dāng)需要更多值時,將從托管堆中分配更多空間。

      GC定期運行將掃描堆上的所有對象,將任何不再引用的對象標記為刪除。然后會刪除未引用的對象,從而釋放內(nèi)存。

      至關(guān)重要的是,Unity的垃圾收集是非分代的,也是非壓縮的。“非分代”意味著GC在執(zhí)行每遍收集時必須掃描整個堆,因此隨著堆的擴展,其性能會下降?!胺菈嚎s”意味著不會為內(nèi)存中的對象重新分配內(nèi)存地址來消除對象之間的間隙。


      內(nèi)存空隙

      上圖為內(nèi)存碎片化示例。釋放對象時,將釋放其內(nèi)存。但是,釋放的空間不會整合成為整個“可用內(nèi)存”池的一部分。位于釋放的對象兩側(cè)的對象可能仍在使用中。因此,釋放的空間成為其他內(nèi)存段之間的“間隙”(該間隙由上圖中的紅色圓圈指示)。因此,新釋放的空間僅可用于存儲與釋放相同大小或更小的對象的數(shù)據(jù)。

      這導(dǎo)致了內(nèi)存碎片化這個核心問題:雖然堆中的可用空間總量可能很大,但是可能其中的部分或全部的可分配空間對象之間存在小的“間隙”。這種情況下,即使可用空間總量高于要分配的空間量,托管堆可能也找不到足夠大的連續(xù)內(nèi)存塊來滿足該分配需求。


      如果分配了大型對象又沒有足夠的連續(xù)空間提供使用則:

      • 運行垃圾回收器,嘗試釋放空間來滿足分配請求。

      • 如果在GC運行后,仍然沒有足夠的連續(xù)空間來滿足請求的內(nèi)存量,則必須擴展堆。堆的具體擴展量視平臺而定。

      2. Unity托管堆的問題

      • Unity在擴展托管堆后不會經(jīng)常釋放分配給托管堆的內(nèi)存頁,防止再次發(fā)生大量分配時需要重新擴展堆。

      • 在大多數(shù)平臺上,Unity最終會將托管堆的空置部分使用的頁面釋放回操作系統(tǒng)。發(fā)生此行為的間隔時間是不確定的,不要指望靠這種方法釋放內(nèi)存。

      頻繁分配臨時數(shù)據(jù)給托管堆,這種情況通常對項目的性能極為不利。

      如果每幀分配1KB的臨時內(nèi)存,并且以60幀的速率運行,那么它必須每秒分配60KB的臨時內(nèi)存。在一分鐘內(nèi),這會在內(nèi)存中增加3.6MB的垃圾。對內(nèi)存不足的設(shè)備而言每分鐘3.6MB的垃圾也無法接受。

      三、Unity的GC機制 -- Boehm GC

      以前看過Unity使用的GC方案但最近才驚覺現(xiàn)在使用的Unity都是IL2CPP的版本了,所謂的Mono GC本來就已經(jīng)不存在了。于是來看下現(xiàn)在的IL2CPP的GC機制: Boehm GC(貝姆垃圾收集器)。

      1. IL2CPP - Boehm GC

      貝姆垃圾收集器是計算機應(yīng)用在C/C++語言上的一個保守的垃圾回收器(Garbage Collector),可應(yīng)用于許多經(jīng)由C\C++開發(fā)的程序中。

      摘錄一段定義:

      Boehm-Demers-Weiser garbage collector,適用于其它執(zhí)行環(huán)境的各類編程語言,包括了GNU版Java編譯器執(zhí)行環(huán)境,以及Mono的Microsoft .NET移植平臺。同時支援許多的作業(yè)平臺,如各種Unix操作系統(tǒng),微軟的操作系統(tǒng)(Microsoft Windows),以及麥金塔上的操作系統(tǒng)(Mac OS X),還有更進一步的功能,例如:漸進式收集(Incremental Collection),平行收集(Parallel Collection)以及終結(jié)語意的變化(Variety Offinalizersemantics)。

      在Unity中我們可以看到關(guān)于Boehm GC的算法部分:


      BoehmGC.cpp內(nèi)部調(diào)用的就是這個第三方庫,他是Stop-the-world類型的垃圾收集器,這表明了在執(zhí)行垃圾回收的時候,將會停止正在運行的程序,而停止時間的只有在完成工作后才會恢復(fù),所以這就導(dǎo)致了GC引起的程序卡頓峰值,很顯然這對游戲的平滑體驗造成了較大的負面影響。

      通常,解決這個問題的常規(guī)方案是盡可能地“減少”運行時垃圾回收(后續(xù)用GC代替),亦或者將GC放在不那么操作敏感的場景中,比如回城、死亡后等。但完全避免運行時垃圾回收在大部分時間是不現(xiàn)實的。

      接下來我們來看看Boehm GC的背后機制。

      2. Boehm GC算法思路

      Boehm GC是一種Mark-Sweep(標記-清掃)算法,大致思路包含了四個階段:

      • 準備階段:每個托管堆內(nèi)存對象在創(chuàng)建出來的時候會有一個關(guān)聯(lián)的標記位,來表示當(dāng)前對象是否被引用,默認為0。

      • 標記階段:從根內(nèi)存節(jié)點(靜態(tài)變量;棧;寄存器)出發(fā),遍歷掃描托管堆的內(nèi)存節(jié)點,將被引用的內(nèi)存節(jié)點標記為1。

      • 清掃階段:遍歷所有節(jié)點,將沒有被標記的節(jié)點的內(nèi)存數(shù)據(jù)清空,并且基于一定條件釋放。

      • 結(jié)束階段:觸發(fā)注冊過的回調(diào)邏輯。

      3. 漸進式GC

      使用漸進式GC允許把GC工作分成多個片,因此為了不讓GC工作長時間的“阻塞”主線程,將其拆分成了多個更短的中斷。需要明確的是這并不會使GC總體上變得更快,但是卻可以將工作負載分配到多幀來平緩單次GC峰值帶來的卡頓影響。

      注: Unity在高版本已經(jīng)默認是漸進式GC了,大概是Unity 19.1a10版本。

      [Unity 活動]-淺談Unity內(nèi)存管理_嗶哩嗶哩_bilibili


      https://www.bilibili.com/video/BV1aJ411t7N6/?vd_source=60173b91c5d0a0bed2ae426307dcc6b5

      4. GC中的內(nèi)存分配

      Boehm GC的使用方法非常簡單,只需要將malloc替換為GC_malloc即可,在此之后便無需關(guān)心free的問題。

      void * GC_malloc(size_t lb)
      {
      return GC_malloc_kind(lb, NORMAL);
      }


      void * GC_malloc_kind(size_t lb, int k)
      {
      return GC_malloc_kind_global(lb, k);
      }

      在整個內(nèi)存分配鏈的最底部,Boehm GC通過平臺相關(guān)接口來向操作系統(tǒng)申請內(nèi)存。為了提高申請的效率,每次批量申請4KB的倍數(shù)大小。

      分配器的核心是一個分級的結(jié)構(gòu),Boehm GC把每次申請根據(jù)內(nèi)存大小歸類成小內(nèi)存對象和大內(nèi)存對象。

      • 小內(nèi)存對象:不超過PageSize/2,小于2048字節(jié)的對象。

      • 大內(nèi)存對象:大于PageSize/2的對象。

      對于大內(nèi)存對象,向上取整到4KB的倍數(shù)大小,以整數(shù)的內(nèi)存塊形式給出。而小內(nèi)存對象則會先申請一個內(nèi)存塊出來,而后在這塊內(nèi)存上進一步細分為Small Objects,形成free-list。

      下面會分別說下大內(nèi)存對象和小內(nèi)存對象,參考網(wǎng)上的資料整理,確實有點點干,但是配圖我重新做了一下,大概可以輔助消化。

      四、IL2CPP - Boehm GC:小內(nèi)存分配

      1. 粒度對齊

      實現(xiàn)思路是,提出粒度(GRANULES)的概念,即一個GRANULE的大小是16字節(jié)。實際分配內(nèi)存的時候按照GRANULE為基本單位來分配。分配過程中,按照原始需要的大小,計算并映射得到實際需要分配的GRANULE個數(shù),代碼如下:

      //lb是原始的分配大小,lg是GRANULE(1~128)。
      size_t lg = GC_size_map[lb];

      例如需要18字節(jié)的內(nèi)存,則lg=2,即實際分配2個GRANULE(32字節(jié)),如果需要1字節(jié)的內(nèi)存,則lg=1,即實際分配1個GRANULE(16字節(jié))。

      GC_size_map是一個“GRANULE索引映射表”,用來維護原始分配的內(nèi)存大小和內(nèi)存索引之間的關(guān)系。最多可以返回128個GRANULE,所以小內(nèi)存的大小上限是128*16=2048。GC_size_map數(shù)組本身會不斷加載根據(jù)需要不斷擴容。


      示意

      2. 空閑鏈表 - ok_freelist

      決定了GRANULE的大小之后,在申請內(nèi)存時刻首先會從“空閑鏈表”中查看是否有空閑內(nèi)存塊,如果有則直接返回這塊內(nèi)存,完成分配,其算法維護了一個數(shù)據(jù)結(jié)構(gòu)obj_kind:

      struct obj_kind {
      void **ok_freelist;
      struct hblk **ok_reclaim_list;
      ...
      } GC_obj_kinds[3];

      GC_obj_kinds[3]對應(yīng)了3種內(nèi)存類型,分別是PTRFREE、NORMAL和UNCOLLECTABLE,每種類型都有一個obj_kind結(jié)構(gòu)體信息。

      PTRFREE:無指針內(nèi)存分配,明確的告訴GC,該對象內(nèi)無任何的指針信息,在GC時候無需查找該對象是否引用了其他對象。

      NORMAL:無類型的內(nèi)存分配,因為無法得到對象的類型元數(shù)據(jù),所以在GC時會按照只針對其的方式掃描內(nèi)存塊,如果通過了指針校驗,就會認為該對象引用了該指針地址指向的對象。

      UNCOLLECTABLE:為BOEHM自己分配的內(nèi)存,這些不需要標記和回收。

      每一個obj_kind的結(jié)構(gòu)體都維護了一個ok_freelist的二維指針鏈表用來存放空閑的內(nèi)存塊。ok_freelist維護了0~127個鏈表索引。而每一個尺寸的freelist就是對應(yīng)大小的GRANULE池子,其結(jié)構(gòu)示意如圖:


      freelist示意

      于是,根據(jù)要申請的內(nèi)存大小計算得到GRANULE在freelist的索引,然后去查詢對應(yīng)索引的freelist,如果存在空閑看空間ok_freelist[index][0],則將其返回并從鏈上移除。


      ok_freelist鏈表最初為空,如果ok_freelist中沒有相應(yīng)的空閑內(nèi)存塊,則調(diào)用GC_allocobj(lg, k)去底層查找可用的內(nèi)存。

      GC_allocobj的核心邏輯是調(diào)用GC_new_hblk(gran, kind)去底層內(nèi)存池獲取內(nèi)存,并且查看底層內(nèi)存池中是否分配了空閑的內(nèi)存塊,如果沒有則通過系統(tǒng)函數(shù)例如malloc分配內(nèi)存給底層內(nèi)存池,如果內(nèi)存池有,直接取出一塊返回。GC_new_hblk的代碼邏輯如下:

      GC_INNER void GC_new_hblk(size_t gran, int kind)
      {
      struct hblk *h; /* the new heap block */
      GC_bool clear = GC_obj_kinds[kind].ok_init;

      /* Allocate a new heap block */
      h = GC_allochblk(GRANULES_TO_BYTES(gran), kind, 0);
      if (h == 0) return;

      /* Build the free list */
      GC_obj_kinds[kind].ok_freelist[gran] =
      GC_build_fl(h, GRANULES_TO_WORDS(gran), clear,(ptr_t)GC_obj_kinds[kind].ok_freelist[gran]);
      }

      GC_new_hblk的主要邏輯有2步:

      1. 調(diào)用GC_allochblk方法進一步獲取內(nèi)存池中可用的內(nèi)存塊;

      2. 調(diào)用GC_build_fl方法,利用內(nèi)存池中返回的內(nèi)存塊構(gòu)建ok_freelist,供上層使用。

      3. 核心內(nèi)存塊鏈表GC_hblkfreelist

      底層內(nèi)存池的實現(xiàn)邏輯和ok_freelist類似,維護了一個空閑內(nèi)存塊鏈表的指針鏈表GC_hblkfreeelist,但是和ok_freelist不同的是,這個鏈表中的內(nèi)存塊的基本單位是4KB,也就是一個內(nèi)存頁(page_size)的大小。GC_hblkfreelist一個有60個元素,每一個元素都是一個鏈表。

      4. 內(nèi)存塊 - hblk、頭信息 - hblkhdr

      鏈表中的每一個內(nèi)存塊都以大小4096(4KB)為一基本單位,一個大小為4096的內(nèi)存塊被稱為hblk,數(shù)據(jù)定義如下:

      struct hblk {
      char hb_body[HBLKSIZE]; //HBLKSIZE=4096
      };

      每個hblk擁有一個相應(yīng)的header信息,用來描述這個內(nèi)存快的情況,數(shù)據(jù)的定義如下:

      //頭部信息
      struct hblkhdr {
      struct hblk * hb_next; //指向下一個hblk
      struct hblk * hb_prev; //指向上一個hblk
      struct hblk * hb_block; //對應(yīng)的hblk
      unsigned char hb_obj_kind; //kink類型
      unsigned char hb_flags; //標記位
      word hb_sz; //如果給上層使用,則表示實際分配的單位,如果空閑,則表示內(nèi)存塊的大小
      word hb_descr;
      size_t hb_n_marks;//標記位個數(shù),用于GC
      word hb_marks[MARK_BITS_SZ]; //標記為,用于GC
      }


      5. hblk內(nèi)存塊查詢

      structh blk *GC_allochblk(size_t sz, int kind, unsigned flags/* IGNORE_OFF_PAGE or 0 */)
      {
      ...
      //1.計算需要的內(nèi)存塊大小
      blocks_needed = OBJ_SZ_TO_BLOCKS_CHECKED(sz);
      start_list = GC_hblk_fl_from_blocks(blocks_needed);

      //2.查找精確的hblk內(nèi)存塊
      result = GC_allochblk_nth(sz, kind, flags, start_list, FALSE);
      if (0 != result) return result;

      may_split = TRUE;
      ...
      if (start_list < UNIQUE_THRESHOLD) {
      ++start_list;
      }
      //3.從更大的內(nèi)存塊鏈表中找
      for (; start_list <= split_limit; ++start_list) {
      result = GC_allochblk_nth(sz, kind, flags, start_list, may_split);
      if (0 != result) break;
      }
      return result;
      }

      STATIC int GC_hblk_fl_from_blocks(word blocks_needed)
      {
      if (blocks_needed <= 32) return blocks_needed;
      if (blocks_needed >= 256) return (256-32)/8+32;
      return (blocks_needed-32)/8+32;
      }

      先根據(jù)上層需要分配的內(nèi)存大小計算出需要的內(nèi)存塊大小,如果申請的大小小于4096字節(jié),則結(jié)果是1,對于小對象內(nèi)存塊的個數(shù)就是1。

      根據(jù)實際需要的內(nèi)存塊數(shù),判斷并決定從哪一個GC_hblkfreelist鏈表查找,start_list是開始查找的鏈表index,即從GC_hblkfreelist[start_list]開始查找。并不是需要blocks,就一定會從GC_hblkfreelist[blocks]的鏈表中查找,遵循轉(zhuǎn)換規(guī)則(小內(nèi)存索引是連續(xù)的,中內(nèi)存索引是32+8的步長,大點的內(nèi)存索引都是60)。

      • 如果blocks_needed小于32,則startlist=blocks_needed,直接去GC_hblkfreelist[blocks_needed]中查找。

      • 如果blocks_needed位于32~256,則startlist=(blocks_needed-32)/8+32,即blocks_needed每增加8個,對應(yīng)GC_hblkfreelist[index]的index增加1。

      • 如果blocks_needed大于256,則都從GC_hblkfreelist[60]鏈表中查找。

      決定從哪個鏈表開始查找之后,首先進行精確查找,如果直接找到,則直接返回找到的內(nèi)存塊。

      如果精準查找失敗,則逐漸增大start_list,從更大的內(nèi)存塊鏈表中查找。

      STATIC struct hblk *GC_allochblk_nth(size_t sz, int kind, unsigned flags, int n, int may_split)
      {
      struct hblk *hbp;
      hdr * hhdr;
      struct hblk *thishbp;
      hdr * thishdr;/* Header corr. to thishbp */
      //計算需要分配的內(nèi)存塊大小
      signed_word size_needed = HBLKSIZE * OBJ_SZ_TO_BLOCKS_CHECKED(sz);


      //從鏈表中查找合適的內(nèi)存塊
      for (hbp = GC_hblkfreelist[n];; hbp = hhdr -> hb_next) {
      signed_word size_avail;
      if (NULL == hbp) return NULL;
      //獲取內(nèi)存塊的header信息
      GET_HDR(hbp, hhdr);
      //內(nèi)存塊大小
      size_avail = (signed_word)hhdr->hb_sz;
      if (size_avail < size_needed) continue;
      //可用內(nèi)存大于需要的分配的大小
      if (size_avail != size_needed) {
      //要求精準不分割,退出循環(huán),返回空
      if (!may_split) continue;
      ...
      if( size_avail >= size_needed ) {
      ...
      //分割內(nèi)存塊,修改鏈表
      hbp = GC_get_first_part(hbp, hhdr, size_needed, n);
      break;
      }
      }
      }
      if (0 == hbp) return0;
      ...
      //修改header信息
      setup_header(hhdr, hbp, sz, kind, flags)
      ...
      return hbp;
      }

      當(dāng)分配字節(jié)的時候先通過精確查找如果發(fā)現(xiàn)有精確內(nèi)存,則會返回相應(yīng)的內(nèi)存塊,如果沒有發(fā)現(xiàn)精確內(nèi)存則會去查找更大的內(nèi)存塊并進行分割,一半返回使用,一半放到池子里。


      拆分示意

      如上圖示例,如果要申請1KB,則會先找4KB,如果沒有4KB則去找8KB,找到了8KB就進行兩個4KB的拆分,然后移除8KB出池子,再把拆分過的另一半4KB內(nèi)存塊加入到池子里:

      STATIC struct hblk *GC_get_first_part(struct hblk *h, hdr *hhdr, size_t bytes, int index) {
      word total_size = hhdr -> hb_sz;
      struct hblk * rest;
      hdr * rest_hdr;
      //從空閑鏈表刪除
      GC_remove_from_fl_at(hhdr, index);
      if (total_size == bytes) return h;
      //后半部分
      rest = (struct hblk *)((word)h + bytes);
      //生成header信息
      rest_hdr = GC_install_header(rest);
      //內(nèi)存塊大小
      rest_hdr -> hb_sz = total_size - bytes;
      rest_hdr -> hb_flags = 0;
      ...
      //加入相應(yīng)的空閑鏈表
      GC_add_to_fl(rest, rest_hdr);
      }

      6. 內(nèi)存塊分配

      如果GC_hblkfreelist空閑鏈表中找不到合適的內(nèi)存塊,則考慮從系統(tǒng)開辟一段新的內(nèi)存,并添加到GC_hblkfreelist鏈表中。在GC_expand_hp_inner方法中實現(xiàn):

      GC_INNER GC_bool GC_expand_hp_inner(word n)
      {
      ...
      //調(diào)用系統(tǒng)方式開辟內(nèi)存
      space = GET_MEM(bytes);
      //記錄內(nèi)存地址和大小
      GC_add_to_our_memory((ptr_t)space, bytes);
      ...
      //添加到GC_hblkfreelist鏈表中
      GC_add_to_heap(space, bytes);
      ...
      }

      GC_add_to_heap方法將創(chuàng)建出來的內(nèi)存塊加入相應(yīng)的GC_hblkfreelist鏈表中。同時加入一個全局的存放堆內(nèi)存信息的數(shù)組中。

      其中如果發(fā)現(xiàn)內(nèi)存連續(xù)的前后內(nèi)存塊存在且空閑,則合并前后的內(nèi)存塊,生成一個更大的內(nèi)存塊。

      7. ok_freeList

      在GC_new_hblk中調(diào)用GC_build_fl方法構(gòu)建鏈表,就是這個GC系統(tǒng)的緩存池核心數(shù)據(jù)結(jié)構(gòu)。

      //構(gòu)建ok_freelist[gran]
      GC_obj_kinds[kind].ok_freelist[gran] = GC_build_fl(h, GRANULES_TO_WORDS(gran), clear,(ptr_t)GC_obj_kinds[kind].ok_freelist[gran]);

      GC_INNER ptr_t GC_build_fl(struct hblk *h, size_t sz, GC_bool clear,
      ptr_t list) {
      word *p, *prev;
      word *last_object;/* points to last object in new hblk*/
      ...
      //構(gòu)建鏈表
      p = (word *)(h -> hb_body) + sz;/* second object in *h*/
      prev = (word *)(h -> hb_body);/* One object behind p*/
      last_object = (word *)((char *)h + HBLKSIZE);
      last_object -= sz;
      while ((word)p <= (word)last_object) {
      /* current object's link points to last object */
      obj_link(p) = (ptr_t)prev;
      prev = p;
      p += sz;
      }
      p -= sz;

      //拼接之前的鏈表
      *(ptr_t *)h = list;
      //返回入口地址
      return ((ptr_t)p);
      }

      以4096字節(jié)的內(nèi)存塊劃分為16字節(jié)單元的freeList為例,步驟如下:

      1. 4096字節(jié)按照16字節(jié)分配,劃分為256個小內(nèi)存塊,編號是0~255,將最后一個內(nèi)存塊(255)作為新鏈表的首節(jié)點。

      2. 內(nèi)存地址向前遍歷,建立鏈表,即255的下一個節(jié)點是254,尾節(jié)點是0。

      3. 將尾節(jié)點的下一個節(jié)點指向原鏈表的首地址。

      4. 將新鏈表的首節(jié)點地址作為ok_freelist[N],N是上文提到的GRANULE,例如16字節(jié)對應(yīng)1。

      重建好的freeList,并將首節(jié)點提供給上層使用。

      五、Boehm GC:大內(nèi)存分配

      分配大內(nèi)存對象是指分配的內(nèi)存大于2048字節(jié)。

      OBJ_SZ_TO_BLOCKS用于計算需要的hblk內(nèi)存塊的個數(shù),對于大內(nèi)存,需要的個數(shù)大于等于1。例如需要分配9000字節(jié)的內(nèi)存,則需要3個hblk內(nèi)存塊,然后調(diào)用GC_alloc_large分配內(nèi)存。

      GC_INNER ptr_t GC_alloc_large(size_t lb, int k, unsigned flags)
      {
      struct hblk * h;
      word n_blocks;
      ptr_t result;
      ...
      n_blocks = OBJ_SZ_TO_BLOCKS_CHECKED(lb);
      ...
      //分配內(nèi)存
      h = GC_allochblk(lb, k, flags);
      ...
      //分配失敗,系統(tǒng)分配內(nèi)存塊后繼續(xù)嘗試分配
      while (0 == h && GC_collect_or_expand(n_blocks, flags != 0, retry)) {
      h = GC_allochblk(lb, k, flags);
      retry = TRUE;
      }
      //記錄大內(nèi)存創(chuàng)建大小
      size_t total_bytes = n_blocks * HBLKSIZE;
      ...
      GC_large_allocd_bytes += total_bytes;
      ...
      result = h -> hb_body;
      //返回內(nèi)存地址
      return result;
      }

      大內(nèi)存分配的內(nèi)存查找和小對象方式一樣,會不斷增加start_list。從更大的鏈表中查找是否有空閑內(nèi)存,不同的是,如果查找到了空閑內(nèi)存不會分裂構(gòu)建ok_freeList鏈表而是直接返回大內(nèi)存塊的地址提供使用。

      六、Boehm GC:內(nèi)存分配流程圖


      示意

      七、額外:SGen GC

      Simple Generational Garbage Collection簡稱SGen GC,是相比Boehm GC(貝姆GC)更為先進的一種GC方式。官方Mono在2.8版本中增加了SGen GC,但默認的仍是Boehm GC。3.2版本之后,Mono正式將SGen GC作為默認GC方式。

      SGen GC將堆內(nèi)存分為初生代(Nursery)和舊生代(Old Generation)兩代進行管理,并包含兩個GC過程:Minor GC對初生代進行清理;Major GC對初生代和舊生代同時進行清理。

      1. 內(nèi)存分配策略 - 初代

      在SGen GC中,初生代是一塊固定大小的連續(xù)內(nèi)存,默認為4MB,可以通過配置修改。這一點與G1不同,在G1中同一代的Region在物理上是不要求連續(xù)的。

      為了支持多線程工作,新對象的內(nèi)存分配依然在每個線程的TLAB中進行,當(dāng)前每個TLAB均為4KB,有提到可能會在不久后進行優(yōu)化。而在TLAB內(nèi)部,內(nèi)存分配是通過指針碰撞的方式進行的,也就是說,在SGen GC中,初生代內(nèi)存并沒有進行粒度劃分也沒有分塊管理。

      初生代對象跟隨Minor GC和Major GC進行回收。

      2. 內(nèi)存分配策略 - 舊代

      在SGen GC中,舊生代內(nèi)存劃分方式可以概括為:

      Section(1MB) → Block(16KB)→ Page(4KB)→ Slot(不同粒度)

      在使用內(nèi)存時,按照上述鏈條依次向下拆分,與貝姆GC相同,同一個Block中的Page也只能拆分成相同粒度的Slot。

      雖然在初生代中并沒有劃分內(nèi)存粒度,但是當(dāng)對象從初生代轉(zhuǎn)移到舊生代時會找到對應(yīng)粒度的Slot進行存儲。釋放對象時,對應(yīng)的Slot也會返還給空閑鏈表(類似貝姆GC中的ok_freeList),并在某一級結(jié)構(gòu)完全清空時依次向上一級返還

      舊生代內(nèi)存最終是通過一個GCMemSection結(jié)構(gòu)的鏈表進行管理的。

      3. 內(nèi)存分配策略 - 大對象

      超過8KB的對象均被視為大對象,大對象通過單獨的LOSSection結(jié)構(gòu)進行管理。而大對象的內(nèi)存管理又分為兩種情況:

      • 不超過1MB的,仍然存儲在Mono自己的托管堆上,清理后返還給托管堆;

      • 超過1MB的,直接從操作系統(tǒng)申請內(nèi)存,清理后內(nèi)存也同樣返還給操作系統(tǒng)。

      4. 內(nèi)存分配策略 - 固定內(nèi)存對象

      有一些對象被顯式或隱式地標記為了固定內(nèi)存的對象,這些對象在初始時依然被分配在初生代中,但不會被GC過程移動位置。

      • 顯式:用戶顯式聲明的,比如通過fixed關(guān)鍵字進行修飾;

      • 隱式:在GC開始時,所有寄存器和ROOT中直接指向的對象都視為固定內(nèi)存對象。

      文末,再次感謝Jamin 的分享, 作者主頁:https://www.zhihu.com/people/liang-zhi-ming-70, 如果您有任何獨到的見解或者發(fā)現(xiàn)也歡迎聯(lián)系我們,一起探討。(QQ群: 793972859 )。

      近期精彩回顧

      特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關(guān)推薦
      熱點推薦
      突發(fā)訃告:著名作曲家,凌晨去世

      突發(fā)訃告:著名作曲家,凌晨去世

      南方都市報
      2026-07-18 10:37:11
      李顯龍直言不諱地告誡國民:每一個新加坡人都必須明白,本國堅決不承認“華人國家”身份,背后藏著的是全亞洲最為驚心動魄的生存考量

      李顯龍直言不諱地告誡國民:每一個新加坡人都必須明白,本國堅決不承認“華人國家”身份,背后藏著的是全亞洲最為驚心動魄的生存考量

      橙色書卷
      2026-07-16 21:35:45
      我國越來越多的人患腦梗?醫(yī)生建議:停止食用“8物”,保護大腦

      我國越來越多的人患腦梗?醫(yī)生建議:停止食用“8物”,保護大腦

      路醫(yī)生健康科普
      2026-07-18 04:20:03
      智商3歲“天才指揮家”舟舟,繁華逝去,謊言過后又是怎樣的人生

      智商3歲“天才指揮家”舟舟,繁華逝去,謊言過后又是怎樣的人生

      感恩每一刻
      2026-07-17 03:54:55
      玄學(xué)提醒:九件舊物別隨便送人,看似大方,實則悄悄送走自家福氣

      玄學(xué)提醒:九件舊物別隨便送人,看似大方,實則悄悄送走自家福氣

      寶哥精彩賽事
      2026-07-18 11:54:38
      黃秋生深夜賣慘告別香港!路是自己走死,網(wǎng)友:絕不挽留

      黃秋生深夜賣慘告別香港!路是自己走死,網(wǎng)友:絕不挽留

      阿廢冷眼觀察所
      2026-07-17 08:02:38
      沈音明星夫婦雙雙去世!系沈陽暴雨所致,家里地下室灌水,倆人動手清理,意外觸電身亡

      沈音明星夫婦雙雙去世!系沈陽暴雨所致,家里地下室灌水,倆人動手清理,意外觸電身亡

      火山詩話
      2026-07-17 17:14:19
      玥兒近照曝光,葛斯齊當(dāng)場愣?。哼@哪是同一個孩子?

      玥兒近照曝光,葛斯齊當(dāng)場愣?。哼@哪是同一個孩子?

      情感大頭說說
      2026-07-18 02:04:12
      他被開除黨籍、取消退休待遇

      他被開除黨籍、取消退休待遇

      錫望
      2026-07-17 17:08:49
      快訊!伊朗傳來新消息!

      快訊!伊朗傳來新消息!

      有態(tài)度的何總
      2026-07-18 11:20:10
      大膽預(yù)測!世界杯決賽阿根廷對陣西班牙,阿根廷大勝,理由有四點

      大膽預(yù)測!世界杯決賽阿根廷對陣西班牙,阿根廷大勝,理由有四點

      江啟
      2026-07-18 09:38:32
      53歲袁立家中辦康復(fù)派對!瘦脫相還又跳又唱,屋內(nèi)裝修老土太樸素

      53歲袁立家中辦康復(fù)派對!瘦脫相還又跳又唱,屋內(nèi)裝修老土太樸素

      動物奇奇怪怪
      2026-07-16 14:51:53
      僅大16歲,老少戀的“殘酷”,為何在64歲馬蘭身上體現(xiàn)的淋漓盡致

      僅大16歲,老少戀的“殘酷”,為何在64歲馬蘭身上體現(xiàn)的淋漓盡致

      胡一舸南游y
      2026-07-17 14:43:48
      體制內(nèi)人員充當(dāng)“內(nèi)鬼”,在自媒體賬號上以“掛簡歷”等方式“預(yù)告”官員落馬,夸大、炒作貪腐情節(jié),并靠此賺錢,辦案人員披露→

      體制內(nèi)人員充當(dāng)“內(nèi)鬼”,在自媒體賬號上以“掛簡歷”等方式“預(yù)告”官員落馬,夸大、炒作貪腐情節(jié),并靠此賺錢,辦案人員披露→

      吉刻新聞
      2026-07-18 10:42:58
      宣布退賽,鄭欽文2-0輸球后,做出新決定,調(diào)整狀態(tài),沖北美1000級賽!

      宣布退賽,鄭欽文2-0輸球后,做出新決定,調(diào)整狀態(tài),沖北美1000級賽!

      寶哥精彩賽事
      2026-07-18 10:23:25
      55歲再婚大媽哭訴:再婚后毛都沒有了,真的不想要這樣的婚姻了

      55歲再婚大媽哭訴:再婚后毛都沒有了,真的不想要這樣的婚姻了

      拾代談生活
      2026-07-18 10:36:04
      LV起訴日用百貨小店引熱議!網(wǎng)友:老板不在乎輸贏,搞出動靜來給法國人看,業(yè)績不好是仿造品太多

      LV起訴日用百貨小店引熱議!網(wǎng)友:老板不在乎輸贏,搞出動靜來給法國人看,業(yè)績不好是仿造品太多

      火山詩話
      2026-07-18 10:55:52
      高市早苗白忙一場:25國代表齊聚上海,中國的貴客們都到了!

      高市早苗白忙一場:25國代表齊聚上海,中國的貴客們都到了!

      遁走的兩輪
      2026-07-17 17:54:08
      比李亞鵬還慘!鄒市明直播雙目無神,網(wǎng)友喊話冉瑩穎別再逼他,成龍早年說的話被應(yīng)驗了

      比李亞鵬還慘!鄒市明直播雙目無神,網(wǎng)友喊話冉瑩穎別再逼他,成龍早年說的話被應(yīng)驗了

      一盅情懷
      2026-07-17 14:09:12
      美國發(fā)出警告:中國不還100年前的舊債,美國絕不承認欠中國的錢

      美國發(fā)出警告:中國不還100年前的舊債,美國絕不承認欠中國的錢

      烏克蘭小靜
      2026-07-18 01:45:22
      2026-07-18 14:52:49
      侑虎科技UWA incentive-icons
      侑虎科技UWA
      游戲/VR性能優(yōu)化平臺
      1599文章數(shù) 987關(guān)注度
      往期回顧 全部

      科技要聞

      WAIC2026看什么?這份"不迷路"攻略請收好

      頭條要聞

      重慶山體崩塌 遇難者親人:他們撤出后站路邊被巖體推走

      頭條要聞

      重慶山體崩塌 遇難者親人:他們撤出后站路邊被巖體推走

      體育要聞

      德尚是非典型法國人 14年執(zhí)教留下豐厚遺產(chǎn)

      娛樂要聞

      大S給具俊曄留遺產(chǎn)是昏頭?實際上她清醒得很

      財經(jīng)要聞

      股民當(dāng)街砍博主!韓國股市 終極大屠殺

      汽車要聞

      把中國超跑賣到英國,比亞迪正在被世界看見

      態(tài)度原創(chuàng)

      時尚
      教育
      本地
      手機
      健康

      今年最好看的4種顏色,太適合夏天了!

      教育要聞

      小升初考試題,九宮格填數(shù)字

      本地新聞

      十年了,為什么鬼怪CP還能讓人美美嗑上?

      手機要聞

      開創(chuàng)智能手機新形態(tài)!榮耀Robot Phone正式開啟預(yù)約:8月發(fā)布

      刮痧也會刮出腦梗?講個真實案例

      無障礙瀏覽 進入關(guān)懷版 主站蜘蛛池模板: 男按摩师吸乳房HD中字| 爸爸播种电影免费观看高清版下载| 《Krista》菲律宾电影| 爱让我们在一起大结局| 渗透全集| 女超人Melody| 茅坑里的僵尸完整版| 天地情缘| SSSxxxx美国666| 《妻子8免费高清HD》 | 踏血寻梅| 男生和女生愁愁愁电视剧在线观看30分| 熊猫在线观看免费版| 常高兴的酸甜苦辣电视剧| 金牌销售的秘密3HD免费观看 | 《索命舞娘》| 圣水湖畔电视剧| 黑执事第二季在线观看| 葫芦丝演奏| 法国经典电影完整版免费观看| 澳大利亚霹雳舞0分| 龙王的工作| 《控制美女老板的遥控器》电影| 够劲吻住你短剧大结局免费观看| 战狼6在线观看完整版| 灵异侦缉档案2国语| 姐姐的朋友2在线| 非你莫属 潘石屹| 钢铁侠4在线观看免费版高清| 《最高的爱人诏》三上| 撕裂记忆体| 一路向西 主演| 法国《卖百科全书的女人》| 京华烟云 电视剧| 甄嬛传完整版免费观看| 小凤新婚下集精彩片段 | 甜美日系风| 《特别酒店》免费观看| 北非谍影免费| 《马向阳下乡记》电视剧| 四位少妇按摩记在线观看 | 巴厘岛的故事电视剧免费观看全集| 保罗莉娜黑白配电影免费观看| 东厂西厂短剧全集免费播放| 军人使命电视剧| 泡剧网最新电视剧大全免费| 希望计程车| 蜜桃成熟3d 高清版| 需要爸爸种子免费观看电视剧| 空姐前规则第二季| 丁度·巴拉斯电影全集| 安娜和拳王满天星| 大兵日记全集| 月光永不坠落短剧免费观看| 韩剧玻璃鞋| 乱世豪情电视剧| 哇嘎免费观看完整版视频| 奔跑吧兄弟第四季第七期| 烂赌夫斗烂赌妻粤语高清| 《高血压监狱》免费观看| 霜花店未删减版在线观看高清| 伦理法国护士完整版| 电视剧驻站免费观看| 束博游戏全集| 无尽动漫在线观看完整版| 荣誉守则在线观看免费版| 向涟苍士献上纯| 停不了的爱 刘德华| 一世清欢短剧在线观看| 小红帽满天星| 好兄弟把我给C了| 羔羊医生2国语版免费播放| 疯狂试爱荷尔蒙6| 陆小凤传奇绣花大盗| 灯草和尚2完整版普通话| 透视安吉拉怀特版| 夏夜的秘密泰剧免费播放全集| 行尸走肉第三季15集| 救世主电影免费观看在线| 电影奋斗| 色戒完整版| 华丽一族剧情| 致我们终将逝去的青春演员表| 淘气包马小跳全集| 寒战高清完整版| 金口诀测彩票| 义胆群英国语高清| 韩剧她很漂亮| 柳岩热舞| 陈列之家| 薛平贵与王宝钏54集| 韩剧《婚后的生活》 | 越南女兵电影完整版免费在线播放| 电影 蝙蝠| 男女一起愁愁电视剧免费播| 交换温柔韩国完整版| 芭比之时尚奇迹中文版全集| 需要爸爸播种籽2免费观看高清 | 按摩3一4| 夺帅国语高清| 贪婪:欲望之岛 电影| 萨迪1980满天星在线看| 阅兵式2015高清完整版 | 歌仔戏曲调| 北京杂种免费| 将军夫人:夫君护短全集免费| 阿尔法特种部队| 花之蛇2| 王牌逗王牌电影| 龙潭之战越南战争片正片| 淄博烧烤小店每日卖上万烤串| 国际风云电影完整版| 大耳图图动画片全集| 星球大战系列| 国风按摩院1-5季全部演员表| 最毒美人心2| 重生弃少短剧全集| 杰西壮志凌云2011全集| 银魂77| 高清江湖夜雨十年灯| 女超人HR板| 东成西就2011粤语| 玩偶姐姐陪玩第四部片尾BGM| 盛唐风流电影免费观看完整版国语-2019| 倩女幽魂| 最后一刻| 《内衣销售秘诀》电影| 琉璃电视剧全集在线观看正版| 战狼6大牛影库| 启示录2| 追在线观看| 爸爸播种籽2全集免费看| 坏蛋联盟电影完整版免费观看| 法国炸天小姐1984版| 湖南下了特大暴雪| 《爱在空气中特别篇》| 熟睡中被义子侵犯日本电影| 穿越火线下载 迅雷| 钢铁记忆| 法国空姐2008满天星法版:星辉照耀下| 小精灵动画片| 新妈妈2韩国电影| 隔壁邻居很美味日本伦理在线观看免费高清 | 《天海翼商务旅行》电影在线观看| 草在结它的种子| 黄曼巴罗伊| 《急诊护士》电影在线| 《早恋》| 《丰胸按摩理疗》在线观看| 鼓楼外短剧全集免费视频播放| 护士的秘密电外国| 非洲姑娘高清播放| 维修师傅的艳遇(无码片)| 迷人的保姆3线观高清| 哪里可以观看《V酒店第一季》?| u9免费看电影| 浪漫女家教免费完整电视剧在线观看 | 夫上司装饰全集观看| 珍馐记电视剧免费版在线观看| radio star 神话| 夫妻俱乐部在线观看| 高清《爱情人偶》| 银魂国语版全集| 需要爸爸种子免费观| 舍不得星星电视剧30集免费观看| adn-018| 《美丽妻子替丈夫还债》电影完整版| 竹夫人完整版| 复仇者联盟4在线观看| 银魂251| 风暴在线观看| 高清《现在不行》电影免费播放| 木府风云39集| 我的爸爸在吃我| 灵魂重生泰剧在线观看双男主| 玫瑰故事电视剧免费观看全集| 终极斗士3| 小敏家电视剧全集在线播放| 斗罗大陆免费观看视频| 倔强的驱魔师1-4集免费观看 | 李采潭在线观看| 非常大状粤语| 日本修理工的艳遇| 电视剧又见一帘幽梦| 爱在春天| 班杰明下海| 免费观看电影克莱尔的迷宫| 智取威虎山电影下载| 性感海滩3去码补丁| 《overflower》在线观看| 仁心俱乐部电视剧免费观看| 高清《女房客2》电影| 村妓2电影完整版| 一路上有你第一季| 明星的恋人电视剧| 《美丽妻子替丈夫还债》| 马永贞百度影音| 熊出没回家过年| 办法室定时器电影| 乳品分类| 女版捉鬼敢死队法国空姐| 金钱追杀令| 《部长出差的日子》电影| 韩剧疯狂的爱情| 电视剧三叉戟| 太极英雄电视剧| 小娘惹在线观看| 浙江卫视跨年演唱会直播| 许愿神龙免费观看完整版在线观看| 在异世界迷宫开后宫樱花无修版| 郑中基 无赖| 满江红电影免费观看高清| 女保险公司推销员8中字的特点| 湖滨花园酒店| 七个世界一个星球免费观看| 青梅竹马是消防员第一季完整版未打吗robl| 青青草原影视| 盲战安志杰在线观看完整版| 和部长一起去出差旅日本电影叫什么名字 | 换乐无穷国语| 台版1987渔夫荒野史记广告 | 电影《武状元苏乞儿》| 色情玉蒲之玉女心经电影| 女版战狼6在线观看免费| 电影蝎子| ps搭档| 村里的姑娘国语高清在线观看| 部长大人来家做客韩国在线播放| 广州火车站售票时间| 完美交换| 大兵的寝室电影| 电视剧幻影| 上错花轿嫁对郎优酷| 绿光森林全集| 美国私人女性监狱完整版观看免费| 高清《当哒当:邪视》电影| 笑傲江湖征战纵女| 杨玉环的三港版1996| real在线播放| 麻花MV在线看免费观看电视剧| 万界独尊无垢剑武魂小说| 《淫的方程式》动漫| 疯狂原始人免费看| 鬼父在线观看视频| 《《替夫还债3》HD中字》电影-高清完整版在线观看-JJ影院 | 猎屠电影在线| 《熟睡被义子侵犯电影| 小向まな美| 尼罗河的女儿| 《婚前的忠贞》电影免费观看| 借种在线观看中文字幕| 我是真的讨厌异地恋| 男按摩师韩剧| 尸兄第二季免费观看完整版| 特殊美容院的待遇1| 我的减肥日记| 哈尔滨花式宠爱南方小土豆| 屋顶上的吻| 向往的生活第7季| 男生女生一愁愁愁观看大片| 大城小事电视剧免费观看全集| 《特邀外卖员》完整版在线观看 | 母亲吃中药母乳喂养婴儿核酸转阴 | 男女在一起愁愁愁视频电视剧| 法医王妃全集免费| 生死线电视剧全集免费观看完整版| 微微一笑很倾城电影| 娃娃脸4在线观看免费观看电视剧 爸爸种子2电影在线播放 | 《因为遇见你》免费观看| 荒井小姐的秘密生活日剧全集 | 盲探免费| 南投县| 电影《香醇的绣感》女主| 仙剑奇侠传3 38集| 大侦探7免费观看完整版高清最新| 需要爸爸播种的| 猎罪行动电视剧免费播放| 美丽小蜜桃7免费播放全集电视剧| 千金赤子板栗无删减版百度云| 卖保险的女销售2| 大宅门全集完整版免费| 守望爱情| 星克莱尔在线观看| 第一集就开车的动画片| 百万巨鳄电影完整版| 《马上天下》电视剧| 美乃雀 在线观看播放| 功夫熊猫2电影| 不可撤销| 牙医姐妹日语版免费播| 无心法师全集| 哈哈梦show| 电影深海| 需要爸爸的种孑| 终结者1免费高清电影| 爱恋3d迅雷下载| 《部长出差的日子》| 《维修工》电影王李丹妮在线观看 | 博物馆奇妙夜2在线观看| 爱我几何剧情介绍| 春节起源于什么时期| 假面骑士REVICE第五集| 荷尔蒙6| 和尚的一场春梦完整版 | 欢喜冤家电影在线看| 家属1到5集第一季第五集免费观看| 功夫战警电视剧免费观看完整版| 解密电视剧| 白峰电影在线播放免费观看最新版| 百万新娘之真爱| 狙击蝴蝶电视剧免费观看完整版| 阴阳镇怪谈在线观看免费完整版 | 商道国语版| 按摩店的特殊待遇| 都挺好免费观看 | 张钰 录像| 《总统》星克莱尔1997年满天星在线观 | 部长来我家| 美食的俘虏110| 师娘她甜爆全师门短剧免费观看 | 学生伦姧女教师片在线观看| 情谜睡美人之欲望的姐妹| 动物世界老虎vs狮子| 妈妈的职业5韩| 没有玫瑰的花店下载| 乐游原电视剧40集全免费观看| 《三更2之饺子》电影| 《G点》1985欧美在线| 伯虎为卿狂国语| 藏珠短剧在线观看| 《特殊诊所》苍井空| 我叫赵甲第第二季电视剧| 热恋2015| 你的婚礼免费看| 毒医肥尸无删减在线播放第一季| 非传统浪漫关系未删减| 空姐4免费观看全集在线播放| 意大利电影此时此刻| 立体文眉| 鹿鼎记之神龙教| A片特邀外卖员| 斗罗大陆117集| 家庭教师剧场版国语| XL司令第二季高清无马赛版下载| 屋顶上的吻| 穿靴子的猫第二季国语版| 千王之王 周星驰| 魔形女满天星| 琥珀中发现古雏鸟| 你是我的花朵mv| 世仇爱恨:最终和解短剧全集| 朝国伦理影片需要父亲的种子| 《给我钱 第12季》未删减| 年轻的小姨子2中文| 你是我的氧气| 金银梅视频| 侃爷妻子或因穿着暴露坐牢| 超能力者| 公公的浮之手| 小小诊所完整版| 小凤新婚台湾版哪里能免费看| 高清恋爱恐惧症| 痛30集全播放免费观看 | 东北警察故事2021谢苗版| 家门的荣光央视版| 壮志凌云满天星在线观看完整免费高清英文叫什么 | 动漫《我的妈妈》日语第二集| 白峰电影版免费观看| 爷们儿电视剧免费完整版| 孤独摇滚动漫在线观看免费| 危情杜鹃| 女超人麦乐迪免费观看完整电影| 纵棠短剧演员表| 红十字:女人们的入伍通知单| 小岳岳相声| 漂亮的妈妈中字开头7个字| 逃学神探演员表| 小屁孩日记免费完整观看| 长津湖电影完整版免费观看| 武松蒋玲玲| 社长的妻子2电视剧免费| 大神同学想被吃掉未增删有翻译 | 粤语dj串烧| 美貌的社长夫人| 谭咏麟演唱会2012| 美版花样男子| 人生路不熟高清| 麦乐迪满天星| 新喜剧之王在线观看| 女儿的奶水| 韩剧 美妙人生| 《善良的大胸女学生| 苹果电影完整版在线观看未删减| 派出所的故事| 薛平贵与王宝钗| 3对1| 赌石之王:一刀穷一刀富短剧全集| 在异世界迷宫开宫口樱花| 万花开遍不及你归来短剧大结局| .奇怪的美容院2| 怦然心动电影| 功夫熊猫四| 八重神子拿黄瓜奖励| XL司令第一季免费全集在线观看| 乒乓球混合双打决赛直播| 华人城小说| 夏洛特烦恼完整版| 壮志凌云2011大人版影院| 难言1V4教学| 冰激凌怎么画最好看| 特邀送货员在线观看| 奇怪的美发沙拉龙中文配| 秘书激情办公室在线观看| 黑蝴蝶刘敏涛免费观看全集 | 美乃雀在线电影| 虎胆龙威5迅雷下载| 杨思敏1996版电视剧全集| 七年级上册英语人教版教学视频| 《迪拜的女孩2满天星》在线观看| 普京为何此时在盟国领土部署核武| 禁止的爱:善良的小峓在钱| 母亲完整版| 支配教坛动漫免费版| 海螺里吃出龙珠| 结城美沙| 罗小黑战记38集免费观看| 美国荷尔蒙六| 我的老公是卧底| 六扇门之双面人| 大侦探福尔摩斯1在线| 站着再来一次26集全在线观看 | 巜瑜伽室里的激情HD在线观看| 周弘电影在线观看免费| 女儿的妈妈| 奇星记之鲜衣怒马少年时 电视剧| 美容院3:特殊待遇| 黑巨痉大战饿罗斯美女| 尖东毒玫瑰| 仁心解码电视剧| 白色城堡电视剧免费观看| 洗手间的秘密2免费看 | 美国忌讳1~7| 美梦成真在线观看免费完整版| 青海花儿胡汉三| 罗家英onlyyou| 年经母年3| 帝国秘符| 韩剧那年冬天风在吹| 欢乐颂4免费观看| 波密县| xl司令在线观看免费高清全集有广告| 魔法老师第一季| 高清《人生第一次》在线观看| 24世纪性格爱情指南日韩 | 张警官三部曲 免费观看| 石狮影视论坛| 养个孩子不容易电视剧| 新兵正传| 欧美黑白配在线观看| 大宋探案局| 太空部队第二季| 黎明前的黑暗免费观看| 妻子8免费完整高清HD| 电影牙医姊妹完整版免费观看 | 天师下山全集免费| XL司令真人版无马赛| 早恋电影| 因为想你泰剧在线观看完整版免费| 《大兵的寝室》美剧免费观看| 姐妹兄弟3免费观看电视剧| 美洲杯赛程2021| 3d肉蒲团蓝燕| jizz日本| 木下檀檀子免费观看平台| 永远的君主免费观看| 意大利电影《忠贞》2| 漂亮的保姆6完整版在线播放| 日本伦理电影按摩视频四个女生按摩视频 | 喜羊羊与灰太狼心世界奇遇| 异动公告被取消?系误读| 儿子半夜猥琐妈妈| 星克莱尔《总统》在线 | 成龙历险记5| 漂亮小瘦子3| 支配的教坛未删减免费观看| 伍六七之记忆碎片 2024| 旖旎婚色短剧大结局免费观看全集 | 妈咪直播打扑克| 韩剧高清在线播放免费| 丈夫上司部长与妻子的相处之道| 大胸继拇5| 足称老婆八两夫| 月半爱丽丝电影完整版免费观看 | 老婆5| 弃女归家:家产归我短剧全集| 抓紧我放弃我电视剧| 与狼共舞电视剧| 丈夫不在一周七天我失去了理智 | 泰剧妒海主题曲| 世缘之舟泰剧在线观看| 《我家那小子2026》| 与部长出差的日子在线观看 | 一吻巴黎| 金装的维尔动画免费观看| 品味人生无憾坎贝奇完整版 | 莫妮卡贝鲁奇《地爆天星》电影无删减版在线观看| 拜托了老师全集| 破地狱粤语| 英雄崛起百度影音| 杰西简壮志凌云高清无删减 | 《黑白决》免费观看| 无颜之月迅雷下载| 战狼6欧洲少女完整版| 十七岁的天空插曲| 美人制造在线观看免费完整版 | 变形金刚2观看| 酒店1一5集在线观看免费| 韶华若锦电视剧| 嫂嫂宝库免费观看电视剧全部| 西西里159分钟无删减bt| 天海翼在线写真视频| 泰罗奥特曼国语动漫| 法国空乘5免费高清原声满天| 少林方世玉| 高清死人开关未删减| 《歼灭天际线》免费观看高清| 甜蜜偶像国语版| 黑寡妇 电影| 青之驱魔师第一季| 盛唐风流香港版观看| 美国式家庭禁忌电影在线观看| fate奇异赝品| 见好就收电视剧免费完整版| 古剑奇谭免费观看电视剧全集 | 落跑甜心全集电视剧大结局| 女律师替夫还债完整版 | 决战紫禁之巅在线观看完整版| 壹周立波秀2013集全集高清| 我比破军帅| 美景之屋6在线观看高清完整版 | 牛郎织女电影| 一夜丈夫 电视剧| 《白色橄榄树》全集观看| 男女一起愁愁愁全集下载| 假面骑士欧兹| 所有邪佞之人免费完整版| 监狱风云在线观看| 彰武县| 性的暴行2糟蹋女兵电影在线观看| 大红灯笼高高挂电影| 后来的我们短剧免费观看完整版| 霍比特人主题曲| 欧美战狼10电影免费完整版| xl号司令动漫第一季剧情| 红楼视频在线观看免费播放电视剧| 《我不是戏神》第一季在线观看全集 | 喜欢你时风好甜| 封神英雄2| 满天星《西部牛仔》| 银瓶梅免费电视剧| 以死亡游戏为生。全集观看| 电影《现在不行》完整观看免费 | 《完美无瑕》莫妮卡满天星| 莲花楼连续剧40集高清| 欢乐家长群第二季免费观看完整版| 金铁霖五大女高徒| 电视剧今生有你全集免费观看| 美辰之屋6| 速度与激4| 网络第一美女| 火箭军高层间谍是谁| 欲望和智慧电影| 369看妳懂的电影在线观看| 相识在线观看完整版高清| 野兽刑警| 开心宝贝5部| 战狼六欧美版在线观看| 公的浮之手中文字幕高清版 | 陈伟霆演的鸭的电影名字| 龙咁威2之皇母娘娘呢| 石屏县| 《女学生的滋味》HD电影嫩草影院| 太极英雄电视剧| 《导师》完整版免费观看高清电影| 玄心奥妙决| 女版战狼10在线观看免费高清9| 禁忌5在线看| 行尸走肉amc官方网络剧| 吞噬星空动漫在线观看39集| 电视剧借枪全集免费播放完整版| 爱丫爱丫免费国语高清在线看| 灭火宝贝2| 杀杀人跳跳舞| 长相思39集泄露版| 关于爱情的英文诗| 动感之星妖精135集免费观看视频| 战狼六欧式少女全部剧情| 爱情悠悠药草香演员表| 带货女王:直播卖出一个亿全集免费| 日本韩国免费看的电影电视剧| 维修工人的艳遇播放| 蒙面超人rx粤语| 实地探访银川烧烤店爆炸事故现场| 被拒绝的爱第五集大结局| 21世纪爱情指南免费版| 电锯人二免费观看高清| 野花高清1在线观看免费| 高清《死侍3》在线观看| 樱兰高校的男公关部| 倔强驱魔师1-4动漫免费观看| 将军夫人:夫君护短全集免费 | 重生八零:俏媳妇致富经短剧全集| 僵尸启示录没删掉版在线观看| 女超人电影法国| 他和他的他| 愉悦与苦恼在线观看| 港汇跳楼| 就想赖着你吻戏| 私人女子| 死神来了6国语高清免费观看| 北上电视剧13| 琉璃在线免费观看| 仙剑奇侠传2免费观看| 《美容院:特殊待遇》在线| 千金丫环电视剧免费观看全集高清| 废柴兄弟3在线观看免费版| 奶油柠檬| 情满四合院完整版全集| 玄女心经2免费观看完整版高清| 阿姨的诱惑| 鬼吹灯之精绝古城2| 蒂法3d在线观看| 变形金刚1电影下载| 金银梅5普通话在线观看国语版免费 | 一起愁愁愁免费全集| 竞女无修版| 永兴县| 杀死你的温柔动作完整视频| 美丽小蜜桃4:美丽人生| 《独一无二》| 穿梭阴阳恋| 法国空乘5免费高清原声满天星美版百度 | 花样年华电影未删减完整版| 决战江南全集| 最终列车醉汉动漫第三集免费观看| 电影康体水疗在线观看完整版| 下水道人鱼在线| 斗罗大陆第206集免费观看| 在悠长的时光里等你| 爱在空气中特别篇| 新员工2在线观看完整版电影| 行尸走肉第六季在线观看| 结弦电影在线观看免费完整版| 古董局中局第一部免费观看| 爱情正在直播| 爱我几何手机高清在线免费播放 | 《两位少妇按摩》HD中字 | 广场舞社员都是向阳花| 东京复仇者 在线观看| 西部狂野满天星| 荣誉守则2在线满天星池| 金瓶梅1-5电影免费完整版| 高清《我的娜塔莎》电视剧| 星汉灿烂电视剧全集在线观看免费| 在天亮前离开 周程成| 女学生被强伦轩无删减| 真爱背后全集| 韩剧绅士的品格| 武训传免费| 宇宙巡警露露子| 日本满天星电影免费观看| 八戒八戒电影在线观看播放| 谍杀风暴| 我家三爷超宠的全集视频| 我的爱蝴蝶夫人| 《climax》电影在线观看免费| 《理发:特殊待遇》孙婉| 骷髅13| 绝世千金第二季| 大祠堂在线观看| 七彩祥云烟花多少钱| 部长出差| 《丈夫不在家维修工人上门维修》| 高清《余罪2》全集在线观看| 女女电影免费观看完整版大结局| 妹妹学着点:打脸绿茶短剧全集| 金瓶梅在线播放国语免费观看| 日本色视频| 千金丫环电视剧免费观看全集高清 | 一天内全球多地发生客机事故| 黑白配HD1080电影在线观看 | 唐诡事录之西行| 胜者为王iv争霸粤语| 深田咏雪| 《性的暴行》在线观看| 反斗剑神粤语| 新审死官 电视剧| 沙河市| 出差遇到讨厌的前男友在线观看| sss17| 4399推销员| 我的时代你的时代免费观看完整版 | 甲午风云| 大戏看北京综艺| 李昀锐搞笑视频| 邵氏电影大全国语版| 一起愁愁愁愁愁愁在线观看电视剧 | 台军演练机场被炸瘫痪| 喜欢你我也是第二季| 一起吃拉面吗| 吴健版农民伯伯全集免费看| 高清《老师好》全集免费观看| 《逆袭》电视剧双男主免费观看 | 推销避孕套被要求试用电怎么应对应 | 善良的小姨子无删减| 别墅轮换5攻略完整版免费观看| 售楼小姐的秘密在线播放 | 电视剧鹿鼎记黄晓明| 禁忌II| 破处之旅| 荣誉法则(成人版)英文2012| 《丈夫的觉醒》大结局剧情| 极限追捕电视剧免费观看完整版| 怪奇物语第三季免费观看完整版| 守护者联盟| 小女不听将军令| 女友的妈妈 双字ID| 《斯巴达1帝国女版》海盗在线观看| 被闺蜜强啪百合小说H| 高清《妻子的新世界》电视剧| 王牌对王牌第九季免费观看完整版| 夏家三千金第三部| 美国式保罗讳4免费| 流浪地球高清在线播放| 好姑娘真漂亮完整版| 美国惊悚片无人生还2012| 情深妈妈| 电波教师| 屠宰呕吐娃娃全集在线观看 | 小满生活38集免费观看西瓜影视| 《逍遥》全集免费观看| 陪读妈妈电视剧免费版全集播放| 闲话行尸第一季| 《悲惨遭遇》1980年法国| 台版1987渔夫荒野史免费观看| 耙怎么读| 吴昕李维嘉同框| 《反击》在线观看完整版| 战至巅峰第三季2024年播出| 渝中区| 瑜伽室的激情| 《杰顿魔物娘》动漫在线看| 变形金刚第一部| 向前生活第七季免费观看高清| 年轻的嫂子5在线观看| 命运交响曲电视剧| 安姨版《售楼女王》满天星在线看| 瓜达卢佩的玫瑰无删减哪里可以看| 原始生活21天无删减版| 春夏秋冬又一春 (2003)| 孤岛飞鹰 电视剧| 女教师动漫全集ova无修| 第二个农场的姑娘们| 法国空姐2024| 《两个儿媳》电视剧在线看| 刀郎金刚经歌曲播放| 高清《灭火宝贝(高压监狱)》| 同事三分亲粤语| 《品味人生》伊丽莎白.坎贝奇| 要爸爸的种子免费观看完整版| 我的情人| 顺娘全集| 罗马帝国情史| 世界末日时间| 女性治疗营3| 克莱尔的迷宫在线免费播放| 夺命网红2未删减| 花开山乡电视剧在线观看| 愈合伴侣韩剧在线观看| 活人配阴婚的后果| 湖北张磊最新的视频| 《激战丛林》完整版| xl司令动漫第一季全集在线观看免费播放动漫 | 埃及满天星1982| 秦腔三娘教子| 杜拉拉升职记在线| 一路芬芳| 水乳交融HPO| 公之浮之手电影免费播放完整版 | 前列腺之家| 《原始的女儿国部落》| 风雨同心人民至上| 《混血儿摇篮曲》在线| 不穿内裤的女老师电影| 叶卡捷琳娜大帝第一季| 黑衣女人| 太空部队第二季| 樱花动漫后宫露营| 魔都传奇| 法国高压监狱| 安姨《房屋售楼员》电影完整在线观| 敌人的荣誉 电影| 高清命悬一枪未删减| 电影《金钱和我》国语版| 爱情前规则全集| 酒店1-75集全集免费| 善良的女销售| 新娘十八岁电视剧国语版全集| jizz教师| 行尸走肉第二季第二集| 维修师傅的艳遇| 聊斋艳谭之月光宝盒| 樊梨花电视剧| 九宫奇局在线观看| 永生守卫| 《屠宰餐厅》美国| 法国空姐4免费高清原声满天星美版百度 | 邵阳县| 哇嘎高清电影在线观看| 欧美1| 聊斋艳谭之月光宝盒| 上海一大学教师捅死同事被刑拘| 速度激情8| 宇宙巡警露露子| 《外卖员的艳遇》| 《束缚游戏》第一季1-12集免费观看| 竞雄女侠秋瑾| 台湾骂人的话| 隐入尘烟免费观看完整| 火影忍者论坛52pk| 生死线在线观看| 古堡女仆满天星版哪里可以看| 马来西亚美女少妇三级视频。| 卖肉动漫推荐| 鸿雁于飞刀郎| 图书馆女友2季动漫观看| 花花公子电子杂志| 紧扣的星星全集完整| 屠宰呕吐娃娃在线观看高清版电影| 铜锣铜钹铿锵锵免费观看| 一路向西高清ed2k| 张信哲过火演唱会| 《刀尖》在线观看| 江湖儿女免费| 我和黑道老大的三百六十五天1| 坎贝奇《品味人生》高清全集| 电影激战丛林无删减版免费看| magnet舞蹈| 绝世唐门1| 名侦探柯南第14个目标| 天空战记国语|