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
返回資訊列表
夫妇交换刺激做爰| 国产无人区大片| 丁香五夜激情四射夜夜夜| 婷婷涩涩五月天| 翔田千里 50岁 无码| 人人人va亚洲视频在线| 丁香婷婷久久| 最新久久网址| 操日视频| 在线成人av播放| 97综合在线| 狠狠色激情在线| 五月丁香婷婷老司机| 国产五月天激情小说| 狠狠狠狠青草| 免费日本aⅴ中文字幕 | 人与禽A片啪啪| 777色色色| 深爱丁香网| 久久99看免费| 第四色五月婷婷| 九九在线热九九在线热99热| 激情综合五月天| 99日在线视频| 综合五月婷婷| 激情伊人五月天| 人人草人| 99这里都是精品6| 性小说五月天| 狠狠插狠狠| 久热只有这里有精品| 婷婷色五月天色| 91综合视频丁香| 六月丁香网| 先锋资源91| 五月丁香婷爱在线| 九九热在线观看视频| 五月天激情无码高清| 九九热这里有精品视频| 狠狠色综合777| 99视频色在线观看| 免费观看的AV| 九九热只有精品| 五月天婷婷网站| 色色色色热热| 色婷婷婷婷成人网| 69色色视频| 色月视频| 日本色色视频| 亭亭色网| 五月天色不卡| 97色婷婷| 丁香九月激情久久| 五月激情综合网| 久久女人天堂| 玖玖在线资源视频| 久久这里都是精品| 久久婷婷六月综合| 97在线99| 99re热在线视频观看| 人人操操| 超黄亚洲瑟瑟网站| 久久综合人妻| 99久久99九九99九九九| 疯狂做受XXXX高潮A片| 人人摸人人干| www.激情五月天.con| 丁香花操逼| 伊人婷婷91| 激情久久久久久久久久久| 婷婷五月天Av| 狠狠色五月| 五月婷婷九| VfJxEwPH| 久久综合五月天| 天天爽天天爽| 怡春院久操| 久久五月网| 九九热这里只有精品5| 天天弄天天爽| 天天干天干| 8区视频在线| 另类激情综合| 久久天堂精品| 婷婷五月激情欧美大胆视频| 色婷婷亚洲婷婷| 97人人操在线| 色综合99色| 色婷婷精品视频| 色婷婷香蕉| 久久九九99| 四川BBB搡BBB搡多人乱亂| 中文字幕黄色电影网址| 男女99免费视频| 人人爱干人人爱草| 婷婷五月天激情小说| 久久久久久9| 91精品久久久久久77777| 激情九月丁香婷婷| 成人五月天色天堂| w婷婷五月婷婷w| 伊人综合网站| 久久这里这里有精品免费视频| 精久久色| 久久精品99国产精品日本| 4399精品一区二区| 亚洲 小说 欧美 激情 另类| 亚洲色婷婷五月天| 色色色国产| 亚洲婷婷丁香五月视频| 五月丁香网站| 91操人视频| 青青草原99热| 国产欧美精品AAAAAA片| 亚洲中文字幕AV| 天天添天天摸天天天天做| 天天干天天干天天干天天干天天干| 99热这里只有精品在线观看| 97色色综合| 涩涩涩婷婷| 婷婷成人五月天成人文学| 国产日韩欧美性爱| 婷婷色导航| 激情五月天 婷婷| 国内外色色色色色成人视频| 国产67194| www.99热. com这里只有精品| www激情| 东北熟女视频99| 色五月婷婷在线视频| 久久久久亚洲AV成人无码电影| 艳妇野外情欲放荡HD| 久久婷婷亚洲| 日本丁香五月| XXXX岛国| 九九九九精品精| 久热九九| 婷婷五月婷婷| 26uuu国产色| 亚洲午夜视频| 狠狠色婷婷7777久| 婷婷五月成人| 婷婷五月天伦理| 亚洲无码99| 九九九九操逼| 在线1青婷| 亚洲精品a成人在线播放| 乱女乱妇熟女熟妇综合网站| 欧美成人猛片AAAAAAA| 男人的天堂999| 成人av在线网站| 狠狠99| 激情五月天综合| 狠狠色婷| 久久婷婷丁香| 91久久久久久| 极品人妻VIDEOSSS人妻| 色六月视频| 色吧婷婷五月亚洲| 丁香五月婷婷六月丁香| 成人版视频在线观看| 国产欧美va| 99re热在线视频观看| 欧美α√| 欧美激情综合色综合啪啪五月| 五月丁香成年黄色| 天天做天天要天天爱| 婷婷五月六月| 这里只有精品在线看| 操逼五月婷婷| 天天综合 99久久婷婷| WWW久| 殴美日比视频| 狠狠精品干练久久久无码中文字幕 | 六月激情网| 日本婷婷| 少妇激情五月婷婷| 97人人操人| www.婷婷| 色综合性视频| 色综合综合色| 九九九激情综合| 欧美色爱五月天| 原琪琪色影院| 亚洲mm免费| www.色五月| 日韩九九视频| 熟美女麻豆| 婷婷亚洲综合| 五月婷亚洲精品| 国产综合色婷婷精品久久| AV人人操| 色五月激情网| 五月综合婷婷久久在线| 色五月色五天色情网| 丁香色色网| 操啊操av| 亚洲激情图文小说| 26UUU欧美激情一区二区| 超碰碰碰碰| 婷婷色五月色| 伊人色欲五月天| 色域五月婷婷丁香| 亚洲成人AV一区在线观看| 九九人人精品| 激情婷婷啪啪| 婷婷丁香五月激情中文字幕版| 久久资源综合| 色综合久久之分久久| 久久五月天婷婷| 99色6爱9热| 男人視頻站| 欧美成人猛片AAAAAAA| 四色五月婷婷| 婷婷涩五月天综合| 六月婷伊人| 97婷婷狠狠| 啪啪日本欧美| 色伦专区97中文字幕| 丁香五月婷婷大香蕉| 成人婷婷桔色| 婷婷五月天成人五月天| 99在线69| 182TV亚洲| 久久精品凹凸分类| 国外亚洲成AV人片在线观看| av大香蕉| 丁香婷婷五月综合色情| 色九区| 啪啪干伊人婷婷| 国产Va视频| 天堂久久丁香| 秋霞日本免费毛片A片| 激情综合五月婷| www.五月.com| 激情五月丁香六月综合AVXXXX| 婷婷丁香激情五月| 婷婷色天香| 夜夜天天天天天干天天爽| 五月丁香婷婷基地| 影音先锋一区二区资源站| 99热97| 综合色五月亭亭| 五月婷啪啪| 玖玖综合色区在线观看| WWW色五月| 婷婷爱五月| 婷婷五月丁香综合| 99re思思热久久| 亚洲综合无码| 久久机热/这里只有精品| 免费啪啪亚州视频| 色情五月综合婷婷| 中文av网| 99热精品在线观看| 久久99人人| 青草视频在线观看视频| 懂色av粉嫩AV蜜臀AV| 538在线精品| 久青草影院| 九九热精品| 超碰精品在线| 丁香五月婷婷欧美性爱| av人人操| 色九月婷婷综合| 欧美在线97| 激情另类综合| 久久婷婷六月综合资源| 九九热视频思思| www.丁香黄色五月天人与| 电影爱拉战争免费观看| 久狠日av| 高清不卡一区| 五月丁香久久| 色综合色综合色综合| 韩国97天堂| 九九九九中文字幕| 激情五月婷| 99久视频| 日韩欧美性爱| 97天堂| 激情com| 五月色导航| 亚洲色A| 天天干天干| 色激情五月| 人人爱操| 大香蕉久久伊人网| 久热大香蕉| 激情综合网,五月| 亚洲国产色色| 日韩无码色色| 99热欲| av国产精品偷| 天天综合图片| 超碰com| 午夜性做爰电影| 超碰2021| 99 色色吧| 婷婷五月天BBw| 五月婷婷三级| 六月婷婷AV| 色亚洲无码| 婷婷色情小说| 99热免费观看| 五月丁香六月色| 天天激情5月天亚洲| 能看的AV网站| 在线综合网| 五月婷久久综合| 亚洲av成人在线| 日本特黄aaaaa| 五月丁香影院| 精品自拍97| 乱码操操| 丁香六月婷婷| 伊人大香蕉爱聚| 综合色影| 丁香成人视频| www。五月,com| 大香蕉五月天婷婷| 色色色在线观看| 午夜天堂一区人妻| 五月丁欧美| 丁香五月天激情免费在线观看AV777| 天天日天天色| 婷婷综合激情| 99热综合网| 1024欧美看片| 天天插天天| 99操碰| 久久99免费视频| 99热成人精品| 五月天伊人| 中文字幕网站在线观看| 激情六月婷| 色色色综合| 91成人视频| 天天激情欧美美女| 色欲色香,www,com| 噜噜色噜噜网| www.com任你艹| 五月丁香综合在线| 色狠狠999综合| 九九99九九精品视频| 色久婷婷网| 亚洲视频二区| 亚洲九九夜夜| 能看的av网站| 激情五月天综合图片小说网站| 激情色色| 久久这里只有精彩| 色丁香五月婷婷| 激情久久久久| 婷婷五月色| 91狠狠色色丁香婷婷综合久久| 欧美va在线| 亚洲天堂色| 天天色综合色| 久久激丁香| 六月婷色六月| 91女人18毛片水多国产| 丁香五月六月| 在线网黄| 五月天开心网| 亭亭五月天黑人2014| 婷婷色色亚洲| 五月婷婷丁香婷婷| 九九热欧美| 99综合视频| 国产91视频| 九九热在线精品视频| 伊人影音无码一区二区三区| 最近中文字幕大全免费版在线 | 色婷久久| 丁香婷婷免费| 丁香五月激情啪啪啪啪| 色色热| 丁香五月影视| 五月天婷婷成人网| 啪啪亚洲综合| 国産精品| 无码人妻少妇色欲AV一区二区| 在线色五月婷婷| 91在线资源| 开心激情综合| 久久99这里| 久久色大香蕉| 色玖玖综合网| 九九久久五月天综合伊人| 欧美日韩成人综合9| 激情五月婷婷开心网| 丁香婷婷综合激情五月色| 秋霞性爱AV| 三区激情四射av| 天天色中文字幕女优AV| www.久久久.com| 狠狠艹狠狠艹| av在线不卡播放| 五月婷婷六月丁香综合在线| 五月丁香婷婷激激激综合网色播| 五月色婷婷中文字幕| 极品人妻VIDEOSSS人妻| 最新va在线播放| 九九热这里只有精品556| 成人婷婷色综合| 婷婷五月色色| 婷婷五月天熟妇| 97欧美在线| 夜夜爽77777妓女免费下载 | 色婷五月天激情| 在线成人网站| 中文在线视频久9| 黄色AV日韩| 五月婷婷激情69| 欧美色九| 久久玖玖99| 日本色五月| 五月色丁香视频精品| 亚洲啪啪视频| 无码动漫av| 日韩少妇内射免费播放| 久草五月天| 五月婷婷婷婷| 99热这里只有精品1998| 九九色综合| 丁香六月成人网| 婷婷在线播放| www.夜夜操.com| 日本丁香久在线| 欧美私人家庭影院| wwwss在线观看| 色五月六月| 丁香五月婷婷动漫| 久久无码激情视频| 久99| av网址在线| 日本 色综合| 欧美槡BBBB槡BBB少妇| 91操熟女| 五月丁香综合啪啪| 色五月天丁香婷婷| 日韩在线观看亚洲| 天天综合 99久久婷婷| 开心五月丁香婷婷| 六月天六月婷| 六月色狠狠色| 国产五月天激情小说| 99亚色色色| 成人电影在线免费试看| 五月婷婷|欧美| 一本色道久久综合狠狠躁小说| 丁香五月激情啪啪综合| 成人精品免费在线观看| 五月激情综合婷婷| www.cao.com久久| 欧美亚洲色色色色| 91干网站| 激情骚五月| 九一九九黄色| www91久久| 色色色五月| 婷婷五月丁香四射| 激情婷婷五月| 色综合久| 夜夜操加勒比| 91人人妻人人操人人爽| 激情五月婷婷她| 久久婷婷资源| 九九综合九九| 亚洲色情免费网| 狠狠五月天婷婷| 色插综合网| 婷婷综合激情五月综合| 九九热99热| 色婷婷五月天视频网站| 欧美六月| 97干在线| 天天爽天天日人人爱| 色五月婷婷激情综合网| 婷婷久久六月天| 婷婷六月综合| 天天久久66xxx| ay2区| 五月婷丁香久久久| 天天玩夜夜操| 久99| 六月婷久久| 大香蕉综合| 九九蜜臀精品| 九九久热| 久久六月综合| 五月刺激丁香月综合| 71在线精品视频一区| 婷婷中文无码| 伊人丁香婷婷东京| 五月天狠狠| 色5月婷婷| 99热这里有精品| 丁香五月色激情| 丁香五月停停基地| 色色色成人网| 天天插天天插| 婷婷亚洲久久| 丁香五月婷婷呀| www、色色色| 黄网在线免费观看| 射满了还射免费在线观看 -午夜版全集-新视觉影院 | 色婷婷五月丁香色| 久久久精品视频79| 五月婷婷无码| 色色热| 午夜日韩久久久网站| 日韩欧美一级大黄网站| 青青草原99热| 综合激情五月天| 欧美碰碰碰| 99热伊人| 婷婷免费视频| 色五月婷婷777| 久热大香蕉| 色综合色综合网| 99爱爱| 综合激情sV| 有码人妻久久| 久久九九免费大视频| 79色色| 亚洲AV免费在线| 亚洲Av成人在线观看| caobi四区| 日韩成人AV在线播放| 在线五月婷| 色五月婷婷久久爱| 狠狠操综合| 天堂亚洲 在线| 在线综合婷婷| 免费亚洲婷婷| 丁香五月天堂| 99riAv1国产在线观看| 中文字幕操比影片| 99这里只有精品在线| 五月婷婷中文字幕| 成人av在线电影| 久色欧美| 婷婷酒色网| 成人小说 五月天 婷婷| 成人av免费观看| 99黄色在线视频精品熟女| 五月婷婷无码| 9|在线观看视频| 天天碰天天插天天操| 丁香五月激情五月| sS丁香五月婷婷| 国产成人av在线| 色欲久久久久久综合网综合网| 巴基斯坦粉嫩无码视频| 丁香五月婷婷av影院| 电影《战争与艾拉》免费观看| 亚洲综合成人网| xxxx久| 久久玖玖综合| 超碰男人色| 99ri视频在线播放| 色碰碰| 玖玖综合色| 中文字幕,综合,91| 超碰在线精品| 国产乱码久久| 国产美女无遮挡裸体毛片A片| 五月天婷亚洲天综合网综合| 婷婷丁香六月| 丁香五月成人论坛| 色五月婷婷成人| 六月婷婷狠狠做| 免费无码毛片一区二区A片| 99re在线观看视频| 国产乱妇无乱码大黄AA片| 丁香五月亭亭六月综合激情网| 99精彩视频| 91精品熟女| 强辱丰满人妻HD中文字幕| 丁香五月另类小说在线阅读| 婷婷色影音天| 五月天成人小说| 九久久精品视频99| 91精品综合久久久久久五月丁香| 综合99在线| 大操人妻| 五月天丁香成人社| 欧洲亚洲免费视频区| 99国产精品久久久久久久久久久| 欧美久久婷婷| 日本色色网站| 99色在线视频| 久热网站| 激情综合色| 狠狠五月天| www.婷婷亚洲基地| 亚洲亚洲人成综合网络| 思思热久热| 久久婷婷色情7777网站| 丁香网站| 99热思思| 婷婷丁香五月视频| 激情丁香久久| 久久五月视频| 直接看的AV| 久久HD| 久色精品| 久久性视频| 五月丁香 久久久| www. 五月. com| 99精品色| 日韩aaaaa| 噜综合| 人人草碰| 国产精产国品一二三在观看| 婷婷久久丁香| 涩涩五| 99re视频在线播放| 综合狠久久| www色婷婷| 男女久久婷婷五月天| 色玖玖综合网| www.九九婷婷| 97精品人人A片免费看| 婷婷五月天亚洲五码| 99热国内| 亚洲午夜视频| 婷综合六月| 国产毛片精品一区二区色欲黄A片| 激情综合丁香五月| 五月综合亚洲| 色情五月婷婷| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 亚洲无码色| 人人色AV| 国在线激情网| 九热视频在线精品15| 天天干天天av天天射| 天天干天天做| 中文字幕不卡+婷婷五月| 五月天六月婷婷电影| 婷婷六月丁香综合| 色婷婷色99国产综合精品| 热久综合| 超碰免费人| 九九伊人网| 五月丁香婷婷久久| 99ri精品在线| 伊人婷婷综合| 亚洲无码成人网| 黄网网站在线播放| 深爱激情网噜噜色| 精品99在线| 国产精品久久久久久喷浆| 九色在线五月婷婷网址| 激情五月婷| 五月亭亭开心网| 丁香五月婷婷激情尤物| 超碰免费成人| 婷婷五月天中文字幕.| 色停停五月天| 疯狂做受XXXX高潮A片| 人人干天天舔| 亚洲精品a成人在线播放| 久久人人人人妻| 色热久资源| 异能之下短剧免费观看全集| 99人人操人人操人人精| 五月婷婷偷拍| 99在线视频精品| 婷婷五月色花丁香社区| 99er国产| 婷婷天天色| 99热这里只有精品96| WWW·色色色·COM| 色情成人五月天| 婷婷五月天 丁香五月天 裸体| 六月丁香婷婷拍拍| 欧美性二区| 婷婷综合网伊人| 色大综合| 天天透天天干| 久久婷婷五月综合啪| 殴美日韩成人| 九九亚洲综合| 2015好吊操| 成年人丁香五月| 色五月婷婷五月天| 亚洲综合色婷| 97婷婷丁香五月天激情图片| a在线免费v| 99热都是精品| 精品无码色欲AV| 婷婷综合五月色播| 亚洲色网络| 亚洲婷婷91丁香| 99热在线只有精品| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 亚洲综合字幕色色| 2025最新亚洲激情在线| 九九视频这里只有精彩| 91热视频色网站| 亚洲色视频| 99国产精品久久久久久久久久久 | 婷婷久久久久久久| 亚洲综合激情五月| 五月天综合婷婷| 97精品人人A片免费看| 丁香五月成人自拍| 婷婷色丁香五月| 日本精品。999| 九九久热| 亚洲天堂99| a免费在线| 97精品自拍| 另类图片 五月激情| 精品久久艹| 大香蕉综合在线| 九九色插| 噜一噜免费视频| 国产午夜一区二区三区| 99精品在这里| 中文字幕五月久久婷婷| 九九热九九| AV性爱在线| 成人做爰高潮A片免费视频| 伊人久热91网| 99热这里只有精品96| 日本一级特黄大片AAAAA级| 少妇人妻人伦A片| 九九99香蕉在线视频播放| 九九热在视频| 91热视频色网站| 婷婷.com| 九九人妻福利| 8区视频在线| 91九九九九九九| 狠狠色丁香五月婷巨| 激情5月婷婷| 五月丁香色色网| 久久婷婷人人| www,99热| 五月天激情色色| 丁香五月性| 五月婷婷综合丁香视频| 1024在线一区| 婷婷五月色花丁香社区| 久久多色| 91|九色|动漫| 久久久久久人妻久久久久久久久久人妻久久久 | 青青草99热久久精品国| 亚洲成人乱码av网站| 激情综合网五月| 无码yw| 狠狠干综合网| 国产成人AV不卡| 99热在线里有精品| 99热综合| 久久这里都是精品免费| 日韩成人中文字幕| 欧美视频五区| 九热免费视频| 色婷婷五月影院| 激情小说视频图片| 久久激情四射| 日本激情五月天‘| 大香蕉在九| 天天综合天天玩夜夜玩天天玩夜夜玩| 婷婷五月色| 欧美va亚洲va| 国产日比| 99热精品10| 欧美一级色| 激情综合网,婷婷| 另类图片五月天| 六月婷婷狠狠| 极品少妇高潮啪啪AV无码| 久久五月天精品视频| 丁香五月Av| 欧亚洲在线高清视频| 亚洲操B| 激情综合自拍五月婷婷色五月| 亚州操人在线视频| 无码四色色色| 色婷婷亚洲婷婷| 色婷婷丁香五月观看| 国产一区二区三区影院| 色婷婷五月天成人网| 91久久久久久久久久18| 另类综合网| 久久久久久久五月| 亚洲色图五月丁香| 久久精彩综合视频| WWW.国产| 激情五月综合网最新| 五月婷婷黄色毛片| 日韩狠狠色| 好吊操这里只有精品| 中文人妻AV久久人妻18| 婷婷五月六月丁香综合| 亚洲热久| 五月天开心激情综合网| 欧美天天综合网站上去吧| 五月成人丁香av91| 久久久久人妻精品| 91色五月| 精品夜夜澡人妻无码AV| 夜夜撸日日骑| 婷婷五月丁香花综合| 99热这| 亚洲久久婷婷| 色婷婷91| 深爱激情五月天| 色婷婷久综合久久一本国产AV| 天堂爱啪啪| 香蕉婷婷| 26uuu另类亚洲欧美日本一| 丁香五月婷婷天堂大香蕉| 99热精品中文字幕| 人人视频色| 色综合色五月| 九九9久九9国产视频| 五月天婷婷久久视频| 91色久| 亚洲传媒在线观看| 五月天开心色情网| 丁香婷婷久久老熟女综合网| 丁香六月婷| 精品无码久久久久久久久 | 五月天婷婷在线AN| 欧美婷婷五月| 久久这里只有精品久久| 色综合99无码| 黄色AV日韩| 九一99| 婷五月天天| 涩玖玖免费视频| 婷婷五月天丁香| 久久天天| 天天综合亚洲综合| 色综合久久综合中文综合网| 久婷婷视平| 97人妻碰碰中文无码久热丝袜| 狠狠干青青草| av在线观看免费| 99色人| 婷婷色色五月天| 色色色婷婷| 狠狠插狠狠| 日韩色色小视频| 色婷婷综合成人| 大香蕉视频99| 免费无码毛片一区二区A片| 亚洲精品在线视频| 5月婷婷五月天| 综合在线丁香五月| 99色在线视频| 婷婷五月精品中文字幕| 沈娜娜av| 美女婷婷激情亚洲| 色99视频| 五月天激情四射| 色婷婷五月天视频网站| 五月天电影网| www.五月激情.com| 亚洲小说五月婷婷| 日本色婷婷| 日本视频99| 天堂网色色| 俺去婷婷 丁香| 欧美熟女视频 色婷婷| av国产精品| 五月天婷婷久久视频| 久久婷婷亚洲| 久草A片| 欧美在线视频免费播放| 久热这里只有精品6| 一级A片天天操夜夜操| 色亚洲中文| 在线五月婷婷小电影| 人妻熟妇国产精品| 激情五月婷婷| 婷婷久热| 日日爱678| 五月天色色色| 九九九这里只有精品| 51成人| 婷婷五月天堂| 激情五月天色网站| 依人大香蕉| 婷婷五月天国产精品| 激情小说五月天社区丁香| 日本综合久久| 这里只有精品日韩| 秋霞黄色一级久久| 都市激情五月婷婷综合| 丁香五月天殴美激情| 伊人五月久久| 亚洲色欲AAAAAA| 精品无码99| 99精品在这里| 综合久久高清| 婷婷天天日婷婷| 久草婷婷| 丁香五月天91| 中文字幕婷婷在线| 啪啪丁香五月| 伊人激情| 色婷婷色久综| 亚洲久热无码| 久婷五月| 美日韩成人| 疯狂做受XXXX高潮A片| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 婷婷五月深深爱| 婷婷五月天电影网| 欧美色五月| 精品夜夜澡人妻无码AV| www.久操| AV操逼网| 婷婷六月丁香色| 99r这里只有精品在线观看| 天天激情欧美美女| 九九99精品视频在线观看| 亚洲精品字幕在线观看| 999热在线观看视频| 久9精品| 五月六月丁香激情视频| 色情一区二区播放| 人人摸人人干| 欧美人与性动交CCOO| 碰碰碰碰碰99| 激情九月婷婷| www.五月丁香av| 婷婷玖玖五月天| 九九在线精品| 99久久.www| 亚洲视频a| 五月婷婷色激情| 色色色欧美| 操91综合网| 大香蕉啪啪| 99re这里只有精品首页| 欧美啪啪9| 无码人妻丰满熟妇奶水区码| 亚洲热久| 婷婷舔| 一级精品999WWW| http:色情日本com| 免费啪啪亚州视频| 五月婷婷色情| 五月香婷婷| 五月刺激丁香月综合| 亚洲综合婷婷| 婷婷婷婷婷开心无码播放| 泰州成人视频| 成人色图情色成人网 www.5b5b5bcom 五月天 | 婷婷五月天AV| 人妻操逼视频| 天堂无码人妻精品AV一区| 色色色在线观看| 亚洲中文乱字字幕线在永久| 人妻精品在线| 最熟少妇乱码| 亚洲丁香五月美女| 另类天堂| 色色九区| 丁香5月婷婷| 激情婷婷| 久热91| 婷婷婷婷婷开心无码播放| 国产欧美熟妇另类久久久| 亚洲色图45p| 免费五月婷婷网| av国产精品| 婷婷综合网| 丁香在线视频| 五月丁香婷婷老司机| 精品无码色欲AV| 开心激情网五月天| 97se视频在线| 深爱激情丁香| 丁香婷婷天堂| 婷婷五月天,影院| 人人摸人人摸| 色播婷婷大香蕉| 色九九九九| 97AV人人插人人操| 人妻自慰高清合集| 95精品区一区二| 色色婷五月天| 亚洲色婷婷| 26uuu欧美日韩| 色婷婷综合视频| 婷婷五月天中文字幕| 97丁香五月| 色综啪啪| 五月丁香激情婷婷综合| 无码激情AAAAA片-区区| 思思视频这里是精品| 欧美成人A片AAA片在线播放 | 天天在线天天综合网色| 婷婷激情图片| 天天噜天天插| 丁香五月婷婷基地| 五月天激情综合在线| 男女99免费视频| 亚洲无码另类| 五月丁香免费看| 久热这里只有精品6官网亚洲| 香蕉综合网| 婷婷丁香五月天哟啪| 五月婷丁香| 婷婷五月天视| a网站免费观看| 天天干天天日天天插 | 热的国产99热| 久草婷婷| 五月婷婷婷婷婷婷艺术| 人碰人人人玩91| 成年人看Va免费视频| 国产三级在线播放| 日本婷婷| 二色AV| 99久re热视频精品98| 99在线观看这里都是精品| A片试看50分钟做受视频| 九九热这里只有精品12| www,99热在线观看| 色婷婷五月综合| 久操福利| 丁香五月偷拍| 久久机热这里只有 | 香蕉人在线香蕉人在线 | 日本久久婷婷| 激情综合亚洲| 亚洲麻豆乱码国产2028| 在线播放成人| 超碰资源在线| 久久这里只有国产| 婷婷色色亚洲| 五月丁香六月婷婷啪啪| 欧美熟女99| 欧洲第一无人区观看| 六月久久狠狠| 五月丁香综合在线| 国产69久久久欧美黑人A片| 天天插天天| 在线中文亚洲| 日本综合久久| 开心五月综合| 九九综合伊人| 成人国产欧美大片一区| 夜夜爱网站| 五月丁香六月在线欧美| 色婷婷丁香女女| 丁香婷婷激情五月天无毒不卡蜜桃| 天天肏视频| .青娱乐天天操B| 久久Xx| 亚洲天堂AAA| 色玖玖玖| 国产又粗又大又爽又黄| 99视频在线精品| 99'无码| 伊人色五月| 天天操天天插| 激情綜合網址| 亚州激情网站无码| 久久久久久久久久久44| 五月激情综合网| 五月天久久91| 手机看片日日做夜夜| 五月丁香毛片| 日韩AV在线影片| 五月丁香婷中文| 亚洲激情精品| 天天色天天色天天色天天色天天色天天色| 人人操婷婷| 天天操天天干天天日| 婷婷五月天精品| 成人久久天天x资源站| 九九性爱网| 91色呦哟| 色偷偷综合| 五月色丁香| 九九热视频免费观看| 婷婷五月天影院| 四色五月视频| 久久婷婷青青草| 激情婷婷五月天| 九九这里是免费的视频5| 六月天六月婷| 激情综合女人网五月播播| 99ri精品在线| 碰人人97| 河北真实伦对白精彩脏话| 在线看片av| 人妻久久久| 黄色AAAAA| 深爱五月天 开心网| 99热免费网站| 日韩综合网络男女香蕉a片| 国产黄色av| 大香伊人久色| 六月天婷婷| 久久久免费精彩视频| 亚洲黄色精品| 久久亚洲天堂| site:pnnrt.com| 婷婷六月伊人| 欧洲高清免费久久| 婷婷丁香五| 蜘蛛女免费观看完整版高清电影| 久操热线| 欧美三级欧美一级| 亚洲午夜电影| 丁香五月综合无码趴趴| 亚洲啪| 亚洲精品无码A片一区二区| 99热在线观看| 国产全是老熟女太爽了| 色婷婷丁香五月| 婷婷激情小说| 思思热视频| 思思热精品在线视频| 婷婷中文字幕| 激情小说在线视频| 丁香六月五月天| 九九激情| 精品久热| 亚洲无AV在线中文字幕| 欧洲MV日韩MV国产| 男女啪啪做爰高潮无遮挡| 午夜不卡久久精品无码免费 | 亭亭五月色男人| 婷婷夜夜操| 第四色五月天| 丁香 亚洲 久久| 伊人狠狠丁香婷婷综合尤物| 亚洲午夜一区二区| 五月丁香自拍| 天天天天天日| 成人短视频在线观看| 日产精品久久久久久久蜜臀| 精品成人无码A片观看香草视频| 九九99九九精品免费 | 97碰在线视频| 五月丁香久久综合| 色播五月丁香婷婷| 开心五月婷婷99| 激情婷婷啪啪| 91色操| 97色色网| 色婷婷丁香女女| 激情综合在线播放| 日韩在线视频中文字幕| 婷婷色综合| 深爱激情AV| 婷婷五月天在线观看免费| 97热在线精品| 99久视频| 玖玖99婷婷| 91久久久久久久91| 99热情这里只有精品在线播放| 五月丁香六月婷婷中合网| 99er久久| 五月婷婷黄色| 思思久久99热只有频精品66| 超碰2021| 色六月婷婷| 五月婷婷中文网| 天天操天天操天天操天天操天天操 | 激情五月综合网| 五月丁香六月停停停| 亚洲性视频| 色情五月丁香婷婷网| AV79| 激情久久五月天| 精品成人在线| 99在线视频免费| 激情丁香淫荡婷婷| 操操操Av| 丁香五月色情| 久久五月婷婷视频| 91精品熟女| 五月欧美丁香在线观看| 99色在线视频| 一区三区视频有限公司| 丁香六月婷婷五月天| 色色AV色色色东莞| 五月天激情影院| 97久操| 热99视频精品| 天天插天天干| 亚洲熟妇AV乱码在线观看| 色色九九五月天| 婷婷丁香人妻| 色婷婷操逼| 色吧99| site:jszngf.com| 天天综合精品| 97在线观视频免费观看| 日本高清久| 久狠日av| 五月婷婷六月色| 久久婷狠狠色| 色J香五月天| 开心激情婷婷| 碰碰女| 狠狠草狠狠草| 少妇人妻人伦A片| 久久婷婷精品| 亚洲视色| 成人超碰网| 狠狠色丁香| 日本婷久久| 国产婷婷五月| 人妻 性久久久久久| www.zbzhongsen.com| 99热99网| 日韩av免费版| 日本a片网址| 超碰成人av| 九九久久污| 亚洲日韩26uuu| 五月天激情小说网| 伊人婷婷大香蕉| AV五月婷婷露脸| 欧美情色一区| www.夜夜夜| 五月天综合色| 日韩操逼大片| 成人在线视频一区| 九月婷婷激情久久| 婷婷丁香五月,狠狠综合| 少妇人妻人伦A片| 欧亚色色| 五月天色丁香| 婷婷99狠狠| 国产免费一区二区在线A片视频| 91丨九色丨老农村| 激情5月婷婷| 一区=区操屄高清大全av| 亚洲十月婷婷综合| 9色91视频| 手机看片日日做夜夜| 久热伊人| 激情综合网之激情五月| 亚洲婷婷五月天| 五月婷婷在线丁香| 色婷五月| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 久久婷婷五月天激情新地址| 99热99思午夜精品| 天天做天天爽| 亚洲性爱干干| 无码激情AAAAA片-区区| 熟女乱论网| 三男玩一女三A片| 天天插天天很| 久久婷婷午夜| 婷婷99狠狠躁| 色欲婷婷五月天丁香|