亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

07-04-源碼-.NET Core GC清掃與壓縮

07-04-源碼-.NET Core GC清掃與壓縮 .NET Core GC 清掃與壓縮篇章07-源碼深度-.NET Core GC |閱讀時(shí)間約 45 分鐘一、引言標(biāo)記階段識(shí)別了存活對(duì)象后GC 進(jìn)入回收階段——清掃死亡對(duì)象、壓縮存活對(duì)象。清掃和壓縮是 GC 中內(nèi)存效率的決定性因素清掃決定了多少死亡內(nèi)存被真正釋放壓縮決定了碎片是否累積到影響分配的程度。但清掃和壓縮的代價(jià)也不容忽視。一次全堆壓縮可能耗時(shí)數(shù)十到數(shù)百毫秒直接反映在應(yīng)用的暫停時(shí)間上。所以 .NET Core GC 的核心設(shè)計(jì)哲學(xué)是能不清壓就不清壓必須清壓時(shí)盡量并行化。這個(gè)哲學(xué)貫穿了從計(jì)劃決策到清掃實(shí)現(xiàn)、從壓縮策略到 LOH 特殊處理的每一個(gè)環(huán)節(jié)。在展開之前先把本章的定位說清楚。07-03 標(biāo)記篇已經(jīng)講完了哪些對(duì)象活著本章接著講活著的東西怎么擺回去、死的東西怎么收走。后臺(tái) GC 的并發(fā)編排見 07-05分配路徑見 07-02堆結(jié)構(gòu)與分代布局的背景見 07-01。二、計(jì)劃階段Plan Phase2.1 清掃前的決策GC 在執(zhí)行任何清掃動(dòng)作之前必須先制定計(jì)劃。這個(gè)計(jì)劃決定了哪些代需要清掃、哪些代需要壓縮、LOH 是否需要特殊處理、是否啟用并行清掃。// gc.h - GCPlan 結(jié)構(gòu)體簡(jiǎn)化示意不含全部字段 struct GCPlan { bool compact_gen2; // Gen 2 是否需要壓縮 bool compact_loh; // LOH 是否需要壓縮 int sweep_gen0_segments; // Gen 0 需要清掃的段數(shù) int sweep_gen1_segments; // Gen 1 需要清掃的段數(shù) int sweep_gen2_segments; // Gen 2 需要清掃的段數(shù) bool concurrent_sweep; // 是否并發(fā)清掃后臺(tái) GC 時(shí) bool parallel_sweep; // 是否并行清掃多核時(shí) float fragmentation_ratio_gen2; // Gen 2 碎片率 float fragmentation_ratio_loh; // LOH 碎片率 };計(jì)劃階段的核心輸入是碎片率。碎片率定義為碎片率 1.0 - (最大連續(xù)空閑塊大小 / 總空閑內(nèi)存)換句話說碎片率衡量的是空閑內(nèi)存被分散到了多小的塊里。碎片率為 0 表示所有空閑內(nèi)存連成一塊碎片率為 1 表示每個(gè)空閑塊都只有 1 字節(jié)極端情況。2.2 壓縮觸發(fā)條件壓縮不是每次 GC 都做的——它只在碎片率超過閾值時(shí)才觸發(fā)。.NET Core GC 的默認(rèn)閾值因代而異代壓縮觸發(fā)閾值原因Gen 0不壓縮Gen 0 每次 GC 都重建天然無(wú)碎片Gen 1不壓縮Gen 1 是 Gen 0 的緩沖區(qū)本身不獨(dú)立管理Gen 2~50%大堆碎片累積快壓縮收益高LOH~70%手動(dòng)LOH 不使用 bump pointer碎片率天然較低注意 Gen 0 和 Gen 1從不壓縮。這是因?yàn)?Gen 0 在每次 GC 時(shí)都會(huì)重建——所有存活對(duì)象晉升到 Gen 1Gen 0 的段被完全清空并重新使用。這種全量晉升 段復(fù)用的機(jī)制天然消除了 Gen 0 的碎片不需要壓縮。Gen 1 也不壓縮因?yàn)樗皇且粋€(gè)獨(dú)立的內(nèi)存區(qū)域——它和 Gen 2 共享同一組段。對(duì) Gen 2 的壓縮同時(shí)就是對(duì) Gen 1 的壓縮。2.3 計(jì)劃決策的時(shí)序標(biāo)記階段完成 │ ▼ 統(tǒng)計(jì)各代碎片率 │ ├─ Gen 2 碎片率 50%? │ └─ Yes → compact_gen2 true │ ├─ LOH 手動(dòng)觸發(fā)壓縮? │ └─ Yes → compact_loh true │ ├─ 并發(fā) GC 且 Gen 2 需要清掃? │ └─ Yes → concurrent_sweep true │ └─ CPU 核數(shù) 1 且需要清掃? └─ Yes → parallel_sweep true計(jì)劃階段本身非常快通常只需幾百微秒。它的輸出GCPlan會(huì)被傳遞給清掃階段和壓縮階段指導(dǎo)后續(xù)的所有操作。三、清掃階段Sweep Phase3.1 清掃的基本原理清掃是 GC 回收階段的第一步。它的任務(wù)很簡(jiǎn)單遍歷段中的所有對(duì)象把死亡對(duì)象的內(nèi)存標(biāo)記為可用。但實(shí)現(xiàn)起來(lái)并不簡(jiǎn)單。清掃需要處理以下問題對(duì)象遍歷如何高效地遍歷段中的所有對(duì)象死亡檢測(cè)如何判斷一個(gè)對(duì)象是否死亡空閑管理如何管理回收后的空閑內(nèi)存3.1.1 對(duì)象遍歷清掃遍歷段的方式與標(biāo)記遍歷對(duì)象圖的方式不同。標(biāo)記是從根出發(fā)沿著引用字段下鉆而清掃是順序遍歷段中的每個(gè)對(duì)象按對(duì)象大小步進(jìn)。// SweepSegment 核心邏輯簡(jiǎn)化示意 void SweepSegment(heap_segment* seg) { uint8_t* current seg-start; uint8_t* end seg-allocated; while (current end) { Object* obj (Object*)current; // 檢查對(duì)象是否被標(biāo)記 if (!obj-IsMarked()) { // 死亡對(duì)象回收其內(nèi)存 size_t size obj-GetSize(); AddToFreeList(current, size); } else { // 存活對(duì)象清除標(biāo)記位準(zhǔn)備下一輪 obj-ClearMark(); } // 按對(duì)象大小步進(jìn)到下一個(gè)對(duì)象 current obj-GetSize(); } }這個(gè)遍歷是順序的對(duì)內(nèi)存的訪問模式非常友好——CPU 預(yù)取器可以很好地工作緩存命中率極高。這也是為什么清掃階段通常只占 GC 暫停時(shí)間的 10% 左右。3.1.2 死亡檢測(cè)死亡檢測(cè)通過檢查對(duì)象的標(biāo)記位mark bit實(shí)現(xiàn)。標(biāo)記階段會(huì)為每個(gè)存活對(duì)象設(shè)置標(biāo)記位清掃階段只需檢查這個(gè)位標(biāo)記位為 1存活對(duì)象清除標(biāo)記位繼續(xù)下一個(gè)標(biāo)記位為 0死亡對(duì)象回收內(nèi)存標(biāo)記位通常存儲(chǔ)在對(duì)象頭的某個(gè)比特位中訪問速度極快一條位操作指令。3.1.3 空閑管理回收后的空閑內(nèi)存需要被管理以便后續(xù)分配能夠快速找到可用空間。.NET Core GC 使用按大小分類的空閑列表size-class free list空閑列表結(jié)構(gòu) ┌─────────────────────────────────────────────────┐ │ FreeList[0] (8-15 字節(jié)) ──? [塊A] ──? [塊B] │ │ FreeList[1] (16-31 字節(jié)) ──? [塊C] ──? NULL │ │ FreeList[2] (32-63 字節(jié)) ──? [塊D] │ │ ... │ │ FreeList[N] (8KB) ──? [塊E] ──? [塊F] │ └─────────────────────────────────────────────────┘空閑列表按大小分類的好處是分配時(shí)可以根據(jù)請(qǐng)求大小直接定位到對(duì)應(yīng)的鏈表避免全表搜索。這與 slab 分配器的思想類似——將相近大小的空閑塊歸為一類每類維護(hù)一個(gè)獨(dú)立鏈表。3.2 清掃的零分配保證清掃階段有一個(gè)重要的設(shè)計(jì)原則不分配任何新對(duì)象。所有需要的臨時(shí)數(shù)據(jù)結(jié)構(gòu)空閑鏈表節(jié)點(diǎn)等都從已回收的對(duì)象本身借用內(nèi)存。這是經(jīng)典的intrusive list侵入式鏈表技術(shù)被回收的對(duì)象內(nèi)存直接作為鏈表節(jié)點(diǎn)使用不需要額外分配內(nèi)存來(lái)維護(hù)空閑列表。具體來(lái)說死亡對(duì)象的第一個(gè)字段原本存儲(chǔ)方法表指針之后的位置被覆寫為下一個(gè)空閑塊的指針。死亡對(duì)象回收前的內(nèi)存布局 ┌────────────────────────────────────────────┐ │ 方法表指針 (8B) │ 同步塊 (8B) │ 字段數(shù)據(jù)... │ └────────────────────────────────────────────┘ │ ▼ 回收后方法表指針之后的內(nèi)存被覆寫 ┌────────────────────────────────────────────┐ │ 方法表指針 (8B) │ 空閑鏈表指針 ?────────────┘ │ (保持不變GC 不再需要) │ └────────────────────────────────────────────┘這種設(shè)計(jì)的優(yōu)勢(shì)零額外內(nèi)存不需要為空閑鏈表分配任何額外內(nèi)存。零額外分配不需要在清掃過程中調(diào)用malloc或new。零額外開銷空閑鏈表的插入操作只是修改一個(gè)指針。不清零被回收的對(duì)象不需要清零因?yàn)樗膬?nèi)存即將被重新分配使用。3.3 并發(fā)清掃在后臺(tái) GCBackground GC模式下清掃可以與應(yīng)用線程并發(fā)執(zhí)行。這是 .NET Core 3.0 的重要優(yōu)化時(shí)間線示意 應(yīng)用線程: [Alloc][Alloc][Alloc][Alloc][Alloc][Alloc]... │ │ GC線程: ──[標(biāo)記 Gen2]──[清掃 Gen2]──────[壓縮 Gen2]── │ │ │ │ ├─ 并發(fā)清掃應(yīng)用線程繼續(xù)分配 │ └─ 壓縮時(shí)需要 STW并發(fā)清掃的關(guān)鍵技術(shù)是標(biāo)記-清掃并發(fā)標(biāo)記階段在后臺(tái)線程中并行執(zhí)行清掃階段在標(biāo)記完成后立即開始不需要等待應(yīng)用線程全部掛起。只有壓縮階段需要 STWStop-The-World。并發(fā)清掃的實(shí)現(xiàn)依賴于以下機(jī)制標(biāo)記位的原子操作標(biāo)記階段設(shè)置標(biāo)記位使用原子操作清掃階段讀取標(biāo)記位不需要加鎖。段級(jí)鎖清掃器獲取段的鎖后其他線程不能修改該段的內(nèi)容。段級(jí)鎖的粒度比全局鎖小得多減少了競(jìng)爭(zhēng)??ㄆ硌a(bǔ)償并發(fā)期間應(yīng)用線程可能創(chuàng)建新的引用這些引用通過卡片表記錄清掃完成后由 GC 進(jìn)行補(bǔ)償掃描。3.4 并行清掃在多核機(jī)器上清掃可以并行化。不同清掃器線程負(fù)責(zé)不同的段互不干擾段 0 ──? 清掃器線程 0 段 1 ──? 清掃器線程 1 段 2 ──? 清掃器線程 2 段 3 ──? 清掃器線程 3并行清掃的加速比接近線性——4 核機(jī)器上清掃 4 個(gè)段的耗時(shí)約等于清掃 1 個(gè)段的 4 倍。但并行清掃也有開銷任務(wù)分發(fā)需要將段分配給清掃器線程這本身有同步開銷??臻e列表合并各線程回收的空閑塊需要合并到全局空閑列表中。緩存競(jìng)爭(zhēng)多個(gè)線程同時(shí)寫入空閑列表可能導(dǎo)致緩存行失效。因此并行清掃在段數(shù)較多時(shí)收益明顯段數(shù)較少時(shí)可能得不償失。.NET Core GC 會(huì)根據(jù)段數(shù)和 CPU 核數(shù)自動(dòng)決定是否啟用并行清掃。四、壓縮階段Compact Phase4.1 為什么需要壓縮清掃雖然回收了死亡對(duì)象的內(nèi)存但它留下的空閑塊是分散的。如果死亡對(duì)象和存活對(duì)象交替出現(xiàn)空閑塊也會(huì)交替出現(xiàn)清掃前的段布局 ┌──────┬────────┬──────┬────────┬──────┬────────┬──────┐ │ 存活 │ 死亡 │ 存活 │ 死亡 │ 存活 │ 死亡 │ 存活 │ │ ObjA │ ObjX │ ObjB │ ObjY │ ObjC │ ObjZ │ ObjD │ └──────┴────────┴──────┴────────┴──────┴────────┴──────┘ 空閑塊: [ObjX] [ObjY] [ObjZ] 分散在存活對(duì)象之間 清掃后未壓縮 ┌──────┬────────┬──────┬────────┬──────┬────────┬──────┬──────┐ │ 存活 │ 死亡 │ 存活 │ 死亡 │ 存活 │ 死亡 │ 存活 │ 空閑 │ │ ObjA │ ObjX │ ObjB │ ObjY │ ObjC │ ObjZ │ ObjD │ │ └──────┴────────┴──────┴────────┴──────┴────────┴──────┴──────┘ 空閑塊分散在 ObjA/ObjB/ObjC/ObjD 之間 → 碎片化 壓縮后 ┌──────┬──────┬──────┬──────┬──────────────────────────────┐ │ 存活 │ 存活 │ 存活 │ 存活 │ 連續(xù)空閑空間 │ │ ObjA │ ObjB │ ObjC │ ObjD │ (可分配區(qū)域) │ └──────┴──────┴──────┴──────┴──────────────────────────────┘ 所有存活對(duì)象移到段開頭空閑空間集中在段尾 → 無(wú)碎片壓縮的核心價(jià)值是將分散的空閑塊合并為連續(xù)的可用空間。沒有壓縮碎片會(huì)逐步累積最終導(dǎo)致即使總空閑內(nèi)存足夠也無(wú)法分配大塊對(duì)象因?yàn)檎也坏阶銐虼蟮倪B續(xù)空間。4.2 壓縮的三個(gè)步驟壓縮是 GC 中最復(fù)雜的操作涉及三個(gè)緊密耦合的步驟步驟 1計(jì)算新地址// ComputeNewAddresses簡(jiǎn)化示意 void ComputeNewAddresses(int generation) { uint8_t* write_ptr segment-start; // 寫入指針從段頭開始 for (uint8_t* current segment-start; current segment-allocated; current obj-GetSize()) { Object* obj (Object*)current; if (obj-IsMarked()) { // 存活對(duì)象記錄新地址 obj-SetNewAddress(write_ptr); write_ptr obj-GetSize(); } // 死亡對(duì)象跳過不分配新地址 } segment-allocated write_ptr; // 更新段的分配上限 }這一步是純讀取 順序?qū)懭雽?duì)內(nèi)存的訪問模式非常友好。每個(gè)存活對(duì)象只被訪問一次按順序從段頭掃到段尾。關(guān)鍵細(xì)節(jié)新地址單調(diào)遞增存活對(duì)象按原順序排列新地址嚴(yán)格遞增。這意味著壓縮不會(huì)改變對(duì)象的相對(duì)順序有利于緩存局部性。死亡對(duì)象被跳過死亡對(duì)象不占用新地址空間相當(dāng)于在計(jì)算新地址的同時(shí)完成了收縮。對(duì)象大小不變壓縮不改變對(duì)象大小只改變對(duì)象的起始地址。步驟 2修復(fù)引用Fix References// FixReferences簡(jiǎn)化示意 void FixReferences(int generation) { // 修復(fù)棧上的引用 for (Thread* thread : suspended_threads) { for (RefLocation ref : thread-stack_references) { if (ref.target segment_start ref.target segment_end) { *ref.location ref.target-GetNewAddress(); } } } // 修復(fù)堆上的引用存活對(duì)象中的引用字段 for (uint8_t* obj segment-start; obj segment-allocated; ) { if (obj-IsMarked()) { obj-FixReferences(); // 對(duì)象內(nèi)部的引用字段全部更新 obj obj-GetSize(); } } // 修復(fù)靜態(tài)字段 for (StaticRef ref : static_references) { if (ref.target segment_start ref.target segment_end) { *ref.location ref.target-GetNewAddress(); } } // 修復(fù)句柄表 for (HandleEntry entry : handle_table) { if (entry.target segment_start entry.target segment_end) { entry.target entry.target-GetNewAddress(); } } }引用修復(fù)是壓縮中最復(fù)雜、最耗時(shí)的部分。需要修復(fù)的引用來(lái)源包括棧引用各線程棧幀中指向壓縮段的對(duì)象引用。堆引用存活對(duì)象內(nèi)部的引用字段指向同一段或其他段中的對(duì)象。靜態(tài)字段類靜態(tài)變量中指向壓縮段的引用。句柄表GCHandle 中指向壓縮段的引用。GC 內(nèi)部結(jié)構(gòu)如卡片表、根表等。引用修復(fù)的關(guān)鍵約束必須在復(fù)制之前完成。因?yàn)閺?fù)制會(huì)移動(dòng)對(duì)象如果先復(fù)制再修復(fù)引用修復(fù)時(shí)找不到舊地址。步驟 3復(fù)制對(duì)象數(shù)據(jù)// CopyObjects簡(jiǎn)化示意 void CopyObjects(int generation) { for (uint8_t* current segment-start; current segment-old_allocated; current obj-GetSize()) { Object* obj (Object*)current; if (obj-IsMarked()) { uint8_t* new_addr obj-GetNewAddress(); if (current ! new_addr) { // 對(duì)象需要移動(dòng)復(fù)制數(shù)據(jù) size_t size obj-GetSize(); MemMove(new_addr, current, size); } } } }復(fù)制階段使用MemMove批量移動(dòng)對(duì)象數(shù)據(jù)。由于對(duì)象是按順序處理的且新地址也是順序遞增的MemMove的調(diào)用可以很好地利用 CPU 的 DMA 緩存行預(yù)取和 SIMD 指令。關(guān)鍵優(yōu)化原地跳過如果對(duì)象的新地址等于舊地址通常發(fā)生在段尾部的存活對(duì)象直接跳過不復(fù)制。批量復(fù)制MemMove內(nèi)部使用 SIMD 指令如 AVX2一次復(fù)制 32 或 64 字節(jié)比逐字節(jié)復(fù)制快數(shù)倍。寫合并多個(gè)小對(duì)象的復(fù)制可以合并為一次MemMove調(diào)用減少函數(shù)調(diào)用開銷。4.3 壓縮的代價(jià)壓縮涉及大量?jī)?nèi)存復(fù)制和引用更新是 GC 中最耗時(shí)的操作。以下是一個(gè)典型場(chǎng)景的耗時(shí)分解100MB Gen 2 堆碎片率 60%一次全量壓縮 步驟 耗時(shí) 占比 ───────────────────────────────────── 計(jì)算新地址 5-10ms ~15% 修復(fù)引用 20-80ms ~60% ← 最耗時(shí) 復(fù)制對(duì)象數(shù)據(jù) 5-10ms ~15% 清理段元數(shù)據(jù) 1-2ms ~5% ───────────────────────────────────── 合計(jì) 30-100ms 100%各步驟的耗時(shí)特征計(jì)算新地址O(n) 順序遍歷緩存友好耗時(shí)與存活對(duì)象數(shù)成正比。修復(fù)引用O(n r)n 為存活對(duì)象數(shù)r 為引用字段總數(shù)。引用字段越多耗時(shí)越長(zhǎng)。棧引用和句柄表引用的修復(fù)需要逐個(gè)處理無(wú)法批量?jī)?yōu)化。復(fù)制對(duì)象數(shù)據(jù)O(n)但MemMove的常數(shù)極小實(shí)際耗時(shí)通常低于引用修復(fù)。清理段元數(shù)據(jù)O(1) 或 O(段數(shù))耗時(shí)可忽略。4.4 壓縮的并發(fā)化.NET Core GC 在 .NET 6 中引入了并發(fā)壓縮的部分優(yōu)化。核心思想是將壓縮拆分為多個(gè)階段其中計(jì)算新地址和修復(fù)引用可以在后臺(tái)線程中并行執(zhí)行只有最后的復(fù)制 最終引用修復(fù)需要 STW。傳統(tǒng)壓縮全 STW [計(jì)算新地址][修復(fù)引用][復(fù)制對(duì)象][最終修復(fù)] ← 全部 STW 并發(fā)壓縮.NET 6 [計(jì)算新地址]──[修復(fù)引用] ← 后臺(tái)線程并行執(zhí)行 │ ▼ STW 切換點(diǎn) [復(fù)制對(duì)象][最終修復(fù)] ← 短 STW這種設(shè)計(jì)的優(yōu)勢(shì)是將 STW 時(shí)間從幾十毫秒降低到幾毫秒。后臺(tái)階段雖然也消耗 CPU 和內(nèi)存帶寬但不影響應(yīng)用線程只有最后的 STW 階段會(huì)暫停應(yīng)用。五、LOH 清掃與壓縮5.1 LOH 為什么不同LOH大對(duì)象堆的清掃和壓縮與 SOH小對(duì)象堆有本質(zhì)區(qū)別原因在 07-02 中已經(jīng)提到過不使用 bump pointerLOH 使用空閑列表管理天然不存在清掃后合并空閑塊的需求。對(duì)象生命周期長(zhǎng)LOH 對(duì)象通常存活整個(gè)應(yīng)用生命周期碎片率增長(zhǎng)緩慢。壓縮代價(jià)極高LOH 對(duì)象可能從 85KB 到幾 GB復(fù)制一個(gè)大對(duì)象的代價(jià)相當(dāng)于復(fù)制成千上萬(wàn)個(gè)小對(duì)象。5.2 LOH 清掃LOH 的清掃與 SOH 類似也是遍歷死亡對(duì)象并回收內(nèi)存。但由于 LOH 對(duì)象數(shù)量遠(yuǎn)少于 SOH 對(duì)象LOH 清掃的耗時(shí)通常可以忽略不計(jì)。// LOH Sweep簡(jiǎn)化示意 void SweepLOH() { for (auto entry : loh_free_list) { if (!entry.obj-IsMarked()) { // 死亡 LOH 對(duì)象回收 AddToLOHFreeList(entry.obj, entry.size); } else { // 存活 LOH 對(duì)象清除標(biāo)記 entry.obj-ClearMark(); } } }5.3 LOH 壓縮LOH 壓縮是一個(gè)手動(dòng)觸發(fā)的操作默認(rèn)不自動(dòng)執(zhí)行。這是因?yàn)?LOH 壓縮的代價(jià)極高——它需要移動(dòng)所有存活的大對(duì)象并更新所有指向它們的引用。// 手動(dòng)觸發(fā) LOH 壓縮 GCSettings.LargeObjectHeapCompactionMode GCLargeObjectHeapCompactionMode.CompactOnce; // 下一次 GC.Collect() 會(huì)壓縮 LOH GC.Collect();LOH 壓縮的觸發(fā)條件觸發(fā)方式條件說明手動(dòng)觸發(fā)GCSettings.LargeObjectHeapCompactionMode CompactOnce下一次 GC.Collect() 觸發(fā)永久模式GCSettings.LargeObjectHeapCompactionMode CompactEveryTime每次 GC.Collect() 都觸發(fā)不推薦自動(dòng)觸發(fā)無(wú).NET Core 默認(rèn)不自動(dòng)壓縮 LOHLOH 壓縮的代價(jià)內(nèi)存復(fù)制所有存活 LOH 對(duì)象需要被移動(dòng)復(fù)制量可能達(dá)到數(shù) GB。引用更新所有指向 LOH 對(duì)象的引用需要更新包括棧引用、堆引用、靜態(tài)字段、句柄表。STW 時(shí)間長(zhǎng)LOH 壓縮通常需要 STW 數(shù)百毫秒到數(shù)秒取決于 LOH 大小和存活對(duì)象數(shù)。因此LOH 壓縮應(yīng)該謹(jǐn)慎使用只在確實(shí)存在嚴(yán)重碎片問題且影響分配時(shí)才觸發(fā)。5.4 LOH 碎片問題與緩解LOH 碎片是 .NET 中一個(gè)經(jīng)典問題。當(dāng)頻繁分配和釋放大小不一的 LOH 對(duì)象時(shí)空閑列表會(huì)逐漸碎片化最終導(dǎo)致即使總空閑內(nèi)存足夠也無(wú)法分配新的大對(duì)象。緩解 LOH 碎片的策略避免頻繁分配/釋放 LOH 對(duì)象使用對(duì)象池復(fù)用 LOH 對(duì)象??刂茖?duì)象大小盡量使對(duì)象大小低于 85,000 字節(jié)閾值使其走 SOH 路徑。定期手動(dòng)壓縮在低峰期手動(dòng)觸發(fā) LOH 壓縮。使用ArrayPoolT對(duì)于數(shù)組類型的 LOH 對(duì)象使用數(shù)組池復(fù)用。六、壓縮的代價(jià)與觸發(fā)策略6.1 壓縮耗時(shí)分解一次完整的 Gen 2 壓縮100MB 堆的耗時(shí)構(gòu)成Full GC 耗時(shí)分解100MB 堆碎片率 60% 標(biāo)記: ████████████████████████ 60% (15-30ms) ← 后臺(tái)GC改造目標(biāo) 清掃: ████ 10% (2-5ms) 壓縮: ██████ 30% (10-50ms) ← 最慢但僅在碎片率超閾值時(shí)觸發(fā) ───────────────────────────────────────────────── 合計(jì): 100% (27-85ms)關(guān)鍵觀察標(biāo)記占大頭標(biāo)記是耗時(shí)最長(zhǎng)的階段也是后臺(tái) GC 優(yōu)化的主要目標(biāo)。清掃最穩(wěn)定清掃耗時(shí)波動(dòng)最小因?yàn)樗灰蕾嚧婊顚?duì)象數(shù)與碎片率無(wú)關(guān)。壓縮最可變壓縮耗時(shí)波動(dòng)最大從幾毫秒低碎片到數(shù)百毫秒高碎片 大堆。6.2 壓縮觸發(fā)策略.NET Core GC 的壓縮觸發(fā)策略可以概括為保守觸發(fā)按需壓縮。是否壓縮的決策邏輯 1. Gen 0? → 不壓縮每次 GC 都重建 2. Gen 1? → 不壓縮與 Gen 2 共享段隨 Gen 2 一起壓縮 3. Gen 2? ├─ 碎片率 50%? → Yes → 壓縮 └─ No → 不壓縮 4. LOH? ├─ 手動(dòng)觸發(fā)? → Yes → 壓縮 └─ No → 不壓縮即使碎片率很高這個(gè)策略的核心考量壓縮的代價(jià)高壓縮需要移動(dòng)對(duì)象、更新引用耗時(shí)可能遠(yuǎn)超清掃。碎片不是最緊急的問題只要還有足夠大的連續(xù)空閑塊碎片不會(huì)導(dǎo)致分配失敗。預(yù)算機(jī)制優(yōu)先通過 budget 機(jī)制控制 GC 頻率比通過壓縮控制碎片更經(jīng)濟(jì)。6.3 壓縮的替代方案在某些場(chǎng)景下壓縮不是最優(yōu)選擇。.NET Core GC 提供了以下替代方案段復(fù)用回收的段不還給操作系統(tǒng)留給下輪復(fù)用。這避免了還了再要的系統(tǒng)調(diào)用開銷??臻e列表優(yōu)化通過按大小分類的空閑列表提高小塊的分配命中率減少對(duì)新段的需求。晉升策略調(diào)優(yōu)調(diào)整對(duì)象晉升策略讓短命對(duì)象更快離開 Gen 0減少 Gen 0 的碎片累積。七、GC 耗時(shí)分解與優(yōu)化方向7.1 一次 Full GC 的完整耗時(shí)一次 Full GC100MB Gen 2 堆碎片率 40%的耗時(shí)構(gòu)成 階段 耗時(shí) 是否 STW 可并發(fā) ───────────────────────────────────────────────── 掛起線程 1-5ms Yes 否 根掃描 1-3ms Yes 否 標(biāo)記 Gen 0/1 5-10ms 部分 是后臺(tái) 標(biāo)記 Gen 2 10-20ms 部分 是后臺(tái) 清掃 Gen 0 1-2ms 部分 是并發(fā) 清掃 Gen 1/2 2-5ms 部分 是并發(fā) 壓縮 Gen 2 10-30ms Yes 否 修復(fù)引用 5-20ms Yes 部分 恢復(fù)線程 1-3ms Yes 否 ───────────────────────────────────────────────── 總 STW 時(shí)間 20-60ms 總耗時(shí)含并發(fā) 30-100ms7.2 優(yōu)化方向基于耗時(shí)分解GC 優(yōu)化的優(yōu)先級(jí)如下減少標(biāo)記耗時(shí)后臺(tái) GC 已經(jīng)將標(biāo)記移到后臺(tái)進(jìn)一步優(yōu)化空間有限。減少壓縮觸發(fā)通過 budget 自適應(yīng)和晉升策略降低碎片率減少壓縮觸發(fā)頻率。減少 STW 時(shí)間并發(fā)壓縮.NET 6將大部分壓縮工作移到后臺(tái)進(jìn)一步降低 STW 時(shí)間。減少清掃耗時(shí)清掃已經(jīng)很快10%優(yōu)化空間有限。八、清掃和壓縮的時(shí)機(jī)選擇8.1 何時(shí)壓縮.NET Core GC 根據(jù)以下因素決定是否壓縮碎片率空閑空間分散度超過閾值時(shí)觸發(fā)壓縮。Gen 2 默認(rèn)閾值約 50%LOH 默認(rèn)不自動(dòng)壓縮。最近一次壓縮的時(shí)間間隔避免頻繁壓縮。如果剛做過壓縮即使碎片率略有上升也不會(huì)立即再次壓縮。堆大小大堆壓縮的收益更大——碎片浪費(fèi)的絕對(duì)空間更多壓縮后釋放的連續(xù)空間也更可觀。內(nèi)存壓力當(dāng)操作系統(tǒng)通知內(nèi)存緊張時(shí)GC 可能降低壓縮閾值更積極地壓縮以釋放空間。8.2 實(shí)際項(xiàng)目中的觀察在實(shí)際項(xiàng)目中大多數(shù) GC 只需要清掃不需要壓縮。壓縮通常只在以下場(chǎng)景觸發(fā)長(zhǎng)運(yùn)行服務(wù)運(yùn)行時(shí)間越長(zhǎng)碎片累積越多壓縮觸發(fā)越頻繁。對(duì)象生命周期差異大如果同時(shí)存在短命對(duì)象和長(zhǎng)命對(duì)象長(zhǎng)命對(duì)象之間的空洞會(huì)逐步累積為碎片。LOH 頻繁分配雖然 LOH 不自動(dòng)壓縮但 LOH 碎片會(huì)影響 Gen 2 的碎片率間接觸發(fā) Gen 2 壓縮。九、清掃的零分配保證9.1 Intrusive List 技術(shù)清掃階段有一個(gè)重要的設(shè)計(jì)原則不分配任何新對(duì)象。所有需要的臨時(shí)數(shù)據(jù)空閑鏈表節(jié)點(diǎn)等從已回收的對(duì)象本身借用內(nèi)存。這是經(jīng)典的intrusive list侵入式鏈表技術(shù)。具體來(lái)說被回收的死亡對(duì)象的內(nèi)存被直接用作空閑鏈表的節(jié)點(diǎn)。死亡對(duì)象的第一個(gè)字段原本存儲(chǔ)方法表指針之后的位置被覆寫為下一個(gè)空閑塊的指針。這樣空閑鏈表不需要任何額外的內(nèi)存分配——它寄生在已回收的對(duì)象內(nèi)存上。死亡對(duì)象回收前的內(nèi)存布局 ┌──────────────────────────────────────────────────────┐ │ 方法表指針 (8B) │ 同步塊 (8B) │ 字段數(shù)據(jù) (N 字節(jié)) │ │ ← 對(duì)象頭 ← 對(duì)象數(shù)據(jù) │ └──────────────────────────────────────────────────────┘ │ ▼ 回收后方法表指針之后的內(nèi)存被覆寫為鏈表指針 ┌──────────────────────────────────────────────────────┐ │ 方法表指針 (8B) │ 空閑鏈表下一個(gè)節(jié)點(diǎn)指針 (8B) │ ... │ │ (GC 不再需要方法表指針) │ └──────────────────────────────────────────────────────┘ │ ▼ 插入空閑鏈表 FreeList[size_class] ──? [此塊] ──? [下一個(gè)空閑塊] ──? ...9.2 零分配的優(yōu)勢(shì)這種設(shè)計(jì)的優(yōu)勢(shì)是多方面的零額外內(nèi)存不需要為空閑鏈表分配任何額外內(nèi)存??臻e鏈表的節(jié)點(diǎn)就是死亡對(duì)象本身。零額外分配不需要在清掃過程中調(diào)用malloc或new避免了在 GC 過程中觸發(fā)遞歸 GC 的風(fēng)險(xiǎn)。零額外開銷空閑鏈表的插入操作只是修改一個(gè)指針時(shí)間復(fù)雜度 O(1)。不清零被回收的對(duì)象不需要清零。因?yàn)樗膬?nèi)存即將被重新分配使用清零是浪費(fèi)。緩存友好空閑鏈表節(jié)點(diǎn)與對(duì)象數(shù)據(jù)在同一塊內(nèi)存中訪問局部性好。9.3 與 Java GC 的對(duì)比Java 的 OpenJDK GC如 G1使用獨(dú)立的空閑列表結(jié)構(gòu)每個(gè)空閑塊需要額外的元數(shù)據(jù)來(lái)記錄大小和下一個(gè)節(jié)點(diǎn)。這意味著清掃階段需要為每個(gè)死亡塊分配一個(gè)空閑節(jié)點(diǎn)。.NET 的 intrusive list 技術(shù)避免了這一開銷是零分配保證的關(guān)鍵。十、與 Unity GC 的對(duì)比10.1 Unity (SGen) 的清掃與壓縮Unity 的 GC 基于 Mono 的 SGenScavenge-Sweep Garbage Collector與 .NET Core GC 有顯著差異特性.NET Core GCUnity (SGen)清掃方式順序遍歷 intrusive list標(biāo)記-清掃 獨(dú)立空閑列表壓縮策略Gen 2 按需壓縮分代壓縮Scavenge 階段LOH 壓縮手動(dòng)觸發(fā)無(wú)專門 LOH并發(fā)清掃.NET 3.0 支持增量清掃可配置零分配保證清掃階段不分配部分支持壓縮暫停時(shí)間30-100ms100MB10-50ms100MBUnity 的增量清掃是應(yīng)對(duì)移動(dòng)設(shè)備資源限制的特殊設(shè)計(jì)——將清掃拆分成多個(gè)小片段避免單次清掃暫停過長(zhǎng)。而 .NET Core GC 更傾向于一次性完成通過后臺(tái) GC 和并發(fā)壓縮來(lái)降低單次暫停的代價(jià)。10.2 為什么 Unity 的壓縮暫停更短Unity SGen 的壓縮暫停通常比 .NET Core GC 短原因有三堆更小移動(dòng)設(shè)備的堆通常只有幾十 MB而 .NET 服務(wù)端應(yīng)用的堆可能達(dá)到數(shù) GB。壓縮耗時(shí)與堆大小成正比。壓縮策略更保守SGen 只在必要時(shí)壓縮小代不壓縮整個(gè)堆。對(duì)象更小移動(dòng)應(yīng)用的對(duì)象通常較小復(fù)制代價(jià)更低。但這些差異也反映了平臺(tái)約束移動(dòng)設(shè)備內(nèi)存有限不能像服務(wù)端那樣使用大堆和 LOH。十一、量化數(shù)據(jù)的口徑說明11.1 數(shù)據(jù)性質(zhì)本文給出的所有量化數(shù)據(jù)耗時(shí)、百分比、閾值等均為典型估算或示例量級(jí)非實(shí)測(cè)常數(shù)。實(shí)際數(shù)值取決于以下因素堆大小100MB 堆與 10GB 堆的耗時(shí)相差兩個(gè)數(shù)量級(jí)。碎片率碎片率從 10% 上升到 80%壓縮耗時(shí)可能增加 5-10 倍。CPU 核數(shù)并行清掃和壓縮的加速比接近線性但受內(nèi)存帶寬限制。對(duì)象大小分布大對(duì)象多的堆壓縮耗時(shí)更長(zhǎng)。引用密度引用字段多的對(duì)象修復(fù)耗時(shí)更長(zhǎng)。11.2 典型場(chǎng)景參考以下數(shù)據(jù)基于 16 核 64GB 服務(wù)端場(chǎng)景的典型估算非實(shí)測(cè)場(chǎng)景Gen 0 耗時(shí)Gen 2 耗時(shí)是否壓縮低碎片 (20%)0.5-2ms10-30ms否中碎片 (20-50%)0.5-2ms20-60ms否高碎片 (50%)0.5-2ms50-150ms是LOH 壓縮N/A100-500ms是手動(dòng)十二、總結(jié)與實(shí)踐建議12.1 核心要點(diǎn)回顧清掃和壓縮是 GC 回收階段的核心它們的設(shè)計(jì)體現(xiàn)了按需觸發(fā)、零分配保證、并發(fā)優(yōu)化的思想清掃回收死亡對(duì)象通過 intrusive list 技術(shù)實(shí)現(xiàn)零分配耗時(shí)僅占 GC 的 10%。壓縮消除碎片將分散的空閑塊合并為連續(xù)空間但代價(jià)高30% 的 GC 耗時(shí)。按需觸發(fā)壓縮只在碎片率超過閾值時(shí)觸發(fā)大多數(shù) GC 只需清掃。并發(fā)優(yōu)化后臺(tái) GC 將清掃移到后臺(tái).NET 6 將壓縮的部分工作移到后臺(tái)。LOH 特殊處理LOH 不自動(dòng)壓縮需要手動(dòng)觸發(fā)代價(jià)極高。12.2 實(shí)踐建議基于對(duì)清掃和壓縮的理解以下是針對(duì) C# 開發(fā)者的實(shí)踐建議理解壓縮觸發(fā)條件壓縮只在碎片率超過閾值時(shí)觸發(fā)。如果你的應(yīng)用碎片率始終很低壓縮幾乎不會(huì)成為性能瓶頸。謹(jǐn)慎使用 LOH 壓縮GCSettings.LargeObjectHeapCompactionMode CompactOnce是核武器級(jí)別的操只在確實(shí)存在嚴(yán)重 LOH 碎片且影響分配時(shí)才使用。關(guān)注 Gen 2 堆大小Gen 2 堆越大壓縮耗時(shí)越長(zhǎng)。通過減少長(zhǎng)命對(duì)象的數(shù)量和大小可以降低壓縮耗時(shí)。避免對(duì)象生命周期混疊短命對(duì)象和長(zhǎng)命對(duì)象混在一起會(huì)導(dǎo)致碎片快速累積??梢酝ㄟ^分層設(shè)計(jì)將短命和長(zhǎng)命對(duì)象放在不同的類中來(lái)減少碎片。監(jiān)控碎片率使用 PerfView 或 ETW 事件監(jiān)控 GC 碎片率發(fā)現(xiàn)異常上升趨勢(shì)。理解零分配保證清掃階段不分配新對(duì)象所以不會(huì)觸發(fā)遞歸 GC。這意味著清掃的耗時(shí)是確定性的不會(huì)因 GC 嵌套而膨脹。12.3 清掃與壓縮的決策樹GC 回收階段 │ ├─ 標(biāo)記階段完成 │ │ │ ├─ Gen 0? │ │ └─ 清掃重建段天然無(wú)碎片 │ │ │ ├─ Gen 1? │ │ └─ 清掃隨 Gen 2 一起處理 │ │ │ ├─ Gen 2? │ │ ├─ 碎片率 50%? │ │ │ ├─ Yes → 清掃 → 壓縮 │ │ │ └─ No → 清掃不壓縮 │ │ └─ 并發(fā)清掃? │ │ ├─ Yes → 后臺(tái)清掃 │ │ └─ No → STW 清掃 │ │ │ └─ LOH? │ ├─ 手動(dòng)壓縮? │ │ ├─ Yes → 清掃 → 壓縮STW耗時(shí)高 │ │ └─ No → 清掃不壓縮 │ └─ 碎片率 70%? │ └─ 仍不自動(dòng)壓縮LOH 壓縮代價(jià)過高十三、深入壓縮的引用修復(fù)細(xì)節(jié)13.1 引用修復(fù)的挑戰(zhàn)引用修復(fù)是壓縮階段最復(fù)雜的部分面臨以下挑戰(zhàn)引用來(lái)源多樣棧引用、堆引用、靜態(tài)字段、句柄表、GC 內(nèi)部結(jié)構(gòu)每種來(lái)源的修復(fù)方式不同。引用目標(biāo)可能移動(dòng)被引用的對(duì)象可能在同一段需要修復(fù)、在不同段不需要修復(fù)因?yàn)?GC 內(nèi)部結(jié)構(gòu)已經(jīng)處理了跨段引用。修復(fù)順序必須先修復(fù)所有引用再移動(dòng)對(duì)象數(shù)據(jù)。否則修復(fù)時(shí)找不到舊地址。13.2 棧引用的修復(fù)棧引用的修復(fù)是最直接的部分。在壓縮開始前所有應(yīng)用線程被掛起GC 可以安全地掃描每個(gè)線程的棧幀// 棧引用修復(fù)簡(jiǎn)化示意 void FixStackReferences(Thread* thread) { for (StackFrame* frame : thread-frames) { for (RefLocation ref : frame-local_variables) { if (ref.is_gc_ref ref.target_in_compressed_segment) { // 更新引用為新地址 *ref.location ref.target-GetNewAddress(); } } for (RefLocation ref : frame-parameters) { if (ref.is_gc_ref ref.target_in_compressed_segment) { *ref.location ref.target-GetNewAddress(); } } } }棧引用修復(fù)的關(guān)鍵點(diǎn)線程必須掛起修復(fù)棧引用時(shí)應(yīng)用線程不能運(yùn)行否則棧內(nèi)容可能被改寫。寄存器也需要修復(fù)除了棧引用掛起時(shí)保存的寄存器快照中的引用也需要修復(fù)。修復(fù)是原地進(jìn)行的直接修改棧幀中的引用值不需要移動(dòng)棧本身。13.3 堆引用的修復(fù)堆引用的修復(fù)比棧引用復(fù)雜得多。存活對(duì)象內(nèi)部的引用字段可能指向同一段中的任何對(duì)象也可能指向其他段。只有指向同一段的引用需要修復(fù)// 堆引用修復(fù)簡(jiǎn)化示意 void FixHeapReferences(heap_segment* segment) { for (uint8_t* obj segment-start; obj segment-old_allocated; ) { if (obj-IsMarked()) { // 遍歷對(duì)象的引用字段 MethodTable* mt obj-GetMethodTable(); for (RefField* field : mt-reference_fields) { uint8_t* ref_addr obj field-offset; Object* target *(Object**)ref_addr; // 只修復(fù)指向同一段的引用 if (target segment-start target segment-end) { *(Object**)ref_addr target-GetNewAddress(); } } obj obj-GetSize(); } else { obj obj-GetSize(); // 死亡對(duì)象跳過 } } }堆引用修復(fù)的耗時(shí)取決于引用字段的數(shù)量。一個(gè)包含 10 個(gè)引用字段的對(duì)象修復(fù)時(shí)需要檢查 10 次、最多更新 10 次。對(duì)于引用字段多的對(duì)象如字典、列表修復(fù)耗時(shí)可能顯著高于簡(jiǎn)單對(duì)象。13.4 句柄表的修復(fù)句柄表的修復(fù)相對(duì)簡(jiǎn)單因?yàn)榫浔硎且粋€(gè)集中管理的數(shù)據(jù)結(jié)構(gòu)// 句柄表修復(fù)簡(jiǎn)化示意 void FixHandleTable(heap_segment* segment) { for (HandleEntry entry : handle_table) { if (entry.target segment-start entry.target segment-end) { entry.target entry.target-GetNewAddress(); } } }句柄表的大小通常遠(yuǎn)小于堆修復(fù)耗時(shí)可以忽略不計(jì)。但需要注意固定句柄pinned handle——固定句柄指向的對(duì)象在壓縮時(shí)不能被移動(dòng)壓縮算法需要跳過這些對(duì)象。十四、深入壓縮算法的變體14.1 傳統(tǒng)壓縮移動(dòng)對(duì)象前面描述的壓縮方式是移動(dòng)對(duì)象將存活對(duì)象從舊地址復(fù)制到新地址。這是最常見的壓縮方式優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單、碎片消除徹底。但移動(dòng)對(duì)象有一個(gè)問題指針不變性。如果外部代碼持有對(duì)象的原始指針如通過GCHandle的固定句柄移動(dòng)對(duì)象會(huì)導(dǎo)致指針失效。這就是為什么固定句柄指向的對(duì)象不能被移動(dòng)。14.2 間接壓縮更新指針另一種壓縮方式是不移動(dòng)對(duì)象只更新引用。具體來(lái)說不移動(dòng)任何對(duì)象數(shù)據(jù)。為每個(gè)對(duì)象維護(hù)一個(gè)轉(zhuǎn)發(fā)指針forwarding pointer指向壓縮后的邏輯位置。所有引用指向轉(zhuǎn)發(fā)指針而不是直接指向?qū)ο蟆鹘y(tǒng)壓縮移動(dòng)對(duì)象 舊地址: [ObjA][ObjB][ObjC] → 新地址: [ObjA][ObjB][ObjC][空閑] 引用 → ObjA 引用 → ObjA (新地址) 間接壓縮更新指針 舊地址: [ObjA][ObjB][ObjC] → 邏輯地址: [ObjA][ObjB][ObjC][空閑] 引用 → ObjA 引用 → 轉(zhuǎn)發(fā)指針 → ObjA (邏輯地址)間接壓縮的優(yōu)點(diǎn)是不需要移動(dòng)對(duì)象數(shù)據(jù)缺點(diǎn)是引入了額外的間接尋址每次引用都需要多一次內(nèi)存訪問。這在性能敏感的場(chǎng)景中是不可接受的所以 .NET Core GC 不使用這種方式。14.3 部分壓縮只壓縮熱點(diǎn)段還有一種優(yōu)化思路是只壓縮熱點(diǎn)段即分配最頻繁的段而不是壓縮整個(gè)代。這種部分壓縮的策略是識(shí)別熱點(diǎn)段分配最頻繁的段。只壓縮熱點(diǎn)段非熱點(diǎn)段保持原樣。非熱點(diǎn)段中的引用指向熱點(diǎn)段時(shí)通過 GC 內(nèi)部結(jié)構(gòu)進(jìn)行間接尋址。這種方式的優(yōu)點(diǎn)是壓縮范圍小、耗時(shí)短缺點(diǎn)是實(shí)現(xiàn)復(fù)雜、間接尋址有性能開銷。.NET Core GC 目前不使用這種方式但在 .NET 7 中引入了更細(xì)粒度的段級(jí)壓縮優(yōu)化。十五、結(jié)語(yǔ)清掃和壓縮是 GC 回收階段的兩個(gè)核心操作它們共同決定了 GC 的內(nèi)存效率和暫停時(shí)間。清掃通過 intrusive list 技術(shù)實(shí)現(xiàn)了零分配耗時(shí)穩(wěn)定且可預(yù)測(cè)壓縮通過移動(dòng)對(duì)象和修復(fù)引用消除了碎片但代價(jià)較高。.NET Core GC 的設(shè)計(jì)哲學(xué)是能不清壓就不清壓必須清壓時(shí)盡量并行化。通過碎片率閾值、budget 自適應(yīng)、后臺(tái) GC、并發(fā)壓縮等技術(shù).NET Core GC 在大多數(shù)場(chǎng)景下將壓縮的 STW 時(shí)間控制在幾毫秒到幾十毫秒之間。理解清掃和壓縮的機(jī)制有助于開發(fā)者寫出更友好的對(duì)象生命周期模式——減少碎片累積、降低壓縮觸發(fā)頻率、避免 LOH 碎片問題。在下一章中我們將深入后臺(tái) GC 的實(shí)現(xiàn)07-05看看 .NET Core GC 如何將清掃和壓縮的耗時(shí)進(jìn)一步攤薄到應(yīng)用線程的分配間隙中。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩少妇在线视频| 日韩免费性爱视频在线观看| 骚女高跟AV在线| 国产精品一区二区黄片| 亚洲春色欧美激情自拍| 免费久久一级毛片大黄| 午夜福利国产欧美日韩夜夜| 精产品久久| 91女人的网站| 婷婷丁香在线| 国产 日韩 欧美高清| 国产嫩草精品A88AV| 老女人碰碰在线碰碰视频| 嗯啊不要啊在线 | 国产最火爆久久国产网站网站| 精品国产乱码久久久久久免费| 国产五码丝袜屁眼| 欧美日韩婷婷中文| 亚洲和欧美裸体美女双飞视频| 五月天色图影视| 亚洲另类电影| 天天综合,91综合永久| 乱老女人一区二区视频| 成人三级片无码| 欧美日韩激情无码专区| 免费无码国产精品v片在线观看| 欧美97av| 色香综合| 色汉综合| 日韩操逼性鲍| 久久久无码av精| 黄色AAAAAAAAAAA大片| 久久久久免费看少妇A片特黄| 欧美啪啪色吧在线| 熟女人妻精品一区二区视频| 日韩激情毛片一级久久久| 猛猛干| av2014 日韩在线中文字幕| 97在线欧| 亚洲丝袜在线观看| 99re超碰| 欧洲特黄毛片免费看欧洲毛片| 日本不卡在线二区三区| 国产精品久久久| 99无码| 五月丁香激情四射| 国产无马在线| 麻豆这里只有精品| av亚洲天堂资源网站| 精品国产一区二区久久| 啊啊啊好舒服好爽啊啊啊视频| 不卡超碰护士AV在线免费播放| 国产人妻精品久久久一区二区三区 | 999精品乱码| 少妇熟女一区二区三区| 日本熟女不卡视频| 囯产操逼片| 综合久久六月久久婷婷| 五月丁香激情综合| 女人妻一区| 九九九九九九成人| 啊啊啊 在线| 人人妻人人爽| 日韩欧美大力操| 自拍偷拍 高清无码| 国产一区二区啪啪视频| 九九九久千久久激情蜜桃在线看 | 人妻一区二区三区视频| 日本三级韩三级99久久| 91美女色视频亚洲| 三级色影综合网| 欧美真人抽搐一进一出gif| 综合在线导航一区| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 亚洲中字慕不卡| 99国产女人| 欧美日韩*字幕一区| 日韩国产不卡在线视频| 婷婷六月色| 久久久久久久久久久97| 加勒比海色香蕉婷婷| 无码精品久久| 亚洲欧美大| 亚洲熟女乱综合一区二区三区| 欧美色图小说综合| 在线观看一级α片刺激高潮视频| 天天综合网站| 少妇久久久久久| 国产精品无码论坛| AV丝袜少妇| 97欧美综合网| 人人扣人人操| 91激情综合| 大香蕉淫人网| 九九热视频在线观看| 性性欧美| av网站免费线看| 人妻激情偷乱视频一区二区三区| 综合网亚洲1| 26uuu国产免费观看| 久久久草成人网站久久久草成人久久久草久久久 | 欧美色图 人妻| 夜夜爽夜夜高潮夜夜爽| 3571色综合一区二区二区| 欧美第二页午夜| 亚洲成人免费中文字幕| 91撸色网 玖玖网 欧美| 欧美亚洲色图另类国产| 蜜桃视频精品一区二区三区| 97视频免费| 色色国产| 97免费在线观看| 久久‘黄片视频| 久久久99999久网站| 欧美日韩色| 337p大胆噜噜噜噜噜91Av| 97超碰免费人人性爱| 操逼视频国产无套| www. 男人天堂成人在线| 思思热国产高清| 天天综合亚在线| 一二三区精品视频| 六月婷激情福利天堂69| 起碰97| 久久侵犯人妻爽爽爽| 欧美色蜜桃97| 精彩视频日韩| wwwxxx日本爽| 欧美激情一| 日本视频一区二区三区| 99热大香蕉伊在线| 日韩无码成人电影| 人人操人人肉久久精品| 国产九区| 操屄不卡视频| 欧美亚洲综合高清在线| 97欧美精品综合| 亚洲一区二区三区春色| 久久精品国产精品| 欧美精品日韩一区二区| 亚洲欧美清纯| 日韩美女高潮喷水视频| 操逼日韩无码| 日本淫乱女一区二区三区视频| 久久久艹艹艹| 三级AV入口| 熟女露脸激情自拍视频| 青娱乐av在线| 久久久久亚洲?V片无码V| 精品无码一区二区三区| 久视频在线观看| 国产精品 久久久精品一牛| 欧美成人国产精品| 看一级黄色视频| 超碰97网站| 91天美传媒在线观看| 高树玛利亚无码流出| 国产精品爆乳懂色蜜乳| 欧洲精品区| 久久精品国产亚洲AV高清演员表| 97超碰在线资源网站| 唐山老熟妇露脸啪啪叫| 日日操免费视频| 欧美综合自拍亚洲综合图| 激情综合五月婷婷| 99精品视频在线观看免费| 青青草依人大香蕉| 欧美 亚洲 综合 制服 另类| 激情网五月天| 婷婷深爱五月| 中文字幕123| 亚洲一二三四区| 午夜啊啊啊| 欧美黄色片AAAAA| 久久天堂| 欧美在线电影| 欧美综合网1| 91九九| 综合影院永久入口国产| 在线看污网站| 土豪酒店各种姿势玩弄极品幼稚| 亚洲情色五月天| 国产精品无码av在线 | 乱伦av.com| 久久久性爱| 欧洲与亚洲欧美精品中文字幕| 色播五月婷婷| 丁香五月天堂网| av天堂精品久久| 大学生美女口爆| 欧美淫乱视频| 亚洲一区制服诱惑| 91 综合 色| 欧美午夜精品久久久久久超碰| 日本操大逼| 成人片在线播放| 中文字幕美女91| 国产激情视频在线观看| 偷窥自拍A片| 啪啪资源网| 丰满人妻一区二区三区性色| 亚洲黄色视频在线观看视频| 综合伊人网12色| 人妻精品一区二区| 日韩精品-原创伙伴| 中文字幕精品三级久久久| 天堂资源站| 性老妇一区二区三区| 亚洲美女精品| 久久久久一本一区二区青青蜜月| 国产1769在线| 99热这里只有精品地址| 青娱乐久久艹| 五月丁香亭亭| 国产欧美精品日韩区二区麻豆天美| 日本熟女中文| 婷婷五月天av| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 97av在线观看| 精品国产乱码| 操高情无码| 国产精品极品美女视频| 色情综合| 亚洲欧洲美腿丝袜| 麻豆人妻少妇在线免费观看| 久久久穴999| 人妻社区男人天堂| 亚洲色图第一页| 偷拍新久久| 色原狠狠天天天| 亚洲欧美洲综合| 久九色| 91被操| 亚洲精品国产专区在线观看| 伊人色综合网电影| 麻豆天美制片厂网站视频| 丝袜视频一区二区在线播放国产中文| 香蕉色网| 天天综合色| 91人妻超碰| 国产亚卅97| 夜夜骑日日| 91欧美网| 9久9久| 日本高清一本二本免费不卡| 国产精品久久| 日韩精品在线观看网站| 亚洲狼狼干综合1| 欧美视频一区二区三区| 日韩欧美成人午夜福利| 99热自拍| 91碰碰| 2017av无码免费无线播| 免费看久久久性性| 天操天操夜操夜月月年年操操| 熟女人妻一区二区三区| 日韩一级特黄av毛片| caorenqi shipin| 亚洲吊色| 操逼操逼操| 免费在线观看国内色片网站网址| 亚洲瓯美色图| 玖玖久久久| 日日操丁香五月天| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 国产又黄又粗的视频| 亚洲天堂 视频你懂的| 欧美老熟另类| 天堂亚洲精品| 粉嫩绯色AV一区二区在线| 欧亚不卡| 屁股久久久久久| 国产乱伦一二三区| 午夜AV污污污| 青娱乐国产剧情av一区| 开心五月深爱五月| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 欧美九九九| 日韩精品在线视频在线观看| 小草三级久久观看| 亚洲国产97| 人人做人人妻人人夜视频| 欧美久久婷| 视频二区美腿制服人妻欧美| 国产男人又猛又粗又爽| 日本久久综合| 日韩av免费一级电影| 狠狠干综合| 999熟女精品| 成全在线观看免费观看| 日韩二三区| 囯产精品久久久久久久久久二区三区| 99热精品在线在线| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 91网站在线播放| 大屁股人妻女教师撅着屁股| 亚洲国产剧情少妇激情| 欧美的性爱网站免费| 色盈盈影院| www.亚洲黄色| 91超碰碰在线| 亚洲无码一区二区三区三州| 淫纸中9区| 国产精品午夜高潮呻吟久久av| 亚州色图片在线色| 蜜桃无码AV一区二区| 综合网亚洲1| 亚洲精品aa久久伊人| 国产精彩女在线观看视频| 久久av成人无码免费| 色偷偷超碰亚洲| 丁香五月性爱| 日本一级特级毛片视频| 久久亚码| 欧美亚洲日韩人妻在线观看| 91在线视频国产网站| 刺激性视频黄页| 无码高清少妇久久| 中文字幕诱惑制服人妻丝袜美丝袜美| 操逼不卡中文字幕| 四虎在线视频| 啊啊啊不要啊啊受不了了视频在线| 男人的天堂午夜av| 超碰97久| 歐美性天天| 久久久久久AV无码免费网站| www国产无码| 久草精品一区| 美女尤物福利视频| 黑人白女精品一区| 久久久久久久9999| 97精品97| 一本一道人妻久久一区二区三区| 亚洲古典另类欧美在线| 2024黄色视频| 九九九久| 超碰综合色| 天天干天天干天天| 91黑人无码激情在线| 五月天伊人| 亚洲成人黄色在线观看| 97伊人超碰| 久久免费看高潮毛片韩国| 日韩欧美午夜视频在线| 色在线视频导航| 欧美综合网站999| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 人妻人妻天天碰| 午夜免费视频1000| 久久久精品无码亚免费| 久久久久久久伊人精品| 精品999一区二区| 和协影院中文字幕三区| 精精夜夜| 亚州精人品大香蕉| 去干网最新版| 成人八戒网站| 大香蕉视频一二三区| 男人天堂资源| 久肏视频字幕| 美女爽爽爽刺痛洞洞| 欧美白嫩在线放| 96精品在线| 精品国产精品一区二区| 亚洲第一无码播放立川理惠| 芊芊操逼视频无码| 亚洲精品成人动漫在线| 日韩视频中文字幕| 亚洲国产精品无码AV久久| 日韩内| 91老熟女91老女人| 十八禁一区二区无码观看| 97人人中文网| 热久久九九热| 亚洲国产青青| 99精品人人爽| 亚洲欧美91√| 啊啊啊啊嗯嗯在线久久久| 蜜臀无码一区二区| 一区二区不卡免费| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 丝袜熟女一区二区三区| 成人免费不卡在线视频| 97任你吞精| 久久人人舔人人爽舔人人av片| 日韩国产不卡在线视频| 亚洲高清无码在线桃色| 久久av成人无码免费| 做爱A级亚欧| 欧美日韩国产三级黄色| 欧美亚洲中文字幕| 午夜欧美J进J出白浆流出久久久| 国产白领连续中出在线观看| 色鬼在线综合| 欧美中字二区| 怡红院成人av| 热久久无毒不卡| 热久久无毒不卡| 国产吹潮女在线观看| 91熟女少妇| 亚洲欧美碰碰| 1769一区| 精品久久久久av影院| 蜜臀操逼黄色视频操的好爽| 国产高潮AA片免费看| www.色操逼| 久久极品伊人| 国产精品对白内射| 青青草久草AV| 欧美一区二区三区成人性生活| 99热aaa| 激情黄色五月天| 国产丁香精品露脸视频| 日本熟女不卡视频| 91狠狠综合久久久| 欧美视频第二页| 97热视频在线观看| 青青11操操操操操操操操| 久久爱97| 人人摸人人入| 国产中文字幕曰本毛片| 色综合98| 男人天堂无码| 中国AAAAAA黄色片| 天堂8在线新版官网| 久久精品欧美一区蜜桃| 久久噜| 少妇大屁屁| 自拍内地三级在线观看| 你懂得91| 亚洲性少妇| 夜夜嗨视频| 久草免费在线一区二区| 日本精品人妻少妇一区二区| 亚洲综人网| 激情熟女12P| 熟女少妇一区二区三区| 日本天天操| 操操AV电影| 欧美精品久久| 久久 国产 无码| 久综合网| 91亚.色| 97视频网站| 日韩AV一起草| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊| 九九九九9999| 丁香五月性爱| 欧美图片色五月天| 欧美日韩香蕉| 夜夜 中文视频rt| 亚洲97成人在线观看| 欧美72网页| 91白嫩| 久久久国产亚洲精品系列| 欧美九九爱| 麻豆 美女 丝袜 人妻 中文| 国产AV超爽| 伊人 俄罗斯 a v| 麻豆国产97在线| 殴美牲| 精品97久久| 中字乱伦AV| 丝袜色综合| 操操操日本的逼| 亚洲AV不卡在线观看尤物| 97视频在线免费观看| 91人妻PORNY九色大屁股| 亚州国产成人精品女人久久| 亚洲综合精品国产一区| 亚洲成人帖图| 99综合网| 久久六六| 青青草在线视频欧美| 欧美成人A√在线一区二区| 久久色激情一区二区三区| 91视频在线观看18| 5252色欧美在线| 99re免费视频精品全部| 91熟女综合| 中国一级操逼视频| 欧美日韩中国x| 久久精品性| 91成人无码| 91 在线亚洲| 女性喷水高潮在线观看| 久久伦理视频久久大香蕉视频| 女欧美一区二三区| 中文久久96| 天堂8在线新版官网| 日韩99999| 91女网站| 日韩色欲久久一二三四区| 免费看国产大AB| 婷婷激情五月综合| 黄片www视频免费| 欧美国产一区二区三区麻豆传媒 | 一区二区三区免费岛国片| 欧美日韩中国x| 人妻AV 中文字幕的| 少妇久久| 人妻 丝袜美腿 中文字幕| 欧美,亚洲,日韩,v,天堂,手机在线观看| 亚欧国产无码精品在线| 熟女人妻精品一区二区视频| 91香蕉国产尤物视频| 东北女人操比视频| 久久亚洲天堂| 亚洲天堂区| 亚洲s在线观看| 天天操人人操狠狠插| 欧美九九99久久精品| 亚洲最大成人a毛毛片| 最新9久久久9免费视频| 九九九九九九九精品视频| 96久久久精品| 九九久精品| 人妻色偷色噜| 色性综合| 国产专区第一页| 久久久久国色αv免费观看| 欧美熟爽综合| 欧美日韩99| 亚洲国产婷婷在线播放| 天天综合-91入口| 日韩大香蕉精品在线视频| 日韩精品.久久精品.AV女优.天美传媒 | 欧美综合 站| 欧美色三级片91| 高跟丝袜AV专区国产| 中国AAAAAA黄色片| 一区二区三| 一区二区三区男人的天堂| 99色婷婷中文字幕乱色| 欧美精品在线观看| 亚洲综合小说另类图欧美视频激情小说色五月天 | 伊人九九九| 影音资源男人日韩| 98精品国产乱码久久久久久| 偷窥自拍亚洲色图| 丁香五月激情综合| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | {男男暴菊gay无套网站| 午夜久久一区二区无码中出| 99热超碰在线| 无码免费精品高清| 久久久久久日韩| 秋霞一集毛片观看| 熟妇综合一区二区三区| 亚洲综合首页| 91天天综合日韩欧美| 国产风韵犹存熟妇三区| 青草园大香蕉| 在线五区| 夜夜高潮夜夜爽国产伦精品| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 秋霞鲁丝午夜无码一区二区三| 亚州成人A√| 国产超碰国产97| 91麻豆天美国产欧美日| 国产蜜臀精品一区免费尤物| 国产欧美日韩在线观看麻豆传媒公司| 精品久久久久久亚洲| 五月丁香综合| 亚洲一区深夜| 狠狠久久四虎| 五月天伊人| 亚洲淫乱骚妇AV| 日韩精品作爱导航| 超碰在线1234区| 亚洲精品蜜桃久久久| 色色97爱| 欧美欧美啪啪视频| 操逼www.| 久操精品网| 日本 欧美 亚中文字幕| 黄页18禁| 免费看污网址| 欧美亚洲在线| 丝袜亚洲综合| 天天综合网日韩7799| 日本三级R| 日韩有码一区三区| 欧美熟女妇同| 欧美第五页| 欧美日韩97| 伦激情人妻另类人妻| 亚洲中文日韩欧美大香蕉视频| 国产精品99久久久www| 欧美综合色综合| 91网站18禁| 日韩性爱视频在线免费观看 | 亚洲人在线| 日本久久999| 久久岛国| 伊人网综合在线视频| 狠狠操狠狠爱| 超碰碰激情97+久| 久热伊人| 国产精品久久久久久久黄无码 | 熟女久久| 极品综合| 激情五月天婷婷| 97bbn| 亚州五月| 日本一区视频在线观看| 色性综合| 欧美最婬乱婬爆婬牲视频| 91精品人| 五月香婷婷| 亚洲天堂美臀在线| 一道α片欧美| 久久午夜伦| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 国产欧美后入| 视频一区二区免费在线| 91精品丝袜久久久久久| 男人的亚洲天堂| 搡老女人老91妇女老熟女| 青娱乐国产盛宴视频| 性色高清在线| 亚洲AV无码乱码| 婷婷丁香五月激情啪啪| 综合九九| 色色福利| 老熟妇一区二区三区啪啪| 日本一级真人黄色性爱视频| 亚洲操操操| 亚洲精品国产熟女久久久| 成全在线观看免费观看| 精品乱子一区二区三区99| 欧美 亚洲 第一页| 五月天激情婷婷| 涩亚洲欧洲| 色九九九九| 思思热在线视频免费| 欧美极品少妇交| 激情欧美97| 五月婷婷六月色| 东京热,男人的天堂| 国产亚洲精品自在线亚洲情侣| 精品综合久久久久久97| 51一区二区三区| 日韩 欧美 国产 麻豆| 先锋色眉乱伦资源| 中文字幕在线2| 激情综合网五月婷婷五月天| 亚洲日韩东京热一区| 久久久久久久国产视频| daxiangjiao你懂的| h无码动漫在线观看| 黄色av播放免不| 亚洲国产欧美中文永久| 欧美热图99| 亚码激情| 亚洲国产精品成人综合| 97超碰免费人人性爱| 亚一综合久久久久久久久久| 嫩草黄页| 97香蕉碰碰人妻国产欧美| 久草电影网| 99热精品在线观看| 黄色视频高清无码网站| 夜夜国产一区| 久久久久久久久成人av解说| 久久久月天| 欧美成人9797| 日本三级A片网站com| 走光一区92下载| 99热最新| 日韩三级在线观看网站| 久操影视| 七久久久| 久草视频观看视频在线| 欧美97se| 色盈盈影院| 日韩中文字幕在线视频观看| 亚洲熟妇A V黑人| 操B久久| 国产AV高清AV无码| 蜜臀中文字幕| 免费超碰97久久| 99热超碰| 国产99精品一区二区三区免费| 色777999综合| 不卡九肏| 久久精品美女一区| 欧美日韩在线视频网站| 老女人91| 色老汉色| 综合婷婷| 国产亚洲女v在线观看| 91亚洲图片| 中国操逼无码| julia国产在线 | 久久久少妇诱惑精品视频| 欧洲综合视频| 久久欧美性爱视频| 日本羞羞的视频在线播放| yazhouzaixian| 亚洲一区二区三区麻豆传媒| 秋霞视频一区二区| 日韩黄色av中文字幕| 哈哈操电影| 亚拍在线| 欧美72网页| 一区二区三区四区色图| 蜜臀操逼黄色视频操的好爽| 国产91福利小视频在线观看| 懂色AV网| 日本三级韩国三级美三级91| 97硬碰| 人人乐大香蕉| 大地资源在线观看中文第二页| 热无码中文亚洲H一道本一区二区| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | AV男人天堂网| 操死我了嗯嗯嗯| 91在线限制级| 无码欧美有限公司| 另类图片五月| 极品色社| 久久久九97| 色99色| 九九色婷婷| 深田咏美亚洲精品福利社| 欧美aaaaaaa| 隔壁邻居波多野结衣中文字幕| 色哟哟 日韩精品| 少妇久久久久久久| 综合久久9| 欧美色图91| 亚洲欧洲自拍| 国产99热| 亚洲欧美电影| 夜草网站| 国产又色又粗又黄又爽| 丰满美女一级毛片在线播放| 日本性感人妻91| 久久精品 六十路 熟女 欧美| 天天操夜夜操| 国产精品直播在线观看直播| 欧美精品成人一区二区在线观看| 欧美精品宗合| A级国产欧美激情在线| 高清有码一区二区| 蜜臀AV秘一区翔田千里| 色色网91| 成人乱码一区二区三少妇| 另类一区| 欧美春色| 91欧美综合| 人人弄人人摸| 正在播放国产精品一区| 岛国在线一区二区三区| 91精品国产麻豆国产自产在| 中文字幕在线观看视频www| 超碰人人妻| 男人的天堂激情| 91草草草| 夜夜久久久| 试看日韩黄片| 色官网色综合| 97福利视频| http://qxhbdz.com| 一级黄碟在线观看| 国产欧美日产一区二区三区 - 国产欧美日 | 色97干| 日韩欧无码一区二区三区免费不卡| 91人妻人人澡人人爽人人精品| 国产成年女人免费视频播放a| 93人人操人人| h在线看免费版在线看| 中文字幕一区二区三区人妻少妇在线| 色大香蕉97N| 天天欧美97| 日韩激情无码影院| 色牛牛AV| 亚洲国产剧情少妇激情| 蜜乳av一区二区三区四区不卡| 欧美—性—交—色| 亚洲无码国产精品久久| 色婷婷基地| 色情亚洲日本成人| 久操电影网| 日日操免费视频| 婷婷亚洲综合| 天天操人人操骚逼网站| 久久久久夜夜夜夜| 首页中文字幕中文字幕免费| 青娱乐亚洲热| 激情婷婷黑人91| 久久精品国产亚洲妲己影视| 婷婷九月色| 欧美熟女丝袜| 日语五十路和六十路亚洲国产精品| 中文字幕一区二区韩| 色一射色一射| 东京热91| 午夜福利免费福利视频| 久久av网| 夜夜爽夜夜爽| 亚洲色欲天天人妻无码系列专区| 超碰综合色| 日韩免费a级毛片无码a∨| 美女黄频a美女大全免费皮| 国产福利夜| 抽插亚洲无码| ?亚洲伊人伊成久久人综合网| AV天堂国产| 一本一道人妻久久一区二区三区 | 亚洲国产成人精品久久久国产成人一区二区三. | 欧美激情欧美精品| 色妇综合网| 久久精品色欧美aⅴ一区二区| 草久久久| 久草精品国产99| 91久久久久久久久久久| 欧美成人精品一区| av一区二区三区 中文| 亚州九九九精品视频| 极品综合| 大香蕉国产中文自拍| 久操电影| 午夜呻吟欧美| 午夜操一操| 熟妇人妻精品一区二区视频色欲| 一区e区三| 秋霞视频一区二区| 安微少妇操BBB| 欧美系列在线一区二区| 欧美亚洲se91| 国产精品美女在线一区| 嗯嗯啊好大| 午夜视频好爽啊| 亚洲情色在线| 园内精品自拍视频在线播放| 91美女在线视频| 小视频国产| 无码久| 久久riav中文精品| 99re在线视频| 久久一区二区三区入口| 噜噜噜噜天天狠狠| 久久99视频| 中文字幕三四五区| 18精品一区| 国产亚洲深夜激情| 91网站视频在线观看| 亚洲一级性爱视频免费看| 97精品视频网站| 乱伦Av网| 秘书高跟黑色丝袜国产91在线| 亚洲日韩精品在线播放| 日本韩国五十路六十路七十路老熟女作爱视频网站 | 久草福利在线资源站| 大香蕉日韩欧美| 五月婷婷综合激情| 精品欧美老熟女一二区| 欧美情色男人的天堂| 亚洲αv一区二区三区| 蜜桃香蕉久草精品在线| 亚码激情| 国内毛片无遮挡国产| 天天影视之亚洲综合网| 六月丁香网| 亚洲另类欧美精品| 91美女高潮| 国产女上位好爽在线| 国产野战露脸在线播放| 午夜福利合集| 99天天超碰| 国产三区免费在线观看| 婷婷五月天激情四射| 欧美性暴力猛交XXXX| 黄色av片三级三级三级免费看| 国产乱码久久久| 操我啊啊啊啊啊| 操逼无码一区| 日本精品五区| 91精品久久久久久久久久| 久操综合在线| 国产无马视频| 亚洲欧美综合| 中文字幕无码不卡啪啪| 嗯啊啊啊轻点视频 | 国产伦精品免编号公布| 日欧亚洲二三区大片不卡| 人人操人人摸超碰| 欧美亚洲宗合色性图| 精品一区二区三区蜜桃臀赵总 | 国产一区自拍欧美日韩| 久久伊人东京热| 午夜欧美神马久久久久| 丁香激情五月天| 岛国艾薇凹凸视频天堂| 尤物av网站免费在线播放| 33044男人的天堂深夜备| 色婷婷婷五月天激情四射| 免费视频无码| 留下AⅤ黄色片| 17c在线成人免费A片观看| 国产精品久久久久婷婷二区次| 加勒比伊人综合| 91 丝袜在线| 中文字幕在线24| 午夜免费福利视频一区| 日韩欧美tv一区二区在线观看| 天天干天天操天天操夜夜操天天操 | 激情婷婷丁香网| 国产天天看| 婷婷国产精品九区| 国产玖玖| 91九色精品熟女内射| 精品人妻av在线播放| 台湾一区国产高清在线| 中文字幕欧美日韩三级| 一本色道熟妇| 亚洲国产97在线精品一区| 91美女看B| 日本五十路在线| 91殴美大片| 日本三级日本三级三级人妇四虎| 91oumei| 这里只有精品视频| 亚洲人妻av| 久久98| 人妻AV在线| 丁香六月综合激情| 久久 国产精品 一区| 色婷婷九月天天综合| 成人亚欧免费视频| 亚洲av影音先锋| 久久九九国产精品| 人人操人人摸人 | 天天舔日美女视频| 亚洲在线综合| 久久久涩| 加勒比99999| 美女91| 日本成人在线不卡一区二区三区| 啊啊啊啊操死我| 天天伊人| 亚洲精品自拍| 国产精品ⅴ无码大片在线看.| 亚洲色欲天天天堂色欲网女| 欧美精品日韩久久久九| 手机在线中文字幕国产| 久久激情亚洲精品无码?V| 狠狠色噜噜狠狠狠狠狠色综合久久 | 久久高清欧美国产| 国产精品亚洲免费| 欧美亚洲日韩人妻在线观看| 天天肏美女| 中文字幕天天操| 免费97视频| 欧洲色综合| 91精品91久久久久77777俄罗斯老妇姓x| 欧美夜夜| 国产亚洲精品农村妇女| 立川理惠无码一区二区| 综合网欧美在线| 精品久久久久黄少妇| 国产精品久久久九九九| 天天综合网亚洲综合网| 日韩有码专区| 日韩无码三级影院| 偷看洗澡一二三区美女| 综合网欧美在线| 最新精品久久蜜桃 | 久久精品熟妇丰满人妻99| 豆花视频操逼网址| 日本亚洲熟女视频| 91亚洲黑人| 熟女高潮合集-永久久久-成人AV | 色欲三区| 99热99色| 久久久av爱| 亚洲熟女一区二区| 日韩成人无码| 亚洲精品精品一区二区| 999久久久久久久精| 在线情色电影 91大| 人妻丝袜日本| 亚洲1区2区三区高清中文字幕| 婷婷五月天综合网| 五月开心久久AV官网| 极品色综合| 啪啪AV导航| 国产最新AV| 久超碰这里只有精品| 极品综合| 九九久久九九久久| 婷婷精品国产欧美精品亚洲人人爽| 97爱综合| 丁香五月性| 学生妹天天看| 国产亚洲色停停久久99精品91| 丰满人妻av一区二区三区| 精品久久久久黄少妇| 亚洲色电影在线| 日本人人操人人操| 色色99| 91综合色| 五月天偷拍| 青青久日| 黄片无码在线制服| 欧美熟妇操操视频| 成人线上超碰| 91视频国品一二三区| 干b网| 郑州宾馆老熟女露脸啪啪| 打av高清| 日韩欧美性吧婷婷乱伦大香蕉| 天天插天天操| 91日日夜夜| 天天操天天干一区二区 | 韩国免费播放一级毛片| 成人欧美一区二区三区黑人一| 懂色av中文字幕一区二区三区天美| 成全动漫视频观看免费下载| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 老司机香蕉| 国产精品免费视频人成| 欧美成人国产精品| 性爱视频无打码在线观看| 亚91亚洲网| 午夜男女爽爽大片免费观看| 日本高清电影欧美色图| 密臀在线一区尤物| 91Chinese在线| 加勒比综合在线| 国产欧美一区激情交| 熟女91网| 日韩中文字幕视频在线观看| 欧洲性人爱视频| 91高清无码下载| 偷拍片久久| 国产偷拍自拍在线视频| 人人操人人插人人摸人人干| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 99久久久| 五月天婷婷久久| 欧美97爱| 亚洲综合另类欧美久久久| 中文字幕人妻资源在线| 国产亚卅97| 免费一级黄色录像影片| 热的中文 热的有码 热的国产| 国产浮力影院第1页| 久久久久婷婷精品av电影| 女人高潮抽搐喷水视频网站| 亚洲精品97久久中文字幕| 色婷婷久久| 四虎精品永久在线播放| 97欧美精品综合| 久久五十路熟女人妻| 十八禁电影伊人网| 九九综合色| 亚洲春色一区二区三区| 欧美猛交黑寡妇中文字幕| 中文字幕一区二区三区高清| 妇女乱色二区| 中文字幕 人妻不满 在线视频| 91丝袜在线观看| 日韩丝袜高跟制服在线观看| 黄色片大香蕉| 人人妻人人玩人人澡人人爽| 欧美97日韩| 首页中文字幕中文字幕免费| 久久久久白虎| 60秒试看最爽10分钟网站| 岛国黄| 少妇三p| 人人超碰在线观看黄| 国产亚洲日本精品在线| 欧美高清第一页| 日韩精品操少妇| 精品国产精品一区二区| 日产欧美电影一区二区三区| 999熟女精品| 97WW精品| 手机在线人成免费视频| 丝袜 中出 制服 人妻 美腿 中文字幕| 800zy一区二区| 成人福利视频网| 97视频在线免费观看| 丰满人妻一区| 色女网日韩| 欧美性爱另类综合| 东京热视频网| 91亚洲网站| 国产 大胆 对白| 极品五月天噜噜| 亚洲少妇中文字幕网址| 九七超碰| 久久久少妇诱惑精品视频| 操操逼视频| av日韩国产一区二区| www欧美91| 日韩一级二级三级免费看完整版国语版 | 一级性爱aaaa| 日韩免费簧片| 色路综合| 久热大香蕉网站| 一区麻豆 高清中文字幕| 熟女乱伦二区| 欧美精品99久久久**| 国产v亚洲v日韩v欧美v片另类| 91 国产丝袜在线播放-百度| 亚洲另类色图片| 亚洲日韩一区电影| av日韩在线观看电影| 无码外流操逼视频| 久久狠狠色噜噜狠狠狠狠97| 亚洲人精品久久久| 亚洲drav色图| 欧亚第一综合网| 天美麻豆精品视频99| 日韩成人电影AV| 国产精品久久成人免费| 日韩无码操逼片| 啪啪性爱免费视频| 七月丁香婷婷| 综合网 欧美| 亚洲综合在线91| av日韩中文字幕| 在线中文AV| 久久国模av| 欧美曰韩国产精品| 青青草伊人久久| 日本九九久久99播| 99久久这里只有精品| 嗯嗯啊中文字幕| 五月天综合网| 婷婷爱五月| 亚洲天堂,男人| 性吧在线视频| 激情第四色| 国产玖玖| 夜夜中出国产| 国产精品久久久亚洲一区| 亚洲人妻一区二区三区| 人妻少妇一区二区| 五月天婷婷影院| 口爆综合网| 偷拍 精品 另类 四区| 好淫网一二三视区| 成人精品电影| 色老汉色| 97 国产一区| 午夜毛片高清免费不卡| 色男人色天堂东京热| 污电影在线观看| 毛片99-全集电影手机免费观看完整-B029AV | 国产老太乱伦一区| 亚洲无码视频免费在线观看网址!| 成人毛片免费| 久综合国内精品自在自线| 韩国黄片aaaa|