欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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
返回資訊列表
www.91操| 激情五月天色色色| 色综合久久五月天| 深爱激情小说五月婷婷| 中文av网| 可以直接看的AV网站| 五月开心网| 六月丁香色婷婷| 激情国产综合| 99碰碰。| 香蕉AV777XXX色综合一区| 成人片在线播放| 婷婷丁香综合网| 五月婷婷色综图片| 9999热精品在线免费播放| 99re在线观看| 五月婷婷五月天| 日操夜撸| 久久精品永久免费| 伊人日日干| 一级二级色大片| 9久热在线视频精品| 久久综合丁香五月| 婷婷色在线视频| 色色色com| 天天高潮夜夜爽| 2025中文在线视频字幕免费观看| 91精品丝袜久久久久久| 天天操狠狠操| 激情五月天免费视频| 婷婷色导航| 婷婷五月婷婷五月| 婷婷大美在线| 婷婷大美在线| 日本狠狠爽| 人人插9| 岛国在线观看91| 九九99免费视频| 五月色丁香视频精品| 国内一级精品| 男女啪啪做爰高潮无遮挡| 影音先锋xfplay资源男人网| 噜噜在线| 超碰97免费在线| 99国产精品久久久久久久久久久| 美女天天爽| 99精品在线下载| 电影《战争与艾拉》免费观看| 成人无码免费一区二区中文| 五月婷婷在线免费| 五月天网站免费欧美| 卡视频1区2区| 久久综合网桃花| 亚洲AV日韩在线观看| 9 1在线视频| 91色逼| 操操操AV| 五月婷婷草| 女高怪谈在线观看| 激情五月天色播| 操啊操av| 天堂综合久| 欧美色色色色色| 日日狠狠久久偷偷四色综合免费 | 天天射网站| 成片免费播放| 大香蕉久久视频久久视频| 日本精品。999| 丁香婷婷性爱| 婷婷伊人| 丁香六月婷婷色XXXX| 亚洲综合五月天婷婷| 激情综合综合综合| av在线超清中文| 激情丁香淫荡婷婷| 亚洲色人妻| 色婷婷影| 亚洲五月丁香综合网| 国产高清视频91九九九久久久| 99色精品| 色五月丁香91| 激情熟女网| 免费视频WWW在线观看网站| 先锋资源婷婷| 大香蕉五月天| 人妻av在线| 激情第四色| 伊人网碰碰| 丁香五月电影| 搡BBBB搡BBB搡18| 噼里啪啦在线观看免费完整版视频 | 九九婷婷五月天| 99热777| 五月婷婷激情综合视频| 激情深爱五月婷婷| 成人视频婷婷| 99色网站| 丁香五月色色婷| 激情性爱五月| 深爱激情五月天婷婷网| 开心五月天激情| 五月天天天色| 9999三级片| 丁香五月婷婷色播艳门照| 久久婷婷在线| 五月天狠狠网| 亚洲色婷婷色| 天天射影| 久久丁香| 欧美色片中文字幕久久久久| 五月婷婷内射网| 五月激情天| se色99| 五月天激情日色在线| 日日天天干| 天天日夜夜拍| 激情av在线| 日本本土色网第一区| 激情小说五月天社区丁香| 青青草原亚洲天堂| 久久96热| 六月婷婷久久| 天天综合91入口| 五月婷狠狠| http:色情日本com| 国产av天天插天天操天天爽| 色优久久| 99视频在线观看地址| 岛国AV网| 人人爱人人添| 天天干天天干天天| 色婷婷97| 91久久99久久91熟女精品| 婷婷开心激情| 九九AV在线| 91干视频| 97色婷| 久久久97| av亚洲国产小电影| 婷婷9月天| 色五月亚洲| 超碰人人艹| 丁香五月婷婷成人色区| 婷婷欧美激情综合| 91色在线 | 日韩| 99热在线观看精品| 國語久久婷| 婷色五月天| 色久综合| 人妻精品在线| 99热1| 欧美色99| 国外亚洲成AV人片在线观看| 996er热| 大香蕉五月天| 欧洲电影在线观看免费版英语版 | 久久精品A片777777| 久久精品一区二区三区四区| av在线婷婷| 久热这里只有精品在线| 日韩AAA| 午夜在线成人网站免费观看| 久久九九囯产| 五月天激情站| 97丨九色丨国产丨PORNY| 色狠狠999综合| 婷婷爱五月天| WWW久久久| 日日夜夜婷婷| 极品九九九九九九| 日本欧美国产| 色五月婷婷天堂| 日日夜夜天天综合| 激情五婷网| 99久久久久| 亚洲色婷婷99一9|| av性爱在线| 日本爆乳片手机在线播放| 久色中文| 婷婷欧美综合| 日韩黄在免| 五月激情综合性爱| 99爱免费在线观看| 丁香久久久| 99热这里只有精品99| 九九热在线观看6| 99热亚洲| 99热无码| 亚洲第一综合| 丁香五月伊人| 精品久久99码| 婷婷六月综合激情| 五月花激情| 亚洲综合另类| 色婷婷视频在线| 五月情四婷婷| 婷婷五月18永久免费网站| 婷婷五月综合在线| 欧美性爱五月天| 婷婷欧美综合| 五月天婷婷久久| 激情婷婷丁香色五月| 亚洲激情网| 丁香九月婷| AV人人操| 8区视频在线| 午夜丁香| 日本三级中国三级99| 五月丁花六月丁香综合| 女高怪谈在线观看| 青青草成人网| 在线观看欧美3区| 久热超碰| 色欲婷婷五月天丁香| 91爱啪啪| 丁香五月大香蕉AV| 欧美VA在线观看| 五月丁香啪| av电影在线播放| 五月丁香六月婷婷综合免| 久婷婷久草| 狠狠色狠狠| 色狠狠综合| 老师的粉嫩小又紧水又多A片视频| 青青草青青草五月天| 一区二区三区四区牛| 婷婷99视频精品| 丁香五月婷婷激情小说| 丁香五月婷婷超碰在线| 蜜桃婷婷狠狠久久| 婷婷五月天社区| 欧美人人草| 色播五月婷婷综合| 玖玖在线视频福利| 天天色天天射天天日| 亚洲色啪| 丁香五月欧美激情| 亚洲综合婷婷六月丁香五月| 亚洲综合视频网| 天天色中文字幕女优AV| 99热99精品| 狠狠狠狠狠草| 色了色综合| 日本欧美国产| 狠狠干夜夜干| 五月Huangsewang| 婷婷激情丁香五月婷婷激情丁香五月婷婷| 人人97碰| 玖玖爱综合网| 97视频久久| 九九色综合| 99热都是精品| 99热这里只有精品22| 国产成人片| 久久久久久久丁香五月天婷婷| 五月丁香猫咪久久婷婷综合视频激情四射网入口 | 九九视频在线观看| 激情五月天婷婷丁香| 婷婷精品性性性性性性性| 99这里只有精品视频免费| 婷婷丁香色情五月天| 五月丁香婷婷三级| 四色99久久| 99小视频网站| 亚洲婷婷激情888精品久| 久久AV无码精品人妻系列试探| 久久性爱视频这里只有精品| 操操操操操操婷婷五月天| 五月婷婷综合天天操| 九九热av| 日韩色五月| www.99热. com这里只有精品| 97碰成超视频免费视频| 99热九九热| 久久婷婷桃花五月天| 激情久久婷婷| 深爱五月网| 九色综合五月天婷五月| 91啪级电影| 国产成人精品一区二三区熟女在线| 97色色婷婷五月天| 99在线观看精品视频| 91九色成人原创视频| 天天激情综合| 婷婷五月欧美综合| 九九热99热| 婷婷丁香色五月亚洲| 激情又色又爽又黄的A片| 五月丁香六月激情欧美综合| 五月伊人综合| 五月天婷婷青青| 少妇人妻丰满做爰XXX| 99热99干| 亚洲六月婷婷| 99热久只有| 婷婷啪啪| 五月婷婷AV| 五月丁香婷婷免费视频| 精品少妇蜜臀91| 可以直接看的av网站| 97人人操人人拍| 97AV在线视频| 婷婷五月在线视频| www.刺激色网站www.| 国产亚洲99久久精品| 天天色天天日天天舔| 色婷婷五月综合在线| www.一起草av| 天天综合网站| 久久综合激情| 成人五月天综合网| 琪琪色五月天| 欧洲激情网站| 综合久久首页| 日日操天天操| 天天搞天天色综合| 色婷五月天| 91色婷婷综合久久中文字幕二区| 这里有精品99| 五月综合激情图片| 99爱精品| 激情五月婷婷丁香| 第四色五月激情网| 99re青青草| 久久婷婷伊人| 色婷婷在线视频综合| 清纯唯美 激情四射| 丁香五月 六月婷婷首页| 亚洲丁香花五月丁香花| 天天干天天射色综合| 99视频日韩| 人妻内射视频| 丁香五月天婷婷久久| 97超碰免费超级在线观看| 久婷婷视平| 99热这里是精品| 香蕉久久国产AV一区二区| 久久机热/这里只有精品| 色亚洲无码| ai97re99一本| 久久亚洲婷婷| 伊人婷婷综合| 99视频这里有精品免费观看| 超碰93在线观看| 超pen个人视频97| 精品人妻伦一二三区久久| 69精品人妻不卡视频| 人人爱人人摸人人澡| 4399无码视频二区| 婷婷丁香成人| 99热综合色图| 2025色婷婷| 久久久91| 亚洲热久| 日韩AC在线免费观看| 五月天激情小说欧美激情| www.夜夜爱.com| 天天狠狠夜夜狠狠2023| 热中文字幕| 996热re视频在线观看视频| 日日夜夜干| 日批在线看| 99久久99九九九99九他书对| 国产av一区二区三区| 精品亚洲VA网站| 99 频99热国里只有精品| 丁香五月天大香蕉啪啪| 婷婷成人综合| 色欲久久久久久综合网综合网| 性爱先锋AV| 综合伊人久久| 99re热在线观看| 日本噜噜色网| 伊人五月久久| 色情丁香五月天| 操逼毛片国语对白| 国产婷婷综合| 婷婷激情五月视频| 人人插操| 日本人妻伦在线中文字幕| 婷婷五月天欧美图片在线播放电驴| 亚洲色频| 久久久久久人妻| 五月婷婷激情网| www.成人婷婷综合| 亚城区在线| sewuyuejiqingwang| 久久久久人妻网址| 精品国产一区二区三区四区阿崩| 欧美综合激情五月天| 非洲一级AV| 狠狠综合久久综合| 9久操| 91丨九色丨东北熟女| 极品人妻videosss人妻| 91碰| 色五月色五天色情网址| 久久久97| 九色无码| 91婷色| 丁香婷婷性久久| 亚洲精品永久久久久久| 丁香六月婷婷色XXXX| 婷婷伊人五月丁香天堂网| 婷婷97| 99热官网| 国产午夜精品一区二区三区嫩草| 精品久久99码| 婷婷激情人妻| 99色在线| 超碰99久久| 久久人人九九| 在线中文字幕视频| 久久这里只有精品99| 能看的AV| 九九九色综合| 91久久久久久| www.色五月| 欧美在线视频99| 专区无日本视频高清8| 9久久婷婷国产综合精品性色| 五月天婷婷五月| 久久久久99精品成人片| 色五月开心五月激情五月| 色婷婷伊人| 99热18| 51成人| 久久婷婷五月天| 久久综合激情五月天| 伊人色综合久久久| 九九五月天| 亚洲第一成人无码A片| 国产精品黑丝| 婷婷天堂伊人| 日本九九网| 妇激情基地| 午夜九九九九九九九九九九九九九| 亚洲欧洲中文日韩久久AV乱码| 99久久激情视频| 五月丁香六月激情综合| 五月丁香综合网| JAPANRCEP老熟妇乱子伦视频| 国产67194| 日本三级日本三级99| 99色色视频| 丁香五月综合婷婷| 久久久久人妻网址| 六月婷婷综合网2| www一起操在线观看| 色婷婷久久7777| 九九色热| 91久久久久久| 91高潮喷水久久久久久久久 | 亚洲综合色婷婷文学| 免费观看全黄做爰的视频| 欧美色色色| 狠狠干五月| 久久久27操| 亚洲AV综合在线观看| 丁香五月日韩| 五月四色婷婷| 99久在线精品99re8热| 五月激情小说网| 国产9色在线/日韩| 99精品视频在线观看| 久久婷婷五月综合啪| 色婷五月| 黄网在线观看免费| 色色色网站| 果冻传媒A片一二三区| 99热最新国内| 草草视频91| 日本激情五月天‘| www.婷婷.com| 综合九九久久| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 午夜激情久久| 成人深爱丁香五月| 天天日天天爽| 午夜无码熟熟妇丰满人妻 | 九九热精品6| 久婷| 丁香av网| 琪琪理论片| 五月婷六月丁香| 天天搞天天色综合| 操逼视频网址| 色综合久久五月| 色香欲综合| 九九热免费| 久久婷婷五月综合色和| 色爱99| 色综合色综合婷婷热| 色婷婷五月天天天做| 色播五月丁香| 在线观看国产高清视频免费网站 | 拍真实国产伦偷精品| 日本欧美成人片AAAA| 怎么样可以看免费的一级av| 中文字幕综合色| 色婷婷黄色网络| 丁香婷五月天开心六月| 色婷婷综合网站| 色www.con| 丁香五月婷婷成人网| 欧美 日韩 成人| 国产欧美精品AAAAAA片| 五月花激情网| 婷婷五月精品中文字幕| 在线中文字幕视频| 97碰免费精采视频| 欧洲亚洲免费视频9| 丁香婷婷久久综合在线| 久久九九网| 婷婷丁香五月天熟女丝袜| 午夜激情综合| 久久久人妻门| 免费黄网不卡AV| 激情的五月婷婷蜜桃| 六月香五月婷| 亚洲中文字幕在线观看| 久久久欧美精品sm网站| 天天碰天天插天天操| 色五月婷婷基地| 五月天婷婷青青草| 天天做综合网色综合| 夜夜躁婷婷AV| 丁香五月伊人| 亚洲 五月 婷婷 成人| 色综合综合色| 在线观看免费狠狠色丁香香综合| 碰碰91| 色欲午夜无码久久久久久张津瑜| 夜夜操加勒比| 五月天婷婷丁香蜜桃91| 激情AV在线| 色婷婷五月影院| 天天久| 99久久国产综合精品五月天喷水\| 91岛国片| 综合99视频| 亚洲色婷婷五月天| 4438激情网| 久久久久久9热不雅视频| 99色婷婷视频| 可以免费观看的AV| 久久国产性爱A V| 91视频一起草| 国产美女无遮挡裸体毛片A片| 亚洲AV无码影院| 天天日综合| 五月天另类图片区99| WWW激情五月天| 香蕉久久国产AV一区二区| 一区=区操屄高清大全av| 丁香五月网络网络| 人与禽A片啪啪| 色色是色N一| 97av在线视频| 99热这里只有精品69| 天天干天天色综合| 成人五月天色天堂| 超碰在线网站9| 婷婷五月丁香综合激情小说| 激情五月综合网最新| 9999热免费视频视频| 性视频久久| 婷婷五月天无码| 九九热99在线视频| 大香蕉99热| 狠狠色丁香五月婷巨| 国产精品爽爽久久久久久| 97偷拍对白视频| 色五月婷婷九月| AV成人在线播放| 99久久9| 激情com| 综合色色五月| 丁香五月成人网| 91美女被操| 香蕉综合网| 精品乱码视频| 黄急一级视频| 伊人丁香五月| 五月天婷婷涩涩| 无码人妻激情| 日日干夜夜撸夜夜骑| 91久久婷婷| 五月丁香青草综合啪啪| 五月天色图| 99爱免费视频| 996er热| 99九九精品| 日韩操| 站长推荐无码播放| PORNY九色9l自拍视频成人| 九九色大香蕉| 日日干天天| 操操操操操操婷婷五月天| 综激情网| 99在线精品观看99| 九九爱激情| 饮料下药迷倒漂亮女同事强干| 日本少妇AA一级特黄大片| 婷婷五月丁香在线视频| 色婷婷综合成人| 婷婷色五月开心五月| 久热精彩视频98| 国产色色网址网站| 欧美啪啪五月天| 丁香五月综合| 精品婷婷五月视| 欧美日韩国产一区二区| 五月婷婷激情性爱| 99久久精品网| 99精品在线观看| 99热热热天天人人人超超碰| 五月天狠狠网| 婷婷五月天色丁香| 亚洲区在线| 夜夜骑夜夜操| 夜夜撸日日操| 天天做综合网色综合| 精品日本视频444| 婷婷久久网| 久色中文| 丁香五月激情六月欧亚激情综合导航 | 久久五月综合| 亚洲丁香婷婷五月天综合色| 三级片AAA久久久AAA久久久AAA | 九九热中文| 亚洲深喉aV| 97色婷婷成人综合在线观看| 啪啪一区| 999久久久国产精品| www激情com| 久久99精品久久久久久三级| 性色视频| 亚洲精品va| 国产九九一区二区三区| 五月丁香婷婷综合网| 天天爽天天日| 五月第四色| 99日在线观看视频| 婷婷五月成人| 日本久久婷婷| 天天撸天天干天天插| 91.com男女操| 思思干精品| 日本99视频| 26uuuuuuuu国产| 91精品丝袜久久久久久| 欧美性爱丁香五月| 人人摸人人干| 亚洲天天操| 日本视频99| www,色色色网站| 婷婷丁香五月天小说| 小色小蛇伊人婷婷色香五月| 中文字幕按摩做爰| 天天日天天爽| 婷婷色五月天在线观看| 激情五月婷婷啪啪| 天干干夜夜操| 五月天伊人av| 狠狠操天天操| 久久五月天婷婷视频| 69天堂99| 色色色九九九五月婷婷| 五月婷婷综合在线视频小说| 色婷婷综合久色AV五色最新| 99热日本精品| 操碰99在线视频观看| 中文字幕av在线播放| 久99精品视频| www.com任你艹| 狼人伊人天堂| 97久久久| 开心激情综合| 丁香婷婷久久激情| www.久久五月天.com| 一区二区三区四区牛| 黄桃AV无码免费一区二区三区| 九色啦蜜臀| 婷婷无码视频| 五月停停激情网| 亚洲色色香蕉| 人妻精品一区二区三区| 丁香五月综合福利视频导航| 99 福利 导航| 超碰资源在线| 久久婷婷综合网| 丁香九月婷婷综合| 99精品在线| 婷婷五月天综合网| 色播婷婷大香蕉| 人妻av在线| 网色99| 婷婷五月激情网站| 欧美va视频不用播放器的va视频网| 一起操 91N.com| 97自拍99| 91n网站cad入口在线观看| 色5月婷婷| 日本久久精品| 五月丁香婷婷啪啪| 91色呦哟| 色色综合网www| 色9999综合久久| 啪啪操操| www.九九婷婷| 久久总和99| 久久婷婷五月| 亚洲在线操| 亚洲一级色电影| 久久久久久欧美精品se一二三四| 啪啪婷婷五月天激情| 九九综合图片网| 亚洲 视频 导航 一区| 午夜福利成人AV91| 久久婷婷综合基地| 超碰成人免费| VA日本视频| 婷婷五月色丁香在线看| 激情五月五月五月婷婷| 先锋男人99资源| 五月婷婷二月丁香| 99视频九九热| 久久久久久人妻| 超PEN精品在线| 综合九九中文字幕| 久久精品爱爱| 久久色五月天综合网| 婷婷五月噜噜| 99玖玖免费视频| 婷婷99狠狠躁天天躁| 婷婷人人操| 丁香五月社区| 亚洲色五月婷婷| 亚洲九区| 99久久免费精品| 成人av中文字幕| 国产精产国品一二三在观看| 日韩在线观看网址| 色婷插| 久久婷婷五月综合精品蜜芽| 天天爱天天操| 亚洲色区17| 七月丁香五月婷婷在线| 99性视频| 激情久久久久久| 精品香蕉99久久久久网站| 黄色录像网点| 丁香婷婷五月色成人网站| 九热...av| 操操操www.com| 成年人99热| 91狠狠色| 亚洲啪啪自拍| 丁香五月婷婷亚洲色图| 五婷婷六月合| 色哟哟www| 婷婷丁香五月天综合激情| 就去色色五月丁香婷婷久久久| AV在线收看| 久久99最新| 日韩在线aaa| 狠狠狠狠狠狠| 大香蕉福利导航| 九九九这里只有精品| 五月婷婷丁香深深爱| 欧美综合丁香网| 97啪啪| 色五月在线观看| 婷婷五月成人| 亚洲婷婷综合视频| 精品乱码视频| 天天爱天天操| 性爱激情五月| 人人爱干人人爱草| 99色在线观看| 99自拍视频在线| 丁香六月婷婷激情| jiujiu无码五区| 婷婷中文无码| 狠狠色综合网站久久久久| 日韩五月婷婷| 久久在线人妻| 成人短视频在线| 激情五月天情色| 99精品视频免费观看,| 草五月| 亚洲综合五月天婷婷| 成人色图情色成人网 www.5b5b5bcom 五月天 | 五月天五月色婷婷综合| 五月丁香花开综合网| 丁香婷婷91在线观看视频| 成人在线视频网| 午夜激情久久| 狠狠干五码| 丁香婷婷久久 | 99热亚洲| 午夜69成人做爰视频| 色狠狠色综合久久久绯色aⅴ影视| 99re久热| 婷婷五月中文在线| 人人草人人舔| 国产av一区二区三区| 99热天堂| 337p午夜影院| 色五月亚洲| 开心五月婷婷五月| 9色在线| 久9热视频在线观看| 婷婷丁香五月六月激情| A1片久久久| 亚洲欧美综合7777色亭亭| 五月婷婷色影院| 色噜噜狠狠色综无码久久合欧美 | 97色在线观看视频| 超碰伊人碰婷婷五月| 久久这里面只有精品视频| 丁香六月婷婷姐网| 99视频热99| 就去涩涩丁香五月天| 五月天伊人网| 丁香五月天堂婷婷| 思思热久久婷婷五月天| 色综合激情| 婷婷综合| 激情久久丁香| 九九干视频| 99精品视频在线观看| 99热欧美精品| 综合XX网| 色站9/| 开心五月天激情网站| 五月丁香婷婷啪啪| 青青操avbb| 午夜精品久久久久久久爽| 色婷婷综合久久久久| 嫩草乱码一区三区四区| 无码激情AAAAA片-区区| 外国碰视频网站97| 欧美婷婷五月丁香| 99自拍网| 99热综合色图| 五月婷网| 色婷婷小说网| 丁香五月婷婷影院| 婷婷深爱五月天| www.久久99热地址发布| 久色五月婷婷综合| 婷婷六月丁香五月| 丁香五月瑟瑟| Va另类视频| 男女啪啪做爰高潮无遮挡| 久久这里只有精彩| 亚洲成av人影院| 狠狠草综合网| 97爱艹婷婷开心丁香激情综合| 永久免费一区二区三区| 婷婷天天综合| 99视频在线| 色黑鬼导航| 中字幕视频在线永久在线观看免费 | 日都一级A片| 九九99精品视频| 99A级片| 五月丁香久久| 99免费视频精品| 777精品久无码人妻蜜桃| 涩综合在线 | 无码激情AAAAA片-区区| 五月丁香手机在线| AA片在线观看视频在线播放| 天天做天天爰天天爽天天无遮挡| 91久久久久久久久18| 天天操夜夜爽天天操| 99在线免费视频| 九九色精品| 午夜不卡久久精品无码免费| 深爱网深爱综合网| 色婷婷最新域名| 婷婷四色五月| 欧美熟女乱又伦| 狠狠综合色网| 六月丁香啪啪啪| 欧美婷婷五月天综合| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 狠狠搞综合色| 亚洲深喉aV| www激情| 久久伦乱| 国产精品涩涩涩视频网站| 天天摸天天爽| 丁香五月婷婷五月基地| 婷婷爱综合| 色五月综合| 天天干狠狠艹| 大香蕉五月丁香| 亚洲深喉AV| 夜色综合网| 激情五月天开心网丁香无码| 强辱丰满人妻HD中文字幕| 久久99视频| 婷婷大香焦| 久热9| 亚洲色综合性| 婷婷色亚洲| 97操男人的天堂| 五月婷婷五月| 日韩啊啊啊| 日本五月婷婷久久久六月丁香| 久久99国产综合精品免费| 五月婷婷丁香五月婷婷| 九九精品re免费视频| 狠狠五月激情丁香六月| 婷婷在线视频| 99热99思午夜精品| 国产成人精品亚洲线观看| 97韩国久久电影院| 婷婷五月天堂网| www久久久久久| 嫩草AV久久伊人妇女超级A| 婷婷五月丁香综合人妻| 91九色中文| 最新无毒无码AV| 97自拍视频在线| 欧美激情综合五月色丁香| 91人人网| 色色综合五月| 嫩草AV久久伊人妇女超级A| 丁香六月无码播放| 日韩成人五月天| 久久精品99久久久久久| 欧美日韩成人在线| 1024操逼视频| \\五月天婷婷激情| www.激情| 99.N在线视频| 五月天婷婷无码| 五月丁香啪啪啪| 婷婷久久网| 播五月丁香三月婷婷| 激情视频91| 五月色婷婷夜色| 五月天婷婷综合| 五月丁香六月激情视频| 婷婷五月大香蕉| 亚洲成人丁香花| 久久精品人妻| 日本天天操| 天天草天天日| 婷婷5月开心6月| 亚洲色9| 六月丁香大香蕉| 97碰在线免费观看| www狠狠爱com| 97超级碰人人| 韩国中文字幕91| 中国女人做爰A片| www.婷婷五月天| 久久婷五月天| 超碰激情网| 久久WW| 天天爽天天| 久久99热这里只有精品| 亚洲五月丁香综合网| 日韩AV一区二区三区| www.婷婷| 99热精品在这里| 婷婷操逼| www.婷婷| 亚洲激情综合| 五月丁香六月婷综合成人综合 | ..真实国产乱子伦毛片| 五月丁香婷婷在线| 久久99精品久久久久久噜噜| 丁香五月婷婷激情视频播放| 天堂综合久| 七月丁香婷婷 色色| 91色综合网| 啪啪婷婷五月天激情| 天天摸天天舔天天爽| 天天干天天曰天天射| 九九亚洲天堂| 大香蕉色婷婷伊人在线| 婷婷午夜| 婷婷五月天综合网| 色婷网| 99热色精品| 国产肥白大熟妇BBBB视频| 色爱亚洲| 婷婷婷婷婷婷婷婷| 婷婷五月天狠狠色| www99热| 天天成人综合视频| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 婷婷五月丁香香蕉| 日日噜狠狠色综合久久| 婷婷五月色| 99riAV国产精品视频| 伊人超碰在线| 啪啪东京热| 婷婷狠狠操| 激情婷婷色色| 婷婷 久综合| 色色网站免费在线视频| 97香蕉久久超级碰碰高清版 | 婷婷五月综合中文字幕| 亚洲亚洲人成综合网络| 激情五月婷| 激情五月天婷婷丁香| 天天射美女| 五月色综合| 中文字幕 中文字幕明步| 激情五月丁香婷婷| 精品一二三区久久AAA片| 99久久综合网| 国产精产国品一二三在观看| 亚洲操操| 91操黄| 婷婷娌伦网| 大香蕉啪啪网| 五月丁香在线精品| 情久久综合五月天| 久久伦乱| 丁香六月婷| 午夜]香婷婷深深爱| 亚洲精级| 97色在线观看视频| 久这里只有精品99| 俺去也在线视频| 26uuu另类亚洲欧美日本一| 九九热这里精品| 日韩十国产极品久久| 伊人干练久| 色色色色网| 五夜婷婷| 色爱综合网| 色婷婷yy久| 丁香五月中文字幕| 都市激情五月婷婷综合| 99惹| 婷婷五月综合亚洲| 天天做夜夜爽| 99热最新国内| 五月婷婷综合久久| 五月丁六月香av| 五月亭亭网成人在线视频| 色色色综合| 婷婷五月天AV| 人人操人人添人人摸97| 一起草aV| 美妞av| 人人草人| 久久久99久久| 99视频| 九九热re99re6在线精品| 综合色五月天| 婷婷激情丁五月| 丁香大香蕉| 色色色激情网| 丁香六月婷婷综合激情欧美| 婷婷综合激情| 开心五月天激情网站| 久久综合五月天| 天天日天天舔| 欧美乱码国产一级A片| 丁香激情网| 五月激情网综合| 天天插天天插天天插天天插| h在线看免费版在线看| 色综合综合综合| 亚洲综合久| 精品,99| 婷婷综合五月| 综合玖玖偷拍| 精a品a视a频| 婷婷综合五月天亚洲综合| 日本99在线| 精品日本视频444| 久久久久这里都是精品| 五月丁香在线精品| 九九热中文| #NAME?| caopeng超碰| 激情综合色图| 国产首页在线| 久这里只有精品| 91婷婷搞| 热久久婷婷| 天天干夜夜b| 大香网伊人久久综合| 蜜桃五月天| 夜夜 操无码| 五月天狠狠| 色一色综合| 欧美va精品va老师va| www.亭亭五月天| 国产精品色色| 久热综合| 亚洲无码99| 婷婷五月,综合伊人| 猫咪伊人久久| 日日天天干| 婷婷五月色播天| 五月天丁香啪啪综合| 激情小说五月天中文字幕| 五月激情影视| www,婷婷,com| 五月婷在线观看| 色五月婷婷久久大| 99ri在线观看视频| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 丁香婷婷色情| 婷婷色日本| 色色亚洲| 91久久婷婷| 激情四射网| 久草免费福利视频| 天天搽天天射| 婷婷五月色综合| 亚州综合色| 五月婷婷啪| 91碰免费视频| 色色亚卅| 欧美成人AAA片一区国产精品| 91精产一区三区免费观看| 99热99思午夜精品| 丁香五月欧美| 狠狠色婷婷7777久| 亚洲AV人人操| 婷婷激情人妻| 激情五月丁香六月综合AVXXXX| 无码免费人妻A片AAA毛片西瓜| 先锋资源91| 狠狠色成人影片| 色月丁| 五月婷婷av| 色色色色色色色色色色色色色五月天| 亚洲综合婷婷六月丁香五月| 天天色视频| 免费AAAAA网| 亚洲综合激情五月久久| 综合www色| 26uuu日韩| 亚洲天堂无码| 色深爱五月| 91九色PORNY大屁股| 丁香五月图片| 色色操| 五月丁香亭亭成人电影| 另类图片天天影视在线观看| 久久婷婷大香蕉| 99热精品在这里| 五月丁香六月婷婷久久| 开心五月综合| 丁香六月天婷婷| 夜夜操夜夜操| 激情久久 婷婷| 亚洲天堂大香蕉| 涩 五月 婷婷 狠狠| 专区无日本视频高清8| 综合网啪| 精品99在线观看| 国产精品视频| 五月丁香婷婷综合| 婷婷五月天中文字幕.| 天天高潮夜夜爽| 色色网91| 操操自拍| 丁香六月激情综合| 婷婷九月色| 五月开心婷婷网| 色中色综合| 九九中文字幕九| 人人九色| 91啪啪| 久草热8精品视频在线观看| 久99久在线观看| 五月综合久久| 日韩抽插操逼| 9|人妻人人操| 夜丁香五月婷婷| 五月婷婷丁香综合,亚洲天堂| 美女100%露全身无挡网站| 激情小说五月天| 丁香五月激情六月综合| 国产乱人偷精品人妻A片| 免费AV黄在线播放| 激情综合色| 婷婷香五月综合激情| 国产高清av黄色看片| 东北婷婷五月天| 99热草草| 夜夜骑夜夜撸| 午夜色婷婷| 日本欧美成人片AAAA| 狠色狠色狠色狠色狠色网| AA片在线观看视频在线播放| 丁香色五月婷婷17C| 色情五月婷婷| 欧美天天干五月丁香| 天天干电影| 夜夜夜叫天天天做| 国产亚洲AV人片在线| 天天噜噜| 99热福利| 色色9 9| 久热中文字幕| 亚洲综合新99视频| 99爱在线| 免费观看亚洲AV片| 成人婷婷五月| 亚洲成人av在线播放| 婷婷激情视频| 国产精品五月丁香| WWW色五月| 超碰在线观看9| 一本久久亚洲五月婷婷| 国产成人AV不卡| 99啪啪网| 青青草蜜臀| 伦99热| 国产毛片欧美毛片久久久| 人人综合五月人人婷婷| 亚洲日本韩国| 婷婷99狠狠躁天天躁中| 中美日韩成人在线| 日韩一级淫乱片一区二区三区| 久热这里只有精品6| 99热老网站| 色婷婷另类| 极品人妻XXXXOOOO| 久久九九爽| 五月天,激情四射,婷婷频道| 香蕉久久国产av一区二区| 五月色网| 久操福利| 色欲色香伊人| 97久久香草精品视频| 丁香五月色色婷| 欧美丁香六月激情视频| 20253AV| 色色婷婷丁香| 日韩AV片| 天天做天天爱天天爽综合网| 99re99在线看| 丁香五月天婷婷91| 久久精品99国产精品日本| 丁香成人色情五月天| 丁香五月激情网| 婷婷五月丁香激情| 欧美三日本三级少妇三99| 激情五月天开心网丁香无码| 中文AⅤ大全| 九九激情综合| 99热免费精品| 啪啪啪五月天| 久久久这里都是精品| 这里只有精品96| 五月亭亭直播| 99热色精品| 欧美性爱特黄一级aaaassss|