免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

深入拆解ThreadLocal:線程隔離、弱引用、內(nèi)存泄漏與OOM排查

深入拆解ThreadLocal:線程隔離、弱引用、內(nèi)存泄漏與OOM排查 并發(fā)編程系列寫到這一篇前面的內(nèi)容基本都在圍繞一個詞打轉(zhuǎn)共享。鎖、原子類、并發(fā)容器本質(zhì)上都是想讓多個線程更安全、更高效地協(xié)作同一份數(shù)據(jù)。而ThreadLocal的思路是反著來的——既然共享這么容易出問題那干脆每個線程各存一份誰也別碰誰的。這個思路聽著簡單但背后牽扯到弱引用、內(nèi)存泄漏、線程池上下文傳遞一系列坑值得用一整篇來拆。ThreadLocal解決的是線程隔離問題不是并發(fā)原子性問題搞清楚這一點后面所有原理和實戰(zhàn)姿勢才立得住。這一篇我打算從最經(jīng)典的SimpleDateFormat翻車現(xiàn)場切入先讓你明白ThreadLocal到底解決了什么問題然后進(jìn)源碼拆一遍set/get/remove的完整鏈路重點講ThreadLocalMap的哈希設(shè)計和弱引用機(jī)制接著把內(nèi)存泄漏的形成鏈路徹底還原說清楚為什么線程池是重災(zāi)區(qū)再給出實戰(zhàn)層面的使用規(guī)范包括remove的幾種姿勢和上下文封裝思路最后記錄一次線上OOM排查實錄手把手走一遍jmap加MAT的定位流程。適合剛學(xué)并發(fā)編程的同學(xué)建立正確認(rèn)知也適合被ThreadLocal泄漏或臟數(shù)據(jù)坑過的人對照著排查。1. 從SimpleDateFormat翻車現(xiàn)場切入ThreadLocal到底解決了什么問題1.1 SimpleDateFormat在多線程下的崩潰如果你在Java后端寫過日期格式化大概率見過這個經(jīng)典事故一個SimpleDateFormat實例被多個線程同時調(diào)用parse()或format()結(jié)果日期串錯位、數(shù)字亂掉甚至直接拋NumberFormatException。private static final SimpleDateFormat SDF new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); public String formatDate(Date date) { return SDF.format(date); // 并發(fā)調(diào)用時偶發(fā)錯亂 }根因不復(fù)雜SimpleDateFormat內(nèi)部維護(hù)了一個Calendar對象format()和parse()過程中要反復(fù)讀寫這個共享的Calendar。多個線程同時操作同一份可變狀態(tài)又沒有同步數(shù)據(jù)被互相覆蓋自然就亂了。你單獨跑單測永遠(yuǎn)復(fù)現(xiàn)不出來一壓測就現(xiàn)原形。1.2 加鎖、每次新建和ThreadLocal三條路的取舍解決這個線程安全問題通常有三條路。第一條是給format()加synchronized或使用ReentrantLock。這能保證正確性但等于把并發(fā)的日期格式化全部串行化。想象一個支付系統(tǒng)每秒鐘幾千筆訂單都要格式化時間所有請求擠在同一把鎖上性能損耗肉眼可見。第二條是每次調(diào)用都new SimpleDateFormat()。這條路避免了共享可變狀態(tài)但頻繁創(chuàng)建對象會增加GC壓力。雖然JIT的逃逸分析在部分場景能把對象優(yōu)化到棧上但依賴編譯器優(yōu)化本身不可靠尤其在對象構(gòu)造較重、調(diào)用頻繁時效果并不穩(wěn)定。第三條就是用ThreadLocal給每個線程緩存一個SimpleDateFormat實例private static final ThreadLocalSimpleDateFormat DATE_FORMAT ThreadLocal.withInitial(() - new SimpleDateFormat(yyyy-MM-dd HH:mm:ss)); public String formatDate(Date date) { return DATE_FORMAT.get().format(date); }每個線程第一次get()時通過withInitial創(chuàng)建自己的實例之后一直復(fù)用。線程之間互不干擾不需要加鎖也不存在頻繁創(chuàng)建對象的開銷。這也直接點出了ThreadLocal的核心定位給每個線程一份獨立的私有副本把共享問題轉(zhuǎn)化成隔離問題。方案是否線程安全并發(fā)度對象創(chuàng)建開銷代碼侵入synchronized加鎖安全低串行無額外對象低每次new實例安全高高依賴GC兜底低ThreadLocal緩存安全高每個線程僅一次中需注意清理1.3 ThreadLocal解決的是線程隔離不是并發(fā)修改不少初學(xué)者把ThreadLocal當(dāng)成線程安全的Map來用這是個危險的誤解。ThreadLocal并不保證你對某個對象內(nèi)部狀態(tài)的修改是原子的它只是讓每個線程看到不同的對象實例。你往ThreadLocal里放一個共享的ArrayList再讓100個線程同時往這個List里add那該出事還是出事因為List本身還是同一個。所以在實踐中ThreadLocal的典型場景是那種每個線程天然該有一份但又不方便作為參數(shù)層層傳遞的東西事務(wù)連接、用戶登錄上下文、traceId、請求級別的緩存、框架層面的上下文對象。Spring的RequestContextHolder、MyBatis的SqlSessionTemplate在底層都用ThreadLocal綁定當(dāng)前線程的資源。理解這點你才不會被后續(xù)的內(nèi)存泄漏問題帶偏思路——它存儲的本質(zhì)是線程級上下文而不是并發(fā)安全容器。2. ThreadLocal的源碼級拆解線程本地變量是怎么存進(jìn)去、取出來的2.1 每個線程都自帶了兩個Map字段很多人以為ThreadLocal是把數(shù)據(jù)存在ThreadLocal對象里這是錯的。真正存儲數(shù)據(jù)的地方是Thread類內(nèi)部的兩個字段threadLocals和inheritableThreadLocals??碕DK源碼里Thread.java的字段定義一目了然ThreadLocal.ThreadLocalMap threadLocals null; ThreadLocal.ThreadLocalMap inheritableThreadLocals null;每個線程對象自帶一個ThreadLocalMap。當(dāng)你調(diào)用ThreadLocal.set(value)的時候本質(zhì)是把當(dāng)前線程的threadLocals這個Map取出來往里面塞了一條記錄key是ThreadLocal對象自身value是你傳入的數(shù)據(jù)。不同ThreadLocal實例就是同一個線程Map里不同的key。所以線程隔離的準(zhǔn)確含義是數(shù)據(jù)分散存儲在各個線程自己的Map里而不是存在ThreadLocal對象上。inheritableThreadLocals則是給子線程用的后面講子線程傳遞時再細(xì)說。這里先記住getMap(t)方法本身沒做什么高深的事它就是返回t.threadLocals這個字段。很多人在看源碼時卡在這個方法上其實它就是個訪問器熱詞里那句threadlocal getmap指的就是這一步。ThreadLocalMap getMap(Thread t) { return t.threadLocals; }2.2 set、get、remove的完整調(diào)用鏈先看set()在JDK 8里的實現(xiàn)public void set(T value) { Thread t Thread.currentThread(); ThreadLocalMap map getMap(t); if (map ! null) map.set(this, value); else createMap(t, value); }流程很直白拿到當(dāng)前線程取出它的threadLocals如果Map已經(jīng)存在就直接往里放不存在就創(chuàng)建一個新Map并塞入第一條記錄。createMap內(nèi)部會new一個初始容量16的ThreadLocalMap并把當(dāng)前ThreadLocal和value作為第一個Entry放進(jìn)去。再看get()public T get() { Thread t Thread.currentThread(); ThreadLocalMap map getMap(t); if (map ! null) { ThreadLocalMap.Entry e map.getEntry(this); if (e ! null) return (T)e.value; } return setInitialValue(); }線程的Map存在并且能找到以當(dāng)前ThreadLocal為key的Entry就返回里面的value找不到就調(diào)用setInitialValue()——它會執(zhí)行initialValue()方法默認(rèn)返回nullwithInitial就是重寫這個方法把初始值塞進(jìn)Map再返回。remove()更直接public void remove() { ThreadLocalMap m getMap(Thread.currentThread()); if (m ! null) m.remove(this); }看到這里你應(yīng)該已經(jīng)發(fā)現(xiàn)一個關(guān)鍵點ThreadLocal的線程隔離能力完全建立在每個Thread對象內(nèi)部的Map之上。這意味著只要線程還活著它Map里所有的value都不會被自動釋放。這條結(jié)論是理解內(nèi)存泄漏的起點。2.3 哈希散列為什么ThreadLocal敢用線性探測硬扛沖突ThreadLocalMap底層是個Entry數(shù)組初始容量16負(fù)載因子是2/3。每個ThreadLocal實例在創(chuàng)建時都會通過一個全局的AtomicInteger累加得到一個threadLocalHashCode增量是那個著名的魔數(shù)0x61c88647源碼里叫HASH_INCREMENT。private final int threadLocalHashCode nextHashCode(); private static int nextHashCode() { return nextHashCode.getAndAdd(HASH_INCREMENT); }為什么要定這個增量它和黃金分割比例有關(guān)對應(yīng)的是斐波那契散列。簡單說0x61c88647能保證ThreadLocal的哈希值在數(shù)組長度是2的冪時均勻地散布在槽位上最大程度避免多個ThreadLocal擠在同一條探測序列上。你不需要深挖數(shù)學(xué)推導(dǎo)只要記住結(jié)論ThreadLocalMap的鑰匙分布是經(jīng)過精心設(shè)計的所以在ThreadLocal數(shù)量不多的前提下用開放地址法線性探測解決沖突就夠了不需要像HashMap那樣掛鏈表、轉(zhuǎn)紅黑樹。定位槽位的語句是這樣的int i key.threadLocalHashCode (table.length - 1);table.length永遠(yuǎn)是2的冪所以按位與等價于取模而且比取模快。如果槽位被占就往后找空位找的時候如果遇到key為null的過期Entry還會順手做清理。這套機(jī)制讓ThreadLocalMap在低沖突場景下性能非常好代價是它不適合存儲大量key——如果你在一個線程里new了幾百個ThreadLocal線性探測的性能就會明顯劣化。這也是為什么實戰(zhàn)規(guī)范里強(qiáng)調(diào)能復(fù)用的ThreadLocal盡量復(fù)用。3. 弱引用不等于安全ThreadLocal內(nèi)存泄漏的完整鏈路分析3.1 Entry的引用鏈key是弱引用value是強(qiáng)引用先看ThreadLocalMap.Entry的定義static class Entry extends WeakReferenceThreadLocal? { Object value; Entry(ThreadLocal? k, Object v) { super(k); value v; } }注意Entry繼承自WeakReference也就是說Entry本身是個弱引用引用的是key也就是ThreadLocal對象。而value字段是一個普通強(qiáng)引用。整條引用鏈畫出來是這樣Thread 對象 └─ ThreadLocalMap └─ Entry[] └─ Entry (弱引用 - ThreadLocal key) └─ value (強(qiáng)引用 - 你塞進(jìn)去的數(shù)據(jù))弱引用的語義是當(dāng)GC發(fā)生時如果一個對象只被弱引用指向沒有任何強(qiáng)引用它就會被回收。也就是說ThreadLocal對象一旦在業(yè)務(wù)代碼里失去外部強(qiáng)引用比如方法局部變量用完了GC就有資格回收它Entry的key就變成null。這看起來是個保護(hù)機(jī)制框架不知道業(yè)務(wù)什么時候不再需要ThreadLocal所以用弱引用保證ThreadLocal實例本身可以被回收。但value沒有這層保護(hù)。value是強(qiáng)引用只要Entry還在value就一直在。而Entry被線程的ThreadLocalMap持有ThreadLocalMap又被線程對象持有。只要線程還活著這條鏈就斷不開。3.2 泄漏的完整形成條件我見過很多人把ThreadLocal內(nèi)存泄漏簡單歸結(jié)為用了弱引用這其實是誤解。弱引用恰恰是為了避免ThreadLocal對象本身泄漏真正的問題出在value的強(qiáng)引用鏈上。一個完整的泄漏需要同時滿足三個條件ThreadLocal對象失去外部強(qiáng)引用。最常見的是在方法內(nèi)部直接new ThreadLocal()使用方法執(zhí)行完局部變量沒了ThreadLocal實例只剩Entry里的弱引用GC一發(fā)生就被回收。線程是長生命周期的。線程池里的worker線程、Tomcat的請求處理線程都是長期存活的只要線程不死它的ThreadLocalMap就一直在。沒有后續(xù)操作觸發(fā)清理。如果后面再也不碰這個ThreadLocalMap底層的expungeStaleEntry()清理邏輯永遠(yuǎn)不會執(zhí)行value就變成永遠(yuǎn)無法訪問但一直被強(qiáng)引用的垃圾。典型的業(yè)務(wù)場景長這樣public void handleRequest(Request req) { ThreadLocalbyte[] holder new ThreadLocal(); holder.set(new byte[1024 * 1024]); // 1MB // 業(yè)務(wù)處理... // 忘記remove方法結(jié)束后holder失去外部引用 }如果這個handleRequest被丟進(jìn)一個線程池執(zhí)行每個請求都new一個ThreadLocal并set入大對象那么每次請求都會在線程的Map里留下一個key為null、value為1MB數(shù)組的過期Entry。線程池線程不死這些Entry就永遠(yuǎn)躺在那里。QPS稍微高一點內(nèi)存漲起來非??臁?.3 線程池既是泄漏放大器也是臟數(shù)據(jù)制造機(jī)線程池把線程長生命周期這個條件放大了。普通線程執(zhí)行完一個任務(wù)就結(jié)束整個ThreadLocalMap隨著線程銷毀被回收根本談不上泄漏。但線程池的worker線程是復(fù)用的它們一直在等新任務(wù)threadLocals這個Map也跟著一直存活。線程池還會帶來第二個問題臟數(shù)據(jù)串線。假設(shè)你寫了一個登錄用戶信息上下文private static ThreadLocalUser currentUser new ThreadLocal();任務(wù)A里執(zhí)行了currentUser.set(userA)但忘了remove任務(wù)A跑完worker線程回到池子里待命。任務(wù)B被分配到同一個worker線程如果任務(wù)B的代碼路徑在某個分支沒有主動set用戶信息它currentUser.get()讀到的就是用戶A的信息。輕則業(yè)務(wù)數(shù)據(jù)錯亂重則出現(xiàn)越權(quán)訪問。這類問題在代碼Review里很難發(fā)現(xiàn)因為它不是必現(xiàn)的完全取決于線程池把哪個任務(wù)分配給哪個worker。所以在線程池場景下ThreadLocal的正確用法不是用完等GC而是用后必須remove甚至要在任務(wù)最外層做防御性清理。3.4 ThreadLocalMap的兜底清理機(jī)制能救命但不能依賴JDK的設(shè)計者當(dāng)然知道這個坑所以ThreadLocalMap在幾個關(guān)鍵操作里內(nèi)置了清理邏輯set()時如果發(fā)現(xiàn)相同key的Entry會用新值覆蓋并對探測路徑上的過期Entry做清理get()未直接命中時會在getEntryAfterMiss()里線性向后找遇到key為null的Entry會調(diào)用expungeStaleEntry()把value置null、槽位置空rehash()時也會先全面清理再擴(kuò)容。這套機(jī)制確實能在很多情況下兜底比如你反復(fù)set同一個ThreadLocal舊的過期Entry大概率會被順帶清掉。它的問題是一切清理都必須由后續(xù)的set/get/remove操作觸發(fā)。如果線程執(zhí)行完任務(wù)后長時間閑置沒有任何關(guān)于這個Map的操作過期Entry就一直靜止在內(nèi)存里。你指望GC救你但GC根本碰不到value——它有一條完整的強(qiáng)引用鏈。結(jié)論很明確底層清理是優(yōu)化不是保障業(yè)務(wù)側(cè)的remove()才是唯一靠得住的釋放手段。4. 實戰(zhàn)守則如何正確使用ThreadLocal而不埋雷4.1 remove是底線三種清理姿勢先說最基礎(chǔ)的姿勢也是我要求團(tuán)隊必須遵守的用完之后在finally里remove無論正常返回還是拋出異常都必須執(zhí)行。private static final ThreadLocalString TRACE_ID new ThreadLocal(); public void process() { try { TRACE_ID.set(generateTraceId()); doSomething(); } finally { TRACE_ID.remove(); } }為什么必須在finally而不是在方法末尾因為方法中間拋了異常末尾的remove根本執(zhí)行不到然后殘留值就留在線程里了。線上拋異常是常態(tài)不是意外。很多泄漏就是在某個異常分支里漏掉了清理。第二種姿勢是在框架的攔截器或過濾器中統(tǒng)一清理。以Spring Web應(yīng)用為例如果你需要請求級的上下文更推薦用HandlerInterceptor的afterCompletion方法public class TraceIdInterceptor implements HandlerInterceptor { Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { TraceContext.clear(); // 內(nèi)部調(diào)用ThreadLocal.remove() } }Filter或者Interceptor的好處是入口和出口都在框架層面業(yè)務(wù)代碼不需要在每個方法里try-finally漏清理的概率大大降低。第三種姿勢是封裝成AutoCloseable配合try-with-resources使用public class AutoThreadLocalT extends ThreadLocalT implements AutoCloseable { Override public void close() { remove(); } }這種寫法適合那種只在單個方法里臨時用的場景代碼會更緊湊但我個人更推薦前兩種——因為try-with-resources要求每個用到的代碼塊都正確寫語法而Filter/Interceptor是集中式治理對團(tuán)隊更友好。4.2 static修飾符到底該不該加這是一個經(jīng)常被問到的點。結(jié)論分兩種情況。如果ThreadLocal是Spring單例Bean的成員變量那實例只有一份ThreadLocal對象長期存活相當(dāng)于static。這種情況下用不用static修飾影響不大但為了語義清晰統(tǒng)一用private static final。真正危險的是在短生命周期對象里持有ThreadLocal。比如一個每次請求都new的Helper類里面定義了一個實例字段ThreadLocalString holder。Helper對象在請求結(jié)束時失去引用ThreadLocal對象也失去強(qiáng)引用GC把這key回收后Map里就剩一個value還在。如果這個請求跑在線程池里下次任務(wù)又new一個新的Helper、新的ThreadLocalMap里的過期Entry持續(xù)累積。這種寫法是我在代碼Review里看到最多的隱性雷。所以我的建議是ThreadLocal實例能定義為static final就優(yōu)先static final。它不會讓你少寫remove但能避免ThreadLocal對象本身被GC回收導(dǎo)致value失聯(lián)這條更隱蔽的泄漏路徑。4.3 統(tǒng)一封裝上下文工具類把ThreadLocal關(guān)進(jìn)籠子業(yè)務(wù)代碼里散落使用ThreadLocal最大的問題不是語法錯誤而是管理混亂。今天你在A服務(wù)里set了個用戶ID明天B服務(wù)也想用又不好意思改A的代碼于是自己又new了一個ThreadLocal。線程Map里的key越來越多清理也越來越不徹底。我建議每個項目針對線程級上下文做統(tǒng)一封裝。比如這樣一個TraceContextpublic final class TraceContext { private static final ThreadLocalString TRACE_ID new ThreadLocal(); private TraceContext() { } public static void setTraceId(String traceId) { TRACE_ID.set(traceId); } public static String getTraceId() { return TRACE_ID.get(); } public static void clear() { TRACE_ID.remove(); } }然后在整個調(diào)用鏈的最外層——Filter、Interceptor、或者異步任務(wù)的入口——統(tǒng)一調(diào)用setTraceId統(tǒng)一在finally里調(diào)用clear。業(yè)務(wù)代碼只通過靜態(tài)方法讀寫不需要知道底層的ThreadLocal長什么樣。這樣做還有一個好處以后想換成TransmittableThreadLocal只需要改這一個類不用滿項目找散落的ThreadLocal.set/get。4.4 子線程與線程池的變量傳遞InheritableThreadLocal的局限和TTL的解法很多場景需要把父線程的上下文傳到子線程比如異步任務(wù)里記錄traceId。JDK提供的原生方案是InheritableThreadLocal。它的實現(xiàn)原理是父線程創(chuàng)建子線程時把父線程的inheritableThreadLocals里的Entry復(fù)制一份給子線程。注意是創(chuàng)建線程那一刻的快照而且這個復(fù)制是淺拷貝——如果value是可變對象父子線程持有的是同一個引用并發(fā)修改照樣有競爭問題。InheritableThreadLocal最大的局限在于線程池。線程池的worker線程不是每次任務(wù)都新建的它早在提交任務(wù)之前就創(chuàng)建好了。父線程想傳值給worker線程根本不觸發(fā)線程創(chuàng)建過程InheritableThreadLocal完全無效。而且即使你第一次提交任務(wù)時值傳過去了下次提交新值也不會更新因為worker線程不會再走創(chuàng)建線程復(fù)制這條路徑。這個場景下業(yè)界更常用的方案是阿里開源的TransmittableThreadLocal簡稱TTL。它的思路是在任務(wù)提交時捕獲當(dāng)前線程TTL值的快照任務(wù)真正執(zhí)行前把快照回放到執(zhí)行線程上執(zhí)行結(jié)束后恢復(fù)執(zhí)行線程原有的值。使用方式很簡單ExecutorService executor TtlExecutors.getTtlExecutorService(executorService); executor.submit(() - { // 這里能正確讀到提交任務(wù)時的上下文 });不引入依賴包的情況下你也可以自己包裝Runnable在run()前后手動set/remove實現(xiàn)思路和TTL一致提交時快照執(zhí)行前回放執(zhí)行后清理。只不過TTL把這個邏輯封裝好了還支持Java Agent方式自動透傳。如果項目里大量使用線程池且需要傳遞traceId、用戶身份這類上下文建議直接把TTL納入基礎(chǔ)設(shè)施。5. 一次線上OOM排查實錄如何定位到ThreadLocal泄漏5.1 現(xiàn)象老年代持續(xù)上漲但GC后回不去之前接手過一個異步處理服務(wù)現(xiàn)象很典型JVM老年代使用率從啟動后一路爬升Full GC之后也只是從95%降到80%很快又漲回去。接口響應(yīng)時間越來越長最后每天固定OOM一次只能靠重啟續(xù)命。第一反應(yīng)肯定是先看GC日志和內(nèi)存曲線。用jstat看一眼jstat -gcutil pid 1000輸出里重點觀察FGCFull GC次數(shù)和O老年代使用率。如果YGC很頻繁、FGC也在持續(xù)增長但老年代使用率始終處于高位說明堆里有大量對象無法被回收。這時候就要考慮是不是有對象被長生命周期對象比如線程、類加載器、緩存持有形成了事實上的泄漏。值得提醒的是不要一看內(nèi)存高就無腦調(diào)-Xmx。調(diào)大堆只會推遲OOM時間不會解決問題。正確步驟是把堆dump下來看對象構(gòu)成。5.2 用jmap導(dǎo)出堆快照再用MAT定位可疑對象低峰期用jmap導(dǎo)出堆快照jmap -dump:live,formatb,fileheap.bin pid注意live參數(shù)會先觸發(fā)一次Full GC生產(chǎn)環(huán)境盡量在業(yè)務(wù)低谷操作或者改用jcmd pid GC.heap_dump heap.bin。dump文件通常很大本地用MATMemory Analyzer打開。打開后先看Histogram直方圖按retained heap排序。在這個服務(wù)里我很快就看到了一個熟悉的自定義類RequestContext有幾萬個實例retained heap占了差不多1GB。這個類為什么會單例持有那么多實例肯定是被某個容器類緩存了。接下來右鍵這個類選擇List objects - with incoming references看看引用它的是什么。你會看到大量引用來自java.lang.ThreadLocal$ThreadLocalMap$Entry這就基本鎖定方向了這些對象都被ThreadLocalMap里的Entry強(qiáng)引用著。5.3 順著GC Roots路徑確認(rèn)是ThreadLocal鏈確認(rèn)這一步需要右鍵對象選Path to GC Roots - exclude weak references。如果之前看過一遍ThreadLocal的引用鏈此刻再看這條路徑會非常清晰Thread (worker線程) └─ ThreadLocalMap └─ Entry[ ] └─ Entry └─ value (RequestContext實例)路徑里能看到Thread對象是GC Roots因為線程池里的worker線程都活著正等著新任務(wù)。順著路徑往下還會發(fā)現(xiàn)一個關(guān)鍵細(xì)節(jié)很多Entry的key已經(jīng)是null了。這說明ThreadLocal對象本身已經(jīng)被GC回收但value還躺在Entry里。這就是典型的key弱引用被回收、value強(qiáng)引用殘留的泄漏形態(tài)。如果只看Entry數(shù)量還不足以定位到代碼就再切到線程棧視圖把目標(biāo)Thread的線程棧打出來看看這個線程最近在執(zhí)行什么業(yè)務(wù)然后回代碼里找這個業(yè)務(wù)鏈路上的set()調(diào)用。我當(dāng)時就是從worker線程綁定的任務(wù)名一路追到一個公共的異步切面發(fā)現(xiàn)在切面里為了記錄traceId每次請求都new ThreadLocal()set完之后沒有remove方法結(jié)束ThreadLocal失去強(qiáng)引用剩下的value就全留在線程池線程的Map里了。5.4 修復(fù)與驗證一行remove解決幾百MB內(nèi)存修復(fù)方案很簡單把那個切面里的new ThreadLocal改成靜態(tài)常量并在finally塊里調(diào)用remove()。public class AsyncTraceAspect { private static final ThreadLocalString TRACE_ID new ThreadLocal(); public Object around(ProceedingJoinPoint point) throws Throwable { try { TRACE_ID.set(buildTraceId()); return point.proceed(); } finally { TRACE_ID.remove(); } } }改完之后再用jmap導(dǎo)一次堆用MAT對比修復(fù)前后的對象數(shù)量。最直觀的驗證指標(biāo)有兩個一是RequestContext的實例數(shù)從幾萬降到了和線程數(shù)同一量級二是老年代使用率在幾次Full GC后穩(wěn)定在30%左右不再持續(xù)爬坡。這個效果不是靠調(diào)參數(shù)調(diào)出來的是真正把引用鏈斷了。排查過程中還有一個容易忽略的點如果你在MAT里用exclude weak references查不到GC Roots路徑不要慌。key為null的Entry本身已經(jīng)斷開了對ThreadLocal的引用MAT的弱引用排除規(guī)則可能導(dǎo)致路徑不顯示。這時候換include all references再查或者直接在Dominator Tree里找ThreadLocalMap通常能看到完整的引用鏈。這次排查給我留下的最深印象是ThreadLocal泄漏很少是單個大對象的問題更多是業(yè)務(wù)對象被線程池線程長期持有的組合問題。你單看每個對象都不算大但線程池有幾百個線程每個線程攢幾百個過期Entry就是幾百MB甚至上GB的垃圾。它在代碼Review階段極難發(fā)現(xiàn)因為所有set/remove分散在各個方法里沒有一個集中的審視點。這也是為什么我會在前面的實戰(zhàn)部分反復(fù)強(qiáng)調(diào)統(tǒng)一封裝和攔截器清理——線上少踩一個坑比事后排查輕松太多。最后分享一個我個人的習(xí)慣線上服務(wù)里如果需要排查ThreadLocal相關(guān)的問題除了jmap和MAT也可以用Arthas的watch命令觀察某個上下文類的set和remove調(diào)用次數(shù)。如果發(fā)現(xiàn)set被瘋狂觸發(fā)但remove幾乎不觸發(fā)那基本不用dump堆也能判斷問題出在哪了。這套組合拳下來ThreadLocal這個線程私有的小籠子在你手里就不再是黑盒了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
aaaaaa片| 欧美日韩国产日本精品四虎网网站物 | 婷婷五月av| 久久婷婷五月天| 五月激情小说| 这里有精品| 五月婷婷啪啪啪| 99热综合在线| 婷婷五月天电影区小说区| 操碰久| 综合色图区| 激情综合网激情五月网| 看黄的网站18禁| 99热在线观看| 亚洲日日操| 丁香五月综合亚洲| 婷婷色无码| 久久五月天 91| 天天日夜夜拍| 亚洲综合色棒| 国产精品色一哟哟| 天天做天天要天天爽| 综合网狠狠| 香蕉97碰碰碰欧美| 国产亚洲成AV人片在线观黄桃| 免费AV在线| Va另类视频| 啪啪一区| 1024手机在线观看看片_日韩精品| 成人av在线网| 色五天综合| 五月天婷婷社区| 五月婷婷六月情| 五月激情婷婷开心| 狠色色狠网| 夜夜躁狠狠 | 蜜乳av一级av| 婷婷五月精品| 日本wwww在线| 五月激情综合性爱| 色五月婷婷操逼| 色婷婷av综合网| 激情综合色图| 另类激情首页| 天天成人综合| 五月婷婷六月丁香免费| 五月天丁香啪啪综合| 丁香花五月天激情| 五月天色图| 色人久夂| 五月丁香A片| 五月丁香精品| 五月激情丁香久久综合网| 大香蕉精品视频| 六月婷婷色色色| 五月婷婷综合性爱噜噜| 国产ava| 99热日| 色婷婷久久7777| 97luluse| 99久在线精品99re5热视频| 91jiuseshunv| www.久久久久久久| 99这里只有免费的精品| 色婷婷色人人射| 武汉美女啪啪视频免费一级片| 99久久综合网| 精品丁香五月天在线播放| www99热| 久久人妻人人| 三级三久久线久久99久目本WW| 久热99| 二色av| 色99视频| 色综合色色色色色色综合| 97婷婷五月| 99内射视频| 久久草中文日韩欧美| 免费婷婷| 九九九成人在线视频| 狠狠色激情综合| 色99热| 色爱亚洲| 操操碰| 亚洲成av人影院| 国产精品激情AV久久久青桔| 99精品女人天堂| 久久性刺激| 丁香亭亭久久| 婷婷色五月在线视频| 欧美狠狠色| 操碰91| 亚洲视频在线观看| 97超碰在线免费观看| 99精品久久久久久久婷婷| 包操45分钟网站| 中文网av| 思思久久精品| 色97啪啪| 色欲五月天| www.五月天激情| 99无码超碰| 欧美日韩成人在线| 99啪啪网| 丁香五月停停av| 欧美丁香五月97色| www.婷婷五月.com| 婷婷 久综合| 九九热在这里只有精品| 亚洲99热| 99久久久久久久| 激情色中文| 伊人色欲五月天| 操日视频| 91碰碰视频在线观看| 大香蕉久热| 六月伊人婷婷| 99热这里只有精品66| 九九爱激情| 国产免费一区二区三州老师F1F1| 视色综合| 色偷偷AV亚洲男人的天堂| 丁香五月天激情四射网| 噜噜噜精品欧美成人在线观看| 色婷婷www| 综合久久婷婷99| 九色视频91疯狂| 天堂草在线观| 蜜臀AV在线观看| 永久免费一区二区三区| 99久久性爱| 激情丁香婷婷| 色婷婷小说| 天天撸天天干天天插| 99爱在线精品视频免费观看| 久久99精品久久久久子伦| 狠狠久久婷五月综合色| 天天爽人人综合免费7799| 影音先锋男人资源站一区二区| 亚洲婷婷丁香五月亚洲| 亚洲人妻av| 六月婷婷色色色| 五月婷婷激清网| 天天干夜晚夜操| 亚洲AV另类| 亚洲射激情| 泰州成人视频| 99免费成人网| 超碰在线国产| 亚洲色婷婷激情| 大香蕉啪啪网| 91婷婷丁香五月天免费视频网站| 激情av| 无码A片一区二区免费| 99热只有精| 亚洲色无码A片一区二区麻豆| 五月丁香综合| 天天综合网在线| 激情九九六月激情免费视频| 99综合视频| a级毛片一区二区免费视频| 婷婷六月天精品| 日本一级一级一级一级| 久久欧洲久久| 办公室少妇激情呻吟A片在线观看 白人荫道BBWBBB大荫道 | 《蜘蛛女》梁铮1995| 亚洲视频在线网站| 久久九九蜜| 99热这里有精品| 综合五月天亚洲婷婷| 97 A I色色| 色婷丁香| CHINESE熟女老女人HD视频| 婷婷五月小说色综合| 97人人干人人操| 九九热视频99| 激情丁香五月| 激情小说五月天中文字幕| 色五月av| 天天色色婷婷| 第1影院之五月婷婷| 综合久久六月| 久99久精品| 无码激情| 天天综合色综合| 91人人人人人| 激情深爱五月天| 97色图片中文字幕视频在线观看| 久久久网站| 97碰在线视频| 中国操逼99| 综合视频五月| 操逼视频一区| 北京熟妇搡BBBB搡BBBB| 色吧五月婷婷| 久久九九爽| 丁香五月手机在线| 思思精品久久艹| 欧美日韩成人h| 五月婷婷香| 色吊丝永久访问网址| 92久久| site:hcxsz888.com| 精品一二三区久久AAA片| 天天射射夜| www,setingting| 婷婷狠狠色| 婷婷九月综合| 九九视频在线观看视频6| 狠狠狠狠狠草| 中文字幕av久久爽一区| 五月婷A V在线| 日韩九九| 草美女在线观看视频在线播放| 国产69久久久欧美黑人A片| 三级大香蕉网| 久久久中文| 精品色色| 大香蕉婷婷五月天| 九九热这里只有精品31| 九月婷婷综合| 久久色吧| 成人午夜视频精品一区| 日本九九网| 亭亭丁香aV| 丁香婷婷AV| 99热在线观看| 亚洲99在线| 91|九色|动漫| 久久婷婷超碰| 日韩无码专区| 日本色久| 热99精品视频| 丁香无五月网| 成年人夜夜喷水| 极品人妻VIDEOSSS人妻| 日韩无码专区| 99热免费观看| 色五月丁香六月欧美综合| 成片免费播放| 婷婷五月色情| 区欧美日韩成人| 香蕉婷婷| 婷婷成人五月天| 色婷婷精品小视频| AV九九| 色婷婷av综合网| 日本99热| 人人妻人人澡| 激情五月婷婷视频一区二区三区| 丁香五月色情| 国产又黄又爽又激情不遮挡视频在线观看| 色婷婷狠狠爱| 91碰碰视频| 亚洲AV日韩在线观看| www.狠狠| 日韩高清成人| 99这里热| 久久丁香五月| 人人干人人操人人摸| 丁香婷婷射| 色狠狠综合| 99久久久久久久| 五月开心播播网| 99热这里只有精品22| 丁香五月婷婷视频| 这里只有精品1| 色情五月天A片| 天天草天天爱| www.五月激情.com| 天天操天天爽天天爱| 日韩成人av在线| 欧美日本高清视频99| 尤物一区二区| 激情久久伊人| 丁香六月婷婷操逼网| 精品一区二区三区四区五区六区| 国产精品第一国产精品| 蜜桃人妻无码AV天堂三区| 黄色AV日韩| www.五月天婷婷| 亚洲色爱综合| 人人草人人看| 久久超视频| 五月婷婷色| 丁香婷婷基地| 六月婷婷激情| 亚洲精品视频电影| 97在线精品| 五月婷婷六月丁香综合| 99热.com| 色婷婷成人做爰A片免费看网站| 99热在线只有精品| 亚洲人妻av伦理| 五月丁香综合精品| 天天拍久久| 秋霞网在线观看理论91| 久久这里有精品视频在线免费观看| 26uuuavcom| 777精品成人a v久久| 色婷婷丁香五月丁香| 五月丁香婷色| 人人妻久久妻| 99精品一二三四视频| 久久久ww| av九九| 色色热| 色爆五月| 天堂亚洲 在线| 亚洲久久日| 久久9久久| 另类图片色五月| 五月开心婷婷网| 思思热久久阴99| 狠狠色狠狠干| 国产精品热搜丁香五月婷婷| 99re热在线视频观看| 91婷婷色五月| 天天干天天爽| 色综合久久8| 激情综合在线播放| 丁香五月精品视频| 六月狠狠综合| 变态另类9| 成人片在线播放| 成人在线观看精品| 亚洲情色一区| 激情五月婷婷伊人| 婷婷综合视频| 色色99| 97超美国视频在线观看| 欧美精品99| 亚洲色婷婷色| 五月丁香六月婷婷姐| 天天色丁香| 高清无码中文字幕aVDV| 999热这里只有精品| 欧洲亚洲免费视频9| 婷婷久久五月天| 激情都市另类| 91久久99久久91熟女精品| 婷婷五月天综合蜜桃| 五月天婷婷人妻| 成人AV在线网站| 久久国产一区二区三区| 97日在线视频| 啪啪啪五月天| 久久综合九九| 色色五月丁香婷婷综合| 操笔无码| www.久久久久久久| 97搞在线| 激情婷婷内射| 永久免费一区二区三区| 精品欧美性爱超级爽| 亚洲一区二区无遮挡A片| 五月丁香色婷婷伊人| 激情综合亚洲色婷婷五月| 亭亭色网| 九九爱精品网站| 色优久久| 五月丁香婷婷综合视频| 天天久综合网永久入口18| WWW.久久久久久久| 激情五月婷婷色播网| 99自拍视频在线观看| 婷婷五月花.97| 日韩影院三级| 亚洲色频| 婷婷丁香五月天激情四射| 色婷婷AAA| 婷婷五月天BBw| 六月天婷婷| 国产色视频网站2| 青青五月天婷婷| 99精品视频免费在线播放| 亚洲热久久| 六月丁香啪啪啪| 日本色99| 综合XX网| WWW.久久久久久久久久久久久| 热久久77777| 色婷婷先锋| 大香蕉五月婷婷丁香| 五月丁香网视频| 六月婷婷综合| 久久久五月天网站| 五月丁香婷婷六月| 嫩草视频。| 天天综合五月| 午夜天堂一区人妻| 亚洲婷婷月丁香五月| 99操视频| 久久婷婷色| 欧洲色| 微拍92| 五月天精品综合在线| 丁香色婷婷| 婷婷丁香五月综合| 欧美va在线| 激情啪啪五月| 激情综合网五月丁香| 4399高清无码视频| 亚洲成人网站在线播放| 婷婷五月天亚洲综合| 天天爱夜夜爽| 九九中文字幕九| 婷婷五月在线播放| 亚洲成Av人片乱码色第1集| 新伍月婷婷| 亚洲综合五月天婷婷| 插插网爽妇五月丁香| 欧美色婷婷| 色婷婷成人丁香| 激情综合五月婷婷| 日韩黄黄| 五月婷婷激情视频| 人人操大| 久久总和99| 人人性久久| 激情五月天综合网| 色婷婷综合久久久久| 99日本黄站| PORNY九色9l自拍视频成人| 色色激情五月| 九九色中文| 色色色免费视频| 亚洲色五月| 九九aV| 亚洲 日韩色色| 夫妇交换刺激做爰| 六月 丁香 视频| 性色综合网| 天天干天天爽| 久思思久视频| 久草婷婷在线| 五月激情天| 亚洲成人高清在线| 任你艹| www.91有码.com| 大香蕉婷婷婷| 久久激情五月天| 久久婷婷五月综合97色一本| 九九九激情综合| 婷婷开心久久| 97精品欧美91久久久久久久| 色色99| 婷婷色网站| 极品另类| 北京熟妇搡BBBB搡BBBB| 久久开心五月天激情| 五月天激情网址| 婷婷色色五月| 色婷婷丁香社综合| 99re这里只有| 99热99色| 五月丁香六月婷婷综合在线| 欧美色必爱| 久9精品视频| 色色色视频免费无码 | 成人综合AV| 九九热在线观看6| 午夜无码熟熟妇丰满人妻| 五月丁香淫淫婷婷婷| 色色五月天网站| 另类天堂| 深爱五月婷婷| 亚洲色情一区二区三区四区| 丁香五月综合无码趴趴| 中文字幕欧美日韩VA免费视频| 五月婷婷六月少妇激情| 精品婷婷五| 九月婷婷人人操人人舔人人爱| 婷婷五月综合久久中文字幕| 天天日天天操天天干| 99色五月| 亚州成人综合在线| 91男人操女人视频| 亚洲最大视频| caopeng97人人| 婷婷五月丁香六月| 日本色五月| 《战争与艾拉》完整版| www.99热在线观看| 一本久婷婷综合| 伊人五月综合网| 天天综合亚洲| 五月色情网| 五月婷在线影院| 五月婷婷丁香日韩在线| 天天日天天爽| 婷婷九月丁香| 六月激情网| 国产精品久久久久久久久久久久 | 久久视频这里有精品99| 欧美黑人巨大猛烈cuckold| 成人五月天丁香婷| 9久热在线精品| 亚洲A片成人无码久久精品青桔| 色色色在线观看| 亚洲成人乱码av网站| 九九综合九九| 色99在线看| 91黄色五月天视频| 国产毛多水多女人A片| 殴美日比视频| 天天干天天爽| 五月天婷婷乱论小说| 三十路磁力链接| 99色精品视频| 九九色中文| 91精品婷婷国产综合| 婷婷五月丁香人妻无码高清| www.婷婷激情网.com| 五月丁香影院| 国产精品18久久久| 思思99热| 国产精产国品一二三在观看| www.久久爱| 色99网站| 97在线精品| 欧美日韩成人在线网站| 丁香五月婷婷基地| 99国产精品久久久久久久久久久| 色综合天天综合成人网| 五月婷婷开心网| 99热这| 亚洲色在线观看| 亚洲色 视频| 精品皮股午夜AV| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 激情开心五月亚洲| 激情性五月天免费小说视频| 色五月丁香五月婷婷五月成人网 | 色欧美色色色| 久久五月天激情| 秋霞AV吧| 青青操成人福利| 色色97丁香婷婷五月天| 无码一级片| 丁香婷婷婷五月综合色情| 玖色色综合| 五月伊人婷婷999| .comwww在线观看免费操| 一级韩国产精品毛| 成人在线日韩欧美| 婷婷激情综合网| 色9999日韩国产| 婷婷五月小说色综合| 欧美丁香婷婷天天操| 激情综合5月| 欧美va视频不用播放器的va视频网| 亚洲99激情| 激情五月丁香激情综合网| 色操b| 婷婷五月天狠狠搞干| 九九热最新| 色5月婷婷色| 久久五月丁香| 色婷婷激情五月天丁香| 丁香五月黄色| 性五月激情| 青青草护士中出内射-欧美电影在线天堂新版 | 蜜臀99久久精品久久久久| 亚洲免费av在线| 精品人人操| ay2区| 九九热视频免费的| 五月天网站免费欧美| 色噜噜狠狠色综合成人99| 五夜婷婷| 夫妇交换刺激做爰| 婷婷丁香色性爱| 91色九| 久久总和99| 婷婷五月激情六月丁香| 婷婷五月丁香久久| 色五月婷婷久久| 激情婷婷五月久久| 激情五月天网页| 五月天婷婷成人网| 99爱在线免费视频| 三日本无码| 婷婷综合色网| 另类色网| 久久性爱视频网站| 99色综合| 日操熟女| 丁香五月婷婷激情小说| 人人做人人看人人摸| 丁香激情五月天| 婷婷色婷婷| 五月天啪啪网| 五月婷婷六月丁香免费| 97色色色视频| 色五月婷婷在线| 人五月天婷婷喷水| 97中文在线| 丁香婷婷视频一区二区| 日本色色色| 婷婷激情五月天桃花网| 五月婷亚洲精品AV天堂| 五月婷婷乱| 婷婷中文字幕| 97婷婷丁香五月综合| 热九九在线| 色导航色婷婷五月天在线观看| 欧美在线干| 婷婷色色色| 久久五月丁香婷婷| 五月丁香综合激情网| 99热成人| 丁香六月激情四射| 情久久综合五月天| 亚洲国产精品SUV| 97久久五月丁香婷婷| 国产精品-第3页-91JQ就要激情网91JQ5.JQJQ926.XYZ | 开心婷婷五月综合| 看婷婷五月天网| 日韩AAAAAAAAAAA片| www.婷婷五月天| 九色91美女| 色情五月天A片| 久久婷婷五月天激情| 欧州婷婷五月天综合| 激情视频网址| 婷婷五月色惰| 色噜噜狠狠狠狠色综合久欧美| 丁香五月性| 五月婷婷激情综合av| 538在线精品| 中文字幕婷婷五月天| 99激情| 色99最新网址| 丁香五月综合在线播放| www.91色| AV色五月婷婷| 人妻熟妇国产精品| 欧美97超碰| 国产精品-第3页-91JQ就要激情网91JQ5.JQJQ926.XYZ | 丁香色综合| 超碰人人在线| 久久久婷婷婷| 色99热| 欧美色色色色色色| 激情五月婷婷丁香| 色色五月丁香婷婷综合| 婷婷射婷婷舔| 婷婷六月天国产综合| 丁香五月aV| 日本三级韩三级99久久| 丁香六月色香蕉视频| 久久久久9| 97久人人| 亚洲精品99| 99狠狠| 伊人网碰碰| 婷婷五月香蕉| 色色色在线| 99精品无码| 亚洲精品中文字幕成人片| 五月天.com| 综合爱久久| 亚洲五月天激情| 另类图片五月激情| AV性爱在线| 婷婷 伊人 久久| 欧美成人日韩| 久久久com| www色婷婷| 欧美极品999| 婷婷五月天开心网| 丁香五月天色| 久久久婷婷五月天| 狠狠干五月丁香综合网| 99热精品10| 色婷婷综合影院| 激情九月综合| 开心婷婷五月| 五月色无码| 激情五月天。| 色五月在线播放| 欧美日韩国产伦精品日韩人妻一| 色九月婷婷综合| 日韩精品999| 99热国产这里只有精品| 亚洲综合视频天天精品| 五月激情四射网站| 人人射人人高潮| 国产综合色婷婷精品久久| 性爱综合网| 久热这里只有国产| 丝雨一区二区| 日本久久人| 综合丁香婷婷五月天| 202丰满熟女妇大| 色五月激情婷婷| 激情五月婷婷视频一区二区三区| 久操人妻| 嫩草AV久久伊人妇女超级a| ady狠狠入| 久久婷婷五月| 亚洲VA在线| 超碰色婷婷| 亚洲中文字幕网| 91人妻视频| 国产ava| 丁香六月婷婷久久综合| 99热在线只有精品| 婷婷综合欧美| 国产亚洲99久久精品熟女| 欧美在线视频免费播放| 六月天无码网址| 最新久久99视频网站| 九九色影视| 亚洲人人操BD| 久久女人天堂| 亚洲区1| 日本色色色| 99爱免费视频| 草综合网| 婷婷的色色五月天| 八戒青柠影视剧在线观看| 色播五月婷婷| 极品人妻videosss人妻| 欧美色图天堂网色| 3p九色在线| 婷婷五月天色色| Www,五月天| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 五月丁香激情六月| 综合亚洲六月婷婷在线| 丁香五月天天| 51精品国自产在线| 日日.c| 六月色播| 色五月五月丁香| www999日韩精品| 99热亚州综合| 丁香五月婷婷基地| 久久色五月| 国产日韩亚洲欧美在线观看| 婷婷激情中文综合| 色婷婷色情| 久久9情免费| 久久久天堂国产精品女人| 香蕉人在线香蕉人在线 | 伊人狠狠操| 婷婷激情五月吧| 五月丁香综合中文| 日韩无码亚欧无码| 无码成人AAAAA毛片AI换脸| www.超碰在线| 五月丁香偷拍| 四色99久久| 欧洲综合视频在线观看。欧洲,亚洲综合食品在线观看。 | 五月丁香六月婷婷国产视频| 五月天四色房丁香| 五月婷婷六月丁香激情深爱| 久久99婷婷| 青青日韩| 无码动漫AV| 大香蕉久久视频久久视频| 九九在线精点品| 婷婷五月天激情网| 男女免费视频999| 久久机热/这里只有精品| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 久热天堂| 一级视频网址| 久热婷婷综合| 国产99久久久国产精品免费看| 天天色天天日| 99亚洲视频| 丁香九月激情| 天天干天天日天天操| 色丁香五月天| 狼人久草| 日日噜狠狠| 婷婷久久五月| 男女99免费视频| 九九99免费视频| 五月丁香六月成人| 日日色综合| 丁香六月婷婷综合欧美| 六月丁香社区| www.婷婷五月| 俺去也综合| 欧美超级视频97| av在线免费网站 | 激情五月天黄色小说| 五月丁香爱婷婷深深| 六月丁香啪啪| 广东99色在线| 激情婷婷丁香五月| 天天干天天色天天干| 伍月婷婷六月丁香| www夜夜操com| 天天婷婷综合亚洲亚洲| 玖玖在线| 欧美色图天堂网| av狠狠操| 大香蕉av在线| 超碰cap| 色约约视频一区二区三区四区五区 | 婷婷五月天首页激情| 色开心五月丁香| 操逼视频一区| 九九成人精品免费视频| 色婷婷国色天香综合| 国产热精品| 夜夜操,天天撸| 午夜婷婷五月天| www激情| 婷婷操超碰| 啪啪啪大香蕉| 操人妻AV| 人人操91色| AAA久久| 五月丁香视频在线观看| 五月天俺去也| 丁香久月| 亚洲精品久久久久AV无码| 五月激香蕉网| 99综合自拍| 久热这里只有国产| 乱色色色| 97在线精品视频| 欧美黑人巨大性生话| 无码字幕中文| 久热91| 啪啪干伊人婷婷| 天天日天天干天天操| 天天看A片| 日本一级淫| 久热婷婷在线视频| 久久九九视频网站| 五月丁香基地| 夜夜 操无码| 少妇人妻偷人精品无码视频新浪 | 99欧美热| 婷婷久久网| 99.色| 99热国产精品| 激情网 久久| 伊人五月婷婷| 91视屏在线观看com.wwwvv| 日本丁香五月| 五月婷婷综合在线| 超碰色人妾| 九九视频免费| 野战毛片三一3| 亚洲人妻av| 金品在线视频99| 干婷婷五月天| 久久久久久久97| 久久久宗合视频88| 亚洲小视频免费播放| 深爱激情69热| 国产看真人毛片爱做A片| 欧美在线视频9| 欧美天天综合网站上去吧| 五月天婷婷乱论小说| 最近中文字幕在线中文视频| 97五月天婷婷综合激情网| 国产探花AV在线| 丁香五月日韩| 五月情涩综合婷婷| 综合狠狠五月婷婷| 天天色亚洲| 91久草五月天婷婷| 色色婷婷综合网| 婷婷综合五月| 天天综合网~91综合网| 久噜久噜| 大学生高潮无套内谢视频| 色99色| 天天插天天插天天插| 五月天激情小说网| www.久久99热地址发布| 日韩精品无码99| 国产精产国品一二三在观看| 六月撸婷婷| 五月丁香六月婷婷在线观看| 成人视频网| 婷婷月五天在线在线看| 99热这里只有精品国产精品| 五月丁香婷婷综合| 国在线激情网| 狠狠五月激情丁香六月| 激情久久婷婷| 99er6热在线观看精品6| 亚洲电影在线观看| 亚洲夜五月| 色色色色综合| 操操国产| 香蕉人在线香蕉人在线 | 人操综合| 99.色| 国产婷婷色综合AV蜜臀AV | 99热成人精品| 狠狠色噜噜狠狠狠888| AV在线观看网站| 天天做天天爱天天高潮| 久久影视婷婷五月| 性小说五月天| 极品人妻VIDEOSSS人妻| 激情综合网婷婷久久| 久久精品这里只有精品免费首页| 99日本在线| 91精品综合久久婷婷九色| 91久久免费| 五月婷婷激情综合网| 久久婷婷五月综合色和| 就去涩涩丁香五月天| 激情操逼婷婷| 白天AV月月| www.97视频| 丁香综合伊人AV| 国产成人综合亚洲| 五月丁香天堂| 狠狠色综合精品视频在线| 极品少妇婷婷五月| 女高怪谈在线观看| 婷婷综合日本| 极品另类| 六月婷婷激情| 婷婷色综合| 久热只有这里有精品| 色婷婷综合网| 欧洲婷婷五月天| 狠狠精品干练久久久无码中文字幕| 五月婷婷综合网在线播放| 五月婷在线| 国产一区男女| www.91AV.COM| 丁香婷婷色色| 婷婷月五天在线在线看| 久久人妻精品| 久久成人综合五月天| 婷婷色色综合| 天天插天天日| 超级碰碰91| 亚洲无码99| 成人AV免费观看| 亚洲另类在线观看| 激情美女五月天激情在线| 好叼操在线观看| 人人摸人人干| 99re热在线视频| 国精产品一区一区三区免费视频| 天天干天天 亚洲| 人人干人人操外国| 久久五月网| 婷婷区日本| 国产亚洲成人综合| 狠狠五月激情丁香六月| 欧美五月丁香啪啪响视频| 精品一二三区久久AAA片| 激情宗合网激情五月天| 91精品视频男人的天堂| 91久久久久久久久久久| 成人必爱视| 一区中文字幕电影| 五月天综合在线| 69五月天视频| 国产午夜精品一区二区| 强伦轩人妻一区二区电影| 天天 青草 丝袜制服 在线| 任我肏视频精品| 久草五月天| 色六月天天激情综合网| 久久久全国免费视频| 久久人人九九| 狠狠色婷婷丁香六月| 欧美日本高清视频99| 99无码视频| 丁香五月婷婷欧美成人色图| 91激情五月开心| 国产全是老熟女太爽了| 丁香六月激情综合| 激情六月丁香综合| 五月天丁香综合在线| 色色色热热热| 婷香五月激情视频| 五月六月婷婷激情网| 丁香五月婷婷激情蜜桃| 色色无码| 99爱视频免费| 五月丁香六月婷婷中合网| 色月丁| 校花娇喘呻吟校长陈若雪视频| 99热综合| 天天色色婷婷| 婷婷色中文字幕| 蒲京久久无码视频| 久久婷婷色| 狠狠xx| 日日婷婷不卡| 黄色AV日韩| 67194线路二在线观看| 五月天婷婷社区| 五月六月婷| 色狠狠综合网| 亚洲AV综合在线观看| 另类亚洲电影| 中文字幕欧美日韩VA免费视频| 欧美色频| 天天天天色天天天天天干| 狠色综合网| 香蕉久久国产av一区二区| 天天肏天天舔AV| 色情五月婷婷| 六月丁香五月婷婷| 色五月成人在线| 天天玩天天摸| 婷婷五月天堂| 丁香五婷| 久久久91精品| 农村熟妇高潮精品A片| 久久婷婷色色| 噜噜网免费视频| 色色色色欧洲| 国产成人在线不卡AV| 天天日日| 亚洲国产精品SUV| 99综合免费视频| 五月天丁香成人| 色色a| 天天舔天天摸天天透| 天天操天天操| 69精品人人人人| 五月丁香好婷婷A片网| 99热99| 五月 婷 久| 91夫妻网站九色| 中文字幕无码人妻少妇免费视频| 日日干天天| 开心激情五月天网| 午夜激情综合| 婷婷五月综合色拍| 夜夜夜夜夜骑撸| 亚洲bt丁香五月天婷婷激情小说| 另类图片 五月激情| 丁香女人五月天| 精热在线综合网| 天天狠天天狠| 婷婷五月天综合激情| 亚洲激情av| 丁香六月狠狠干| 丁香九月综合| 中文字幕AV在线播放| 激情综合99| 九色91国产| WWW,五月| 久9久9久9久9久9久9| 日韩综合网络男女香蕉a片| 丁香五月婷婷av| 色玖玖爱| 97性高潮久久久| 成人在线视频男人的天堂4399| 国产精品岛国片在线观看免费| 五月色情精品| 婷婷黄色五月| 激情av在线| 一起草无码| www.五月婷婷| 五月婷五月婷伊人伊人五月婷| 丁香五月 综合| 久久五月激情网| 成人网站免费sxj| 99综合激情久久精品久久| 激情婷婷色五月| 日本色狠狠| yellow视频在线观看91| 色情五月综合婷婷| 激情综合五| 乱精品一区字幕二区| 久久99人人| 91久久免费| 大香蕉天堂| 99re热视频这里只有综合亚洲| 色五月婷婷天天干| 精品综合久久久久久五月天| 色性五月天| 五月丁香婷婷深深爱| 久久与婷婷| 激情5月婷婷狠狠干| 婷婷五月噜噜| 色五月天在线观看| 男人天堂99| 任你爽视频| 丁香六月综合激情| 丁香五月伊人| 男人天堂 久久| 色99网| 99热首页在线30| 精品无吗va视频免费观看| 97热视频| 江苏少妇性BBB搡BBB爽爽爽| 99天天操夜夜操| 丁香六月激情| 日日操,日日爽| 另类五月激情| 啊V视频在线观看| 婷婷五月六月| 精品热九九| 久久久WWW| 久久6这里只有精品| 激情丁香五月天图片| 色色射| 九九婷婷激情综合网| 日本久久爽| 婷婷色系婷色| 六月婷婷开心| www.丁香五月| 日韩性爱无码| 人人爽天天莫| 婷婷五月花丁香| 九九香蕉网| 人人色人人弄人人操| 91丨九色丨白浆| 狠狠做五月婷婷| 婷婷五月精品中文字幕| 国产精品99久久久久久久女警| 综合久久六月| 天天拍夜夜撸| 婷婷丁香五月综合免费视频百花| 99久久婷婷国产综合| 久久婷婷五| 五月天激情在线视频| 99爱在线视频| 日韩av一区二区在线/日产精品久久久 | 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 夜色爱爱亚洲| 一区二区中文字幕| 日日色综合| 久久er99热精品一区二区| 色综合久久中文| 五月婷婷激情色情网| av久热| 青青草免费公开视频| 精品久热69| 天天骑天天操| 97超碰99热99| 丁香五月天天日| 九九色图| 婷婷六月成人| 色的色综合| 99九九久久| 亚洲成人av在线观看| 另类图片五月天婷婷| 夜夜 操无码| 狠狠爱丁香婷| 婷婷六月天精品| 久久婷婷五月天| 任你搞免费视频观看| 99热这里只有精品98| 大香蕉久艹| 一本九九色| 激情黄色小说五月天| 91九九| 中文字幕日韩成人| 超碰1999| 国产性爱大片久久| 99热精品网| 五月婷婷片| 97碰久久| 裸体美女丁香五月天。| 久久久久久久久18久久| 色婷婷激情小说网| 五月婷在线观看| 五月丁香花视频| 99爱视频在线观看这里只有精品| 中国女人做爰A片| 性韩日色婷婷五月天激情啪啪XXX| 综合伊人久久| 高清 码 免费看片短视频| 思思热在线视频99| 亚洲欧洲中文日韩久久AV乱码| 丁香六月青青草| 欧美狠狠地| 国产一级黄色影片,| 丁香婷婷五月天网站| 国产免费AV网站| 九九热大香蕉| 九九热99免费视频| 婷婷五月丁香色播| 丁香婷婷五月天在线视频| 国产91在线视频| 六月丁香婷婷在线波多| 91人在线观看| 99热这里只有精品33| 99免费在线视频| 五月色婷婷综合色| 激情五月综合网| 天天天久久久| 狠狠狠狠狠| 这里只有精品热| 色婷婷9| 激情婷婷丁香五月天| 啊V视频在线观看| 六月婷婷激情| 深夜男女福利刺激影院一区完整| 久天综合| 九九热99热| 国产 码在线成人网站| 99免费热视频在线| 婷香五月| 精品婷婷| 99九九视频| 九九热再线九九视频免费在线观看| 综合五月天| www.久久五月天.com| 丁香五月婷婷激情四射深爱激情| 五月花婷婷丁香| 天天色凹凸| www.99热这里精品| 99ri在线播放| 五月婷婷六月丁香玖玖玫瑰91| 色播五月综合网| 五月天综合在线观看视频| 成人无码髙潮喷水A片| 99色在线观看视频者| 中文AV网站| 99热免费精品| 岛国av网站| 色婷婷五月综合在线| 任我肏视频精品| 婷婷操久久| 亚洲夜五月| AA片在线观看视频在线播放| 夜夜操天天爽| 婷婷久久精品| 色五月婷婷五月| 中文无码精品一区二区三区| 九月丁香婷婷网| 超碰男人色| 好好干Av| 九九热狼人| 狠狠干狠狠干| 天天色·欧美| 久久无码成人| 亚洲精品色| 婷婷激情五月天综合| 99久久喉9| 九九热视频在线观看| 色VA| www.久久99精品| 97性视频| 日日天天操| ...婷婷五月综合不卡,国产在线手机| 色婷婷久久综合| 婷婷色香六月综合激情| 九九美女视频| 性爱视频久久| 深爱五月网| 97操视频| 成人中文网| 婷婷操久久| 亚洲热综合网在线观看| 久婷自拍视频| 五月婷婷性爱| 99热精品免费| 99热都是精品| 草榴成人影片|