99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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
返回資訊列表
深爱激情网综合| 婷婷色亚洲| 综合欧美五月婷婷| 激情五月婷婷| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 五月丁香啪| 婷婷色在线观看| 99亚洲天堂| 久久丁香五月综合六月激情红杏视频| 婷婷中文字幕欧美| 99热碰碰热| 色色色欧美| 少妇性按摩无码中文A片| 五月激情婷婷六月| 丁香无月在线观看| 丁香狠狠色婷婷| AV九九| 99re这里只有精品视频6| 日韩中出视频| 中文字幕丰满孑伦无码专区| 日韩成人中文字幕| 国产精品热搜丁香五月婷婷| 性爱在线播放av| 色爱爱综合网| 美女久久婷婷| 色99视频| 九九99精品视频在线观看| 襙逼网| 婷婷伊人綜合| 久久综合66| 激情丁香九九五月综合网| 久热成人| 九九人人看| 亚洲丁香花色| 亚洲亚洲人成综合网络| 亚洲乱码日产精品BD| 激情 婷婷| 99在线观看视频蜜臀| 大香人妻| 色色六月| 丁香 亚洲 久久| 无码日本精品XXXXXXXXX | 成人在线视频网| 天堂草在线观| 丁香五月婷婷成人色区| 亚洲va欧美| 欧美啪啪9| 麻豆精品| 日本99视频精品免费播放| 五月激情在线| 强辱丰满人妻HD中文字幕| 9久国产| 丁香五月六月欧美| 婷婷五月天欧美图片在线播放电驴| 日 日干 日日做| AV伊人青草丁香六月| 五月婷婷之综合激情在线| 色色国产| H亚洲| 91婷婷五月丁香碰| 久久机热这里只有精品免费视频| 久草A片| 婷婷久久婷婷色五月| 精品热九九| 中文字幕在线日亚洲9| 色区久久| 99热草草| 996热| 五月天婷婷社区久久综合| 91久女| 丁香婷婷五月激情四射网| 五月天开心网| 五月天社区| 色五月婷婷777| 99热最新网址| 日韩精品一区二区刘| 婷婷五月丁香亚洲| 国产性爱一级| 蜜桃婷婷丁香五月天狠狠久久综合| 色五月久久成人婷婷| 激情丁香五月激情婷婷| 天天情色综合网| 激情五月激情综合网| 欧美va在线| 五月丁香龟婷婷| 天天摸天天透天天舔| 26UUU欧美| 婷婷基地爱| 色五月丁香伊人五月| 99∨VTV| 婷婷伊人网| 成人精品一区日本无码网| 色9999日韩国产| 91碰碰| 丁香五月天堂网| 九久久九精品视频| www色婷婷久久综合久色 | 在线超碰精品| 色婷婷久久| 欧美一区二区三区不卡影视| 五月丁香亚洲综合| 91九色在线| 欧美内射AAAAAAXXXXX| 狠狠干在线| 激情五月深爱五月| 91凹凸在线| www.99热| 婷婷六月久久| 久久狠狠色| 涩婷婷五月天在线精品视频| 超碰色热| 激情网第四色| 五月激情综合网| 色婷婷无吗| 亚洲婷婷丁香五月在线| 五月天色社区| 中文字幕不卡网站| 五月天婷婷成人资源站| 99热精品在线| 免费在线a| 呦呦v线| 一丁香五月天月AV| 久久色大香蕉| 天天拍夜夜爽| 丰满少妇乱A片无码| 色色色天堂网| 五月六月伦理| 欧美日韩二区在线| 色丁香久综合在线久综合在线观看| 成年人看Va免费视频| 99re8这里只有精品99re8热视频| 七七九色| 东京热伊人| 射婷婷中文字幕| 天天爱天天做天天日| 26uuu日韩| 激情五月丁香五月色| 五月丁香六月婷婷,婷| 亚洲色另类| 这里只有精品视频免费在线观看| 狠狠草网| 六月丁香婷婷综合狠狠爱夜夜爱| 九九大香视频| 26UUU欧美| 婷婷不干网| 激情五月天噢美| 91人人网| 日韩精品一区二区亚洲AV观看| 日韩十国产极品久久| 婷婷久久大香蕉| 成人在线二区| 天天看片日日夜夜| 99天堂在线观看免费视频| 五月天激情日色在线| 337p大胆噜噜噜噜噜91Av| 九九综合九九| 国产成人一区二区三区在线观看| 99.色| 激情五月黄色| 久9视频免费播放| 熟女人妻视频| 色欲资源网| 天天日中文| 五月精品免费XXX| 色噜噜丁香| 伍月婷婷六月丁香| 夜夜爱伊人| 影音先锋色婷婷| 五月丁香久久网| 狠狠草狠狠草| 开心婷婷中文字慕| 丁香伍月婷电影全集| 99热精品9| 丁香六月天| 狠色狠色狠狠色综合网| 中文字幕精品推荐免费在线观| Www.狠狠| 婷婷激情五月综合| 色吧综合网| 亚洲精品99| 亚洲五月综合色播| 色色色97| 免费无码毛片一区二区A片 | 99久久99九九99九九九| 91九九九九| 五月六月婷婷| 怡红院99| 性视频久久| 天天色综合网1| 国产三级在线播放| 99精彩视频| 日日噜狠狠色综合久久| 思思热久久艹| 沈娜娜av| 国产午夜精品一区二区三区嫩草| 婷婷五月综合网| 伊人五月婷婷国产视频| 五月天开心网| 久99久视频| 婷婷激情鹿城五月天| 色yeye欧美| 丁香五月性| 五月综合六月丁| 玖玖婷婷色五月| av九九| 五月激情偷拍| 五月天婷婷久色| 热99在线精品| 另类图片五月天婷婷| 国产67194| 热久久这里只有精品20| www.25五月婷婷| 乱精品一区字幕二区| 亚洲va成人va成人va在线观看| 色五月婷婷五月丁香五月激情五月视频| 超碰人人摸人人操| 激情婷婷五月天| 五月婷婷丁香六月| 五月丁香婷婷六月| 丁香五月天的网址。| 影音先锋一区二区三区| 亚洲综合另类| 欧美三级视频下载| 丁香婷婷综合影院| 激情五月天。| 天天干电影| 99亚洲无码| 丁香婷婷偷拍| 色婷婷狠狠爱| 亚洲网视屏| 色欲色香,www,com| 99人人看| 99热99艹在线观看| 伊人综合网站| 免费看欧美成人A片无码| 色热久| 精品久久久人妻| 五月丁香 久久久| 欧美色图45678| 91ncm视频| 成人做爰高潮A片免费视频| 香蕉狠狠爱视频| 五月丁香另类图片| 无码区婷婷五月花开| 激情狠狠丁香月| 99r久久这里只有精品| 五月丁香激情四射| 69人人操人人爽| 小香蕉av| 五月色亭丁香| 婷婷五月激情四射手| 禁欲电影完整版在线播放| 欧美操人| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 国产人妻777人伦精品HD| 婷婷五月天基地| 99热精品在线播放| 久久99久久99精品免视看婷| 丁香色五月 97干| 玖玖色综合网| 五月丁香啪| 五月丁香综合啪啪| 五月天综合在线网| 一婬一伦一区二区三区| www.久久久久久久| 99 频99热国里只有精品| 综合婷婷六月| 亚洲欧美一区二区三区四区爱爱动图| 激情婷婷丁香| 丰满人妻一区二区三区| 密着浓厚中出乚交尾GvG935| 欧美久久久中文字幕| 四色五月婷婷| 五月激情网站| 深爱五月激情网| 日本五月丁香| 五月丁香亭亭| 九九精品99| 97 A I色色| 4399成人黄A片| 大陆极品少妇内射AAAAAA| 97很鲁在线视频| 久久月天堂| 夜色.cnm| 色色综合色视频| 777久久精品| 日本噜噜色网| 99视频网址| 欧美婷婷丁香五月社区| 五月婷婷色色爱| 亚洲天堂AV综合网| 久久婷婷五月天| 婷婷六月综合在线| 天天日天天操心| 五月天婷婷激情在线色图| 色综合五月天| 91丨九色丨老农村| 天天成人综合| 99色综合| 啪啪东京热| 婷婷五月激情四月综合 | 丁香综合网| 婷婷成人丁香色情基地30 | 五月丁香啪啪啪啪| 99九九精品视频推荐| 日韩综合久| 丁香婷婷综合五月天| 99在这里有精品| 色碰碰| 久久综合九色综合97婷婷| 免费观看2018www黄色操逼网站| 婷婷五月天国产精品| 日逼免费视频 | 第四色色色色色丁香五月天| 天天色天天爱天天舔| 色色a| 精品一二三区久久AAA片| 免费观看日韩成人av| 丁香九月久久| 久久这里只精品| 五月天婷婷综合网| 激情五月婷黄版| 日韩AAAAA| 开心五月天激情网| 色六月丁香婷婷啪啪啪| 玖玖婷婷色五月| 变态 另类 在线| 大香蕉婷婷五月天| 亚洲天堂爱爱| 久久免费丁香| 天天在线久久综合| 国产性爱亚洲是图| 婷婷综合亚洲| 亚洲综合狠狠艹| 高清无码网址| 99久热| 亚洲人成色A777777在线观看| 日韩黄在免| 五月丁香综合啪啪啪啪啪| 九九热婷婷| 果冻传媒A片一二三区| 天天 青草 制服丝袜 在线| 九九热最新| 潘金莲AAAAAAAAAA| 色婷婷九月| 亚洲无AV在线中文字幕| 狠狠狠狠狠狠草| 色色色综合| 超碰人人干| 99.N在线视频| 婷婷射图五月天| 99综合| 成人精品网站在线观看| 色综合99| 色99日韩| 五月天激情国产综合婷婷婷| 天天做天天爱天天摸| 中文字幕成人| 婷婷久久国产视频| 北条麻妃伊人 | 激情綜合W W W,激情五月天| 如何安全看伊人婷婷| 丁香五月婷婷激情网| 骚五月婷婷| 色婷婷A| 日本黄色三级片内射| 五月婷婷丁香五月亚洲色| 超碰免费人人| 99r这里| 操逼综合网| 能直接看的av网站| 色婷丁香| 中文字幕人妻熟女在线| 人人草人人视| 色婷婷五月色| 高清一区二区三区日本久| 婷婷九月激情网| 久月久在线视频| 青青草原精品久久| 五月丁香六月婷婷成人| 久久综合五月| 99热免费网站| 九月婷婷综合色干| 狠狠爱婷婷爱| 颜射 精品性爱av| 亚洲六月综合激情久久下卡| 97碰碰在线看视频免费| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 天天色综合图片| 九九超日本| 外国碰视频网站97| 天天操天天操综合| 丁香五月777| 婷婷基地爱| 热热久久精品视频| 77777亚洲午夜久久| 九九99九九99九九99视频网| 久久视频婷婷视频| 日韩精品一品二区三区的使用体验| 久久综合爱| 成人必爱视| 另类国产欧美视频| 99色视频在线| 五月色婷婷综合| 九九色精品| 99精品偷自拍| www.婷婷六月天| 国内婷婷丁香社区在线播放| 99WWW免费视频| 99热精品在线| av在线观看网站| 婷婷六月丁香1| 免费看成人747474九号视频在线观看| 99热久久这里只有精品| 99啪啪视频| 性色99| 婷婷她六月天| 天堂久久婷婷| 伦乱人妻| 91狠狠色丁香婷婷综合久久狠丁香综合久久精品| 激情五月天开心| 激情综合婷婷| WWW夜夜| 伊人九九热| 桃色成人网| 日本爆乳片手机在线播放| 国产精品五月丁香| 99热婷婷| 五月天色综合| 色情五月天丁香社区| 无码少妇高潮喷水A片免费| 五月婷婷综合在线| 久久九九视频| 亚洲婷婷成人五月天| 婷婷色五月激情| 丁香五月天天| .comwww在线观看免费操| 国产精品99久久久久久久女警| 七七色色综合| 久久久久这里只有精品| 99热这里只有精品官网| 亚洲VA在线| 免费99情趣网视频| 免费视频舔| 激情99| 超碰在线个人观看| 另类图片五月天婷婷| 天久综合91综合首页| 天天射影院| 色玖玖综合网| 日韩啪| 激情五月天婷婷丁香| 久久在线人妻| 丁香婷婷十月| 色婷婷色人人射| 99综合婷婷五月| 秋霞黄色一级久久| 亚洲色色色色色色色色色| 婷婷的久久网站| www.色色五月天.com| 亚洲有码在线视频| 色呦呦美女| 9久久精品视频| 伊人五月婷婷国产视频| 久久婷婷五月综合精品蜜芽| 欧美色99| 六月丁香成人| 西瓜美女a片| 丁香六月激情蜜桃| 婷婷免费精品视频| 激情涩涩网| 五月天亚洲最大成人| 九九热免费观看视频| 色色色色色级无码| 五月丁香青草综合啪啪| 五月天狠狠网| 五月丁香婷婷久久| AA片在线观看视频在线播放| 五月天天丁香婷婷| 五月狠狠| 丁香五月天在线观看视频| 99久久免费性爱视频`| 日日骑夜夜撸| 亚洲精品五月| 婷婷中文字幕| 97色色婷婷| 国产午夜精品AV一区二区麻豆| 婷婷大香焦| 色婷婷色综合| 99视频色在线观看| 丁香色五月婷婷91桃色| 91日视频| 五月婷婷激情| 欧美色碰| 日日日日做夜夜夜夜无码| 婷婷天天综合| 99热亚洲精品| 国产真人做爰视频免费| 久久99jiu9| 色五月天堂| 六月丁香五月激情亚洲AV| 手机AVAV天堂看网| 69久久99精品久久久久婷婷| 午夜性做爰电影| 亚洲AV电影av| 亚洲中文丁香| 九九热视频这里只有精品| 9久久精品| 成人亚洲精品久久久久| 国内一级精品| 亭亭五月天黑人2014| 九色啦蜜臀| 影音先锋女人AA鲁色资源| 另类国产欧美视频| 天天草人人摸| 99这里只有精品| 久久久天堂国产精品女人| 久久一操| 九九成人精品| 99热这里只有精品在线观看| 久久艹网| 色区域网站视频| 婷婷久久五月| 人人叉久| 色播婷婷五月天| 五月丁香综合激情| 99精品丰满| 六月婷婷网| 五月久视频| 五月激情在线| 亚洲激情AV| 九九亚洲视频| 蜜臀久久99精品久久久久久酒店| 婷婷久久五月天| 久久久久久人妻久久久久久久久久人妻久久久| 天堂成人A片永久免费网站| 91热网址| 九九视频在线观看| 一级内射毛片| 天天天天天天天操| 99ER热精品视频| 久久9视频| 99精品视频免费观看| 色级停停| 精品一区二区三区木瓜| 九九热在线视频| 综合激情在线| 天天爱天天狠天天透| 激情五月天婷婷播播久久综合91| ,99视频久久| 99热精品在线播放| 国产综合色婷婷精品久久| 婷婷六月久久综合导航| 99热香港| 日日狠狠久久偷偷四色综合免费| 五月天激情美女久久| 亚洲美女婷婷五月天| 97资源碰碰| 亚洲色图五月丁香| 超碰免费大香蕉| 久re热视频| 婷婷综合网| 97成人在线视频| 天天爽天天爽夜夜爽| 风流少妇A片一区二区蜜桃| 伊人丁香六月婷婷| 97色婷婷| 天天干夜夜欢| 五月天小说激情| 天天天天天久久久久久| 欧美久久久中文字幕| 79色色免费| 4399无码视频二区| 五月叮香啪| 日韩在线一级| 日韩成人中文字幕| 久久五月视频| 婷婷五月在线影院| 激情六月综合| www.91九色| 亚洲综合婷婷| 天堂爱爱| 东京热人妻一区二区三区在线| 丁香五月婷婷在线观看| 99亚洲精美视频在线观看| 91丁香五月| 99久久九九| 成人无码髙潮喷水A片| 热久久66| 啪啪色区| 婷婷久久五月天| 色九月婷婷综合| www久| 99超级碰碰| 超碰色色综合| 99免费视频在线观看爱| 精品人妻伦一二三区久久| 7777久久亚洲中文字幕| 五月天婷婷综合久久| 亚洲欧美999| 婷婷欧美| 超碰在线免费9| 久久五月婷综合网| 日本色婷婷| 丁香五月综合激情久久潮喷| 人人人人人人人人人草| 99自拍视频网站| 婷婷五月丁香青青草在线| AV在线大香蕉| 色五月天综合网| 精品一二三区久久AAA片| 91无码高清| 思思99热这里只有精品6| 色色色国产| 香蕉五月婷婷| 草AV9999| 五月丁香婷婷色| 五月丁香久久呀| 这里只有精彩亚洲视频推荐| 激情久久久| 亚韩在线视频| 播五月开心婷婷欧美综合| 99精彩视频网站在线| 狼人久草| 国产婷婷五月天| 色婷婷91激情小说| 四色女婷婷| 俺去也五月天| 久久久久9| 色情成人五月天| 在线播放人妻| 激情五月色综合国产精品| 色色a| 另类A片| 人妻少妇色综合| 99色综合久久| 9999热这里只有精品| 婷婷五月花| 久热视频A.| 五月香婷婷| 亚洲天堂啪啪| 久热黄色| 99九九99九九九视频精彩| 久久丁香五月天| 青青色com久久| 少妇人妻综合色6699| 任你躁XXXXX麻豆精品| 色色色视频免费无码| 五月婷av| 亚洲精品网站色视频| 丁香婷婷啪啪| 丁香五月婷婷亚洲人| 婷婷伊人| 无码地址| 午夜少妇在线观看视频| 开心五月激情站| 国精产品一区一区三区免费视频 | 五月婷在线影院| 久久久久婷 | 超碰在线网站9| 777精品成人a v久久| 免费三级黄色| 丁香五月亚洲| 在线看黄色| 九九大香蕉黄色影院| 婷婷六月视频| 天天日,天天干,天天操| 亚洲丁香婷婷五月天综合色| 丁香五月影院| 99热精品一区| 日韩五月婷婷久久| 狠狠插狠狠插| 午夜爱插插| 五月丁香激情综合网| 婷婷五月丁香狠狠| 久久91久久精品久久| 第四色婷婷丁香五月| 色五月婷婷AV| 日韩aaa| 五月社区婷婷激情| 九九热这里只有精品9| 啪啪小说五月天| www.91九色| 九九色逼| 亚洲激情免费视频| 综合伊人久久| 可以免费观看的av| 国产性色蜜乳| 久草a片| 久久这里只有精品99| 99精彩视频在线观看| 久久五月天婷婷| 激情性爱五月天| 天天爽天天| 欧美成人精品一区二区 | caop视频| 97丁香五月| 深爱五月综合网| 97色五月丁香婷婷| 亚洲久热| 色综合综合色| 丁香色色色| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 亚洲天堂99| 国产热精品| 夜色综合网| 激情婷婷五月天| 另类激情网| 色色五月婷婷| 99操不停| 五月天成人综合| 婷婷丁香五月亚洲免费| 国产伦理精品高清在线观看网站一区二区 | 五月丁香成人网| 日日夜夜婷婷| a69在线视频| 性爱激情小说AV五月丁香花| 色婷婷丁香五月天| 啪啪操超碰| 森林影视大全,最好看的2019年视频| 操人视频91| 成人做爰A片免费看网站找不到了| 五月婷婷色五月| 十月丁香婷婷| 久久女人天堂| AV亚洲在线| 色五月在线观看| 狠狠色综合精品视频在线| 热热久久精品视频| 91婷婷丁香五月| 亚洲六月色| 色久天| 日本色综合| www激情网| 婷婷五月小说色综合| 综合久久综合综合| 专区无日本视频高清8| 激情综合网五月丁香| 人人视频色| 丁香五月天激情婷婷丁香六月| 日本三日本三级少妇三级66| 国产精品色情AAAAA片软件| 99综合视频| 久热免费视频| 79色色色色| 亚洲狠狠婷婷综合久久久| 久久久久婷婷| www.五月天色色色| 婷婷五月天天激情| 97搞在线| 色狠狠色噜噜AV天堂五区| www.五月丁香| 色婷婷综合久久久久| 久久婷婷综合五月天| 青青草视频福利| 激情婷婷综合| 国产裸舞福利资源在线视频| 亚洲中文字幕AV| 9999热在线观看| 丁香婷婷综合喷| 日日夜夜九九| j五月香在线| 欧美大片免费观看| 99热久久这里只有精品| 二色av| 97综合在线| 五月丁香综合激情网| 中文无码婷婷| 五月天激情图片| 丁香五月欧美色综合| 人妻少妇色综合| 色色色热热热| 久久久久久人妻| 婷婷深爱五月天| 丁香六月婷婷色XXXXX| 狠狠激情五月天| 天天婷婷色六月| 欧美人人草| 五月天激情无码| 婷婷色五月丁香六月欧美啪| 五月天六月婷| 人人干人人操人人摸| 人人草人人视| 天天综合网站| 婷婷五月综合久久中文字幕| 日韩人妻在线观看| 丁香婷婷久久 | 性五月激情| 婷婷五月蜜桃成人桃色丁香| 狠狠五月天婷婷| 丁香五月丁香伊人| 婷婷五月骚厕所| 婷婷五月天激情五月天深爱五月天| 亚洲人人操BD| 色久天| 99色| 97操碰| www.夜夜| www.99精品日操伊人乱碰在线| 96精品国产综合久久久久久| 超碰高清在线| 九月丁香| 草婷婷在线| 天天干天天干天天干天天干天| 狠狠干五月天| 亚洲综合激情五月久久| 色色色网站| www.玖玖九| 国内久久亭亭| 人妻性操逼中文字幕 国产| 26uuu国产色| 99热只有精品在线观看| 五月天婷婷乱论小说| 中文字幕综合网| 色色色热| 啪啪操网| 久久久www| 五月天三级| 综合五月丁香六月婷婷| AV在线免费播放| 丁香五月成人| 五月婷婷色白丝| 午夜天堂啪啪| 激情五月天网页| 亚洲婷婷五月天| 深爱婷婷网| 午夜在线成人网站免费观看| 久久久婷丁香五月天激情综合| 欧美天天爽| 五月成人综合| 色色色成人网| 大香蕉丁香婷婷| 97人人操| 5月丁香六月情| 97色热| 国产黄色在线| 五月丁香六月激情综合| 91免费在线视频6| 丁香婷婷月| EEUSS鲁片一区二区三区| 色久一| 伊人五月天日日夜夜久久久天天| 激情综合色播| 婷婷五月天伊人| 影音先锋综合网| 成人深爱丁香五月| 久久丁香五月天| 一点色成人网| 1024操逼视频| 青青福利网| 超碰AV在线| 色级婷婷| 五月天欧美 另类小说| 大香蕉婷婷久久| 久久9情免费| 九九人妻福利| 碰97久久| 成人国产网| 九九九精品视频免费观看| 天天日本夜夜谢| 免费视频WWW在线观看网站| 久操大| 色五月综合在线| 国产乱妇乱子在线播视频播放网站| 中文字幕97超级碰| 五月丁香婷婷激情澎湃四射| 久综合网| 婷婷中文无码| 婷婷丁香五月婷婷| www超碰com| 丁香五月网络网络| 丁香五月首页| 超碰色女人| 天天干com| 大地9中文在线观看免费高清| 97久久精品| www.五月丁香| 久久密臀婷婷| 人人干人人操人人摸人人做| 激情五月天婷婷丁香| 色婷婷瘦婷婷日韩| 成人视频婷婷| 热热色色五月天婷婷| 久久99热这里只有精品23| 99久久综合网| 在线中文亚洲| 激情丁香五月婷婷| 91碰操| SS丁香五月婷婷| 日本不卡高字幕在线2019| 新99思思视频| 婷婷丁香五月综合| 天天玩天天摸| 色婷婷五月综合| AV在线免费播放| 亚洲婷婷五月| 日韩黄色电影| 婷婷成人五月天成人文学| 国产亚洲色婷婷久久99精品9j| 五月丁香六月婷婷亚洲| 婷婷五月激情黄色| 青青草婷婷综合五月| 免费看欧美成人A片无码| 日韩狠狠色婷婷| 91丨九色丨东北熟女| 玖玖在线视频福利| 日日色综合| 就要爱综合| 可以看的av| 婷婷伊在线| 青青青在线视频国产| 六月婷婷视频| 99燥99日| 91久久婷婷人人澡草 | 久久婷婷综合五月趴| AV操一操| 五月开心久久| 一起草无码| 色色色欧美| 精品视频这里只有精品| 久久婷综合| 色视五月天婷婷| 五月丁香本色在线观看| 丁香五月色欲| 97热久久五月婷婷| 激情婷婷色色| 久久色五月| 久在线88综合| 99热最新| 人人九色| 丁香五月在线播放| 丁香五月天在线直播观看| 91色五月在线观看| 婷婷九月丁香| 四色永久成人网站| 97色色视频| www国产亚洲色婷婷com| 色婷婷玖玖影院| 五月丁香福利| 99热欧| 丝袜熟女一区二区三区| 五月丁香色婷婷| 久久婷婷色| www.色五月| 亚洲情a| 1024婷婷综合久久五月天| WWW,五月| 人妻尝试久久久久久久久久久久| 亚州第一A片| 99色综合网| 啄木鸟黑丝一区二区| 丁香五月婷婷www..com| 色综合色五月| AV五月丁香| 日韩精品电影| AV操操操| 久色国产| 日本3级片偷拍网站| 欧美S码亚洲码精品M码| 《蜘蛛女》梁铮1995| 六月婷婷av| 丰满人妻妇伦又伦精品国产| 婷婷五月天综合久久| 色吧综合网| 91精品91久久久久77777| 偷拍91九色| 五月婷婷开心色伊人| 婷婷五月激情综合啪啪| www.操.com| 2025年最新亚洲在线欧美| 在线中文av| 亚洲欧美综合7777色亭亭| 色色色婷婷五月天| 色情免费视频播放| 97人人干人人操| 玖玖色综合色| 91精品在线看| 丁香五月,激情五月,深爱五月| 欧美在线操| 欧美黄色一级| 九九在线精点品| 五月婷婷,六月丁香| 天天曰夜夜爽| 六月激情丁香一道本7777| 久久久久人妻| 欧日韩成人| 亚洲五月情| 97色色婷婷| 91精品国产色猫| 九九无码| 狠狠丁香| 久久精品只有这| 五月丁香六月激情综合啪啪| 黄色成人网站在线播放| 中文AV网站| 亚洲综合激情五月久久| 欧美丁香五月夫妻天| 99综合99| 婷婷欧美偷拍综合| 中文AV在线观看| 91碰人人| 五月丁香六月| 久久综合中文| 天天色天天操天天射| 91小黄书网址在线观看| 免费国产VA国产免费| 亚洲小电影在线观看黄999| 激情综合丁香六| 色婷婷综合网站| 婷婷欧美激情综合| www.henhengan| 丁香5月啪啪| VA日本视频| AV五月丁香| www,超碰| 碰碰碰碰碰99| 丁香婷婷老熟女综合网| 婷婷久久五月| 九九伊人网| 9久国产| 99看片| 色婷婷五月天小说| 秋霞电影理论| 婷婷在线操| 人人爽人人射-美女久久久久久久久久-成人AV| 婷婷玖玖五月天| 婷婷狠狠狠爱| AV操一操| 熟妇国产| 五月丁香综合精品欧美| 久在线88综合| 农村熟妇高潮精品A片| www久久久| 四色永久成人网站| 桃色五月天| 亚洲综合激情五月久久| 久草五月| 丁香六月色婷婷| 97干在线视频| 激情小说五月天| 激情五月天色色网| 一起草Av| 97久久人人| 天天噜日日噜综合无码| 91啪啪网| 99在线精品视频| 伊人激情综合网| AV成人在线播放| 成人免费高清在线播放| 婷婷五月丁香五月| 丁香狠狠色婷婷| 人妻九九九九| 超碰国产在线| 久久久久久人妻| av九九| 亚洲精品久久久久久久久久飞鱼| 8090在线影视少妇| 99久久99综合| 五月精品99综合| 久久久噜噜噜操操操| 天堂网亚洲色图| 欧美六月婷婷| 97自拍99| 亚韩在线视频| 久久九九怡红院| 色97综合婷婷天天色| 九九一综合精品| 久久激情五月网| 开心五月网 | 国産精品| 欧美情月伍月天| 日本精品。999| 五月激情基地| 亚洲五月停停| 激情久久综合| 久久九九网| 九九成人电影婷婷| 久久女人九九| 91人人操人人| 99热久只有精品首页| 丁香五月亚洲婷婷| 色婷婷小说网| 99热这里只有精品66| 天天射影院| 91啦丨九色丨刺激中文| 五月婷婷综合社区| 丁香五月天导航| 五月丁香久久综合精品| 这里只有精彩视| 综合色色婷婷| 丁香五月中文字幕久色| 另类视频五月天| 99热激情| 91se视频| 亚洲免费av在线| 丁香六月婷婷五月天| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 日日操天天操| 97人人操人人拍| 99在线观看精品| 婷婷五六月丁香| 欧州色色| 欧美25p| 三日本无码| 九洲一级A片| 综合色天天| 天天狠狠六月婷丁香影院| 丁香五月电影| 操操综合网婷婷| 国产综合色婷婷精品久久| 另类丁香五月天区图| 丁香五月天视频| EEUSS鲁片一区二区三区| 超热久碰.com| 第二色AⅤ| 深爱五月婷婷| 无码日本精品XXXXXXXXX | 成人丁香五月婷| 这里只有精品99视频| 五月丁香色| 九九热在线精品视频| 96色婷婷| 日韩 欧美 国产 一区 二区| 综合婷婷五月丁香在线观看| 色播五月丁香| 久久婷婷电影| 婷婷丁香午夜综合影视| 亚洲综合另类| 丁香激情综合| 99久久婷婷国产综合精品草原| 亚洲五月天婷婷在线| 99思思在线视频| www激情| 爱射综合| 人人操操| 视色综合| 六月婷婷色综合| 国产精品国产| 狠狠色婷婷六月激情网| 久久激情五月婷婷| 99色免费在线观看| 六月丁香五月亭亭| 婷婷综合激情| 激情综合在线播放| 五月天久久成人| 欧美婷婷综合| 国产成人在线不卡AV| 五月六月激情| 六月丁丁香| 九九性视频| 久久激情天堂| 丁香伊人五月色婷婷五十路| 色综合久久伊伊婷婷五月| 99久久婷婷国产综合精品草原| 色婷婷玖玖影院| 综合图区激情| 少妇水多A片太爽了| 亚洲五月天色| 日本久久人人| 婷婷色五月天色| 好激情在线综合网| 国外亚洲成AV人片在线观看| 九九热欧美| 日91高清无玛| 狠狠色丁香婷婷| 99热的无码| 怎么样可以看免费的一级av| 热九九在线| 激情av| 97色婷婷五月天| 五月激情小说| 久久国产高清| 啪啪亚洲综合| 激情98色婷婷五| 五月丁香啪啪激情| 九九成人| 欧美婷婷六月丁香综合色| 日韩另类| 思思热久久艹| 色婷| 久久久久久综合88| 99人碰碰碰| 成人综合AV| 色欲久久久久久综合网综合网| 超碰永久在线| 九九热99热| 日韩精品VIP| 99性视频| 狠狠干狠狠操狠狠爱| 丁香 婷婷 亚洲 熟女| 丁香婷婷久久五月天| 亚洲色婷婷视频| 婷婷五月丁香色色| 色五月激情婷婷| 变态另类色图 | 99色视| 99热国产这里只有精品| 91操操| 99精品无码| www.精品99| 久久人妻熟女一区二区| 少妇久久诱惑视频| 五月丁香色停停啪啪啪| 天天射夜夜骑| 九九热内射| 婷婷伊人网| 色99在线看| 日韩av在线电影| 五月激情啪啪| 99热免费| 欧美亚洲操逼| 激情五月天色色色| 思思热在线视频精品| 色天堂A| 色欲色香综合网| 这里只有精品热| 人妻日日日| 日日夜夜狠狠操| 亚洲天99| 日本婷婷| 久久婷婷欧美| 色综合播放| 丁香五月情| 婷婷丁香视频在线观看免费| 99热在线观看| 五月丁香六月婷婷无码| 在线另类视频| 婷婷中文字幕| 丁香六月婷婷姐网| WWW免费视频碰碰碰碰| 激情伊人五月天| 婷婷五月天综合蜜桃| 成人 AV播放| 中文字幕av在线| 天天上天天爽| 亚洲精级| 97九色视频| 综合99在线| 色播色丁香五月| www色婷婷| 99综合99| 9l视频自拍九色9l视频在线观看| 91日韩在线| 色婷婷狠狠久久综合五月| 色噜久| 99热这里只有精品9| 亚洲国产色色| 97碰碰视频在线观看| 国产真人做爰视频免费| 丁香桃色网| 思思久久99热| 男人的天堂99| 激情伊人五月天| 日本熟女内射| 色伊人婷婷| 97久久综合网| 色99视频| 天天谢天天操| www狠狠| 青青草99re| 色色色色网| 国产色99| 丁香婷婷人妻| 成人片在线免费看| 丁香五月激情网| 99男人的天堂|