久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

JVM類加載子系統(tǒng)全解析:從雙親委派到自定義類加載器

JVM類加載子系統(tǒng)全解析:從雙親委派到自定義類加載器 很多Java開發(fā)者寫了好幾年業(yè)務代碼第一次被JVM的類加載子系統(tǒng)“教育”通常是從某個詭異報錯開始的ClassNotFoundException、NoClassDefFoundError或者“同一個類在兩個ClassLoader里長得不一樣”。我第一次真正理解ClassLoader是幫人排查一個明明classpath里什么都有、啟動卻找不到類的線上問題折騰到凌晨才發(fā)現(xiàn)是兩個類加載器各加載了一份類。從那一刻起我意識到類加載子系統(tǒng)不是面試題里的紙面概念而是每個JVM應用都要走一遍的“字節(jié)碼入職流水線”。這篇文章把JVM類加載子系統(tǒng)拆開講透它接收什么、產(chǎn)出什么加載、鏈接、初始化三個階段到底干了什么事三個內(nèi)置類加載器和雙親委派機制為什么這么設(shè)計以及怎么手寫一個自定義類加載器來做加密加載和模擬熱部署。最后我會把ClassNotFoundException和NoClassDefFoundError的區(qū)別、Class.forName與loadClass的差異這些高頻問題一起清一遍適合正在學JVM的開發(fā)者也適合準備面試或者排查運行時類加載問題的人。1. 類加載子系統(tǒng)在整臺JVM里的“工位”輸入、輸出與全程數(shù)據(jù)流1.1 它到底接收什么、產(chǎn)出什么類加載子系統(tǒng)的職責簡單說就是一句話“把class文件里的二進制字節(jié)流變成JVM運行時可以直接使用的Class對象。”它不是執(zhí)行引擎并不知道方法內(nèi)部怎么跑它也不管對象實例怎么創(chuàng)建。它只負責“把一個類從無到有地立起來”。它接收的輸入是類的全限定名比如com.example.demo.UserService和對應的二進制字節(jié)流。這個字節(jié)流不一定來自磁盤上的.class文件也可以是jar包、網(wǎng)絡(luò)傳輸、動態(tài)生成代理類、JSP編譯產(chǎn)物、甚至加密后的class字節(jié)。JVM規(guī)范對“從哪里拿class”沒有硬性要求只要你給它字節(jié)流。它輸出的結(jié)果有兩塊一塊是方法區(qū)HotSpot里對應元空間里的類元數(shù)據(jù)包括字段結(jié)構(gòu)、方法簽名、常量池、方法字節(jié)碼這些另一塊是堆內(nèi)存里的java.lang.Class對象。注意每個被加載的類都會在堆里有一個對應的Class對象它是程序通過反射訪問類元數(shù)據(jù)的入口也是getClass()返回的東西。這兩塊要分清楚類元數(shù)據(jù)可以理解為“檔案”Class對象是“檔案的窗口”。實例對象userService在初始化時創(chuàng)建它的類信息引用指向Class對象Class對象引用指向方法區(qū)里的元數(shù)據(jù)。很多人把Class對象和類元數(shù)據(jù)混在一起一旦后面講到元空間OOM和類卸載就會繞暈。1.2 一個類的完整“入職”時間線把整個過程按時間線排開大概是這樣的代碼里第一次出現(xiàn)new UserService()或者訪問了某個類的靜態(tài)字段/靜態(tài)方法。JVM檢查類是否已經(jīng)被加載。沒加載就交給類加載子系統(tǒng)。類加載子系統(tǒng)通過全限定名獲取二進制字節(jié)流完成“加載”。加載完成后進入“鏈接”驗證字節(jié)碼合法性、給靜態(tài)變量分配默認值、把符號引用替換成直接引用。鏈接完成后進入“初始化”執(zhí)行clinit方法給靜態(tài)變量賦真實值、執(zhí)行靜態(tài)代碼塊。類加載完成JVM開始真正執(zhí)行new字節(jié)碼在堆上創(chuàng)建實例。這里有個重要細節(jié)類加載的三個階段——“加載、鏈接、初始化”——是嚴格按順序開始的但鏈接里的“解析”不是必須等到所有驗證和準備都做完才開始。JVM規(guī)范允許解析被延遲甚至在某個類已經(jīng)開始初始化之后才解析它的部分符號引用這是為了支持動態(tài)語言綁定等高級場景。所以面試里如果被問到“解析一定發(fā)生在初始化之前嗎”答案是不一定。還有一個容易被忽略的點什么時候會觸發(fā)加載JVM規(guī)范用的是“首次主動使用”而不是“首次出現(xiàn)”。寫了一百處new UserService()只有第一次執(zhí)行到它時才觸發(fā)加載和初始化。這也是后面講“被動引用”的底層邏輯。2. 加載與鏈接之間的細節(jié)驗證、準備、解析為什么容易被忽略很多人把“加載”和“類加載”混為一談其實“加載”只是整個流程里最前置的一步。加載階段做的事情是通過全限定名獲取二進制字節(jié)流、把字節(jié)流轉(zhuǎn)換成方法區(qū)數(shù)據(jù)結(jié)構(gòu)、在堆里生成Class對象。真正決定一個類“能不能被安全使用”的是接下來的鏈接階段。鏈接包含三個子步驟驗證、準備、解析。這三個步驟不像加載那樣有炫酷的ClassLoader參與所以經(jīng)常被跳過但線上很多詭異的類加載報錯恰恰是這三個環(huán)節(jié)出的問題。2.1 驗證階段在攔什么驗證的目標就一句話防止惡意或不完整的字節(jié)碼破壞JVM運行時。字節(jié)碼不是只能由javac生成任何人都可以手工構(gòu)造。所以JVM必須驗證字節(jié)碼的每一個細節(jié)。規(guī)范要求的驗證包括四類文件格式驗證、元數(shù)據(jù)驗證、字節(jié)碼驗證、符號引用驗證。文件格式驗證檢查魔數(shù)是不是0xCAFEBABE、主次版本號是否在JVM支持的范圍內(nèi)元數(shù)據(jù)驗證檢查這個類是否有父類、是否繼承了不該繼承的final類、抽象方法是否有實現(xiàn)字節(jié)碼驗證對方法體的指令流做數(shù)據(jù)流分析確保操作數(shù)棧的類型不會出問題符號引用驗證發(fā)生在解析階段確認類確實能訪問到引用的符號。給你一個直觀的例子如果你用javap -c看編譯后的class會發(fā)現(xiàn)方法里大量的invokevirtual、getstatic指令后面跟著常量池索引。如果手工篡改字節(jié)碼把一個本該加載字符串的位置改成加載一個對象引用類型就對不上字節(jié)碼驗證階段直接失敗拋出VerifyError。這個錯誤我見過不少大多發(fā)生在字節(jié)碼增強框架比如那些AOP代理工具版本不兼容時。排查建議看到j(luò)avalang.VerifyError先檢查依賴里做字節(jié)碼增強的庫和JDK版本是否匹配不要一上來就懷疑業(yè)務代碼。2.2 準備階段給靜態(tài)變量發(fā)的“默認工資”準備階段是為靜態(tài)變量分配內(nèi)存并設(shè)置默認值的階段。重點這里設(shè)置的是默認值不是代碼里寫的初值。舉個例子public class Person { static int age 30; static final String name Tom; }在準備階段age的值是0不是30。name因為是編譯期常量static final且值在編譯期確定會直接被賦成“Tom”它不進clinit方法里賦值這是準備階段唯一的例外。age 30這個動作會被javac收集到clinit方法里等初始化階段執(zhí)行。這個過程理解透了遇到“靜態(tài)字段的值好端端變成0/null”的詭異問題就能快速定位大概率類還沒走到初始化階段或者初始化由于異常被中斷了。之前我排查過一個案例一個工具類里有個靜態(tài)Map運行時一直是null后來發(fā)現(xiàn)是另一個線程先觸發(fā)了類初始化但靜態(tài)代碼塊里拋了異常導致clinit失敗之后所有線程拿到的都是“半初始化”的狀態(tài)。2.3 解析符號引用到直接引用別小看這張“地圖”解析階段做的事是把常量池里的符號引用替換為直接引用。符號引用是什么可以理解為一串“字面地址”比如類名com/example/Service、字段描述符java/lang/String、方法名sayHelloJVM看到這些符號還不能直接干活必須找到它們對應的真實內(nèi)存地址或運行時數(shù)據(jù)結(jié)構(gòu)才能執(zhí)行指令。直接引用在HotSpot里通常是指向方法區(qū)里相關(guān)數(shù)據(jù)的指針、字段偏移量或者句柄。之所以叫“直接”是因為JVM拿到它之后不需要再做任何查表換算直接用就行。解析最常發(fā)生在哪個指令上invokevirtual。JVM在執(zhí)行invokevirtual時面對的是一個接口方法或虛方法需要根據(jù)實際對象類型做動態(tài)分派所以解析過程還會引入方法表查找。這也是為什么動態(tài)代理會產(chǎn)生額外的性能成本——每個代理方法調(diào)用都要走方法查找與解析。有一個實戰(zhàn)細節(jié)如果一個類在鏈接階段解析失敗錯誤記錄下來后續(xù)訪問同類引用會直接拋NoClassDefFoundError或IllegalAccessError。所以要分辨“類文件找不到”和“類文件存在但解析不了”后者往往更隱蔽因為會拿著一個完整的類路徑去排查結(jié)果發(fā)現(xiàn)那個類在包里好好的。3. 初始化階段真正執(zhí)行static邏輯的時刻加載、鏈接都完成之后類還處于“圖紙階段”——變量都是默認值靜態(tài)字段沒有真正賦初始值。初始化階段執(zhí)行clinit方法才把靜態(tài)初始化塊和靜態(tài)變量賦初值這些代碼真正跑一遍。clinit是類初始化方法不是構(gòu)造函數(shù)。它由javac生成收集所有靜態(tài)變量賦值動作和靜態(tài)代碼塊按它們在源碼里出現(xiàn)的順序合并而成。注意實例構(gòu)造器是init類初始化是clinit兩者完全不一樣。3.1 觸發(fā)初始化的六種主動引用到底哪些情況會觸發(fā)類初始化JVM規(guī)范列得很明確歸納成六類new一個類的實例創(chuàng)建對象是直接訪問一個類的“實體”必須初始化。訪問類的靜態(tài)字段getstatic或給靜態(tài)字段賦值putstatic如果該字段不是編譯期常量。編譯期常量的值在編譯后直接寫進使用方代碼里根本不需要訪問定義類。調(diào)用類的靜態(tài)方法invokestatic。對類進行反射調(diào)用比如Class.forName(com.example.User)默認會執(zhí)行初始化注意Class.forName(name, initialize, loader)有一個參數(shù)控制是否初始化默認initializetrue。初始化類時如果它的父類還沒初始化先觸發(fā)父類初始化。這里注意父類先于子類初始化。程序入口類也就是包含main方法的那個類JVM啟動時會先初始化它。直接看到這里可能覺得很簡單但考察點是“被動引用”。比如通過子類引用父類的靜態(tài)字段只會觸發(fā)父類的初始化子類不初始化。看這段class Parent { static int value 42; static { System.out.println(Parent init); } } class Child extends Parent { static { System.out.println(Child init); } } public static void main(String[] args) { System.out.println(Child.value); }輸出是“Parent init”和42沒有“Child init”。為什么因為value定義在父類訪問它的字節(jié)碼是getstatic Parent.valueJVM只需要確保Parent已初始化并不會因此去初始化Child。類似的Parent[] arr new Parent[10]創(chuàng)建的是數(shù)組對象初始化一個“數(shù)組類”不會觸發(fā)Parent初始化。這些“看起來會但實際不會”的場景是最容易在面試里翻車的。3.2clinit的三個容易被忽視的坑第一個坑線程安全。JVM保證一個類的clinit方法在多線程環(huán)境下只被執(zhí)行一次。當多個線程同時首次觸發(fā)這個類的初始化時只有一個線程會執(zhí)行clinit其他線程阻塞等待。如果執(zhí)行clinit的線程陷進去了——比如靜態(tài)代碼塊里死循環(huán)、長時間持鎖、發(fā)起網(wǎng)絡(luò)請求——其他所有使用這個類的線程全部卡住表現(xiàn)就是應用“假死”。第二個坑異常中斷。clinit如果拋出異常JVM會給首次捕捉到這個異常的線程拋ExceptionInInitializerError并且把這個類標記為“初始化失敗”。下次其他線程再訪問這個類不會再嘗試初始化而是直接拋NoClassDefFoundError。這個問題非常隱蔽因為日志里只會看到第一次的異常堆棧后面的NoClassDefFoundError很容易誤導人往“類缺失”方向排查。第三個坑父類先初始化但接口不一定。初始化子類之前父類一定先初始化這是強約束。但接口的初始化規(guī)則不一樣接口初始化時并不要求父接口先完成初始化除非子接口在運行中使用到了父接口的static字段。這是因為接口里的靜態(tài)字段一旦被引用就意味著真的需要訪問該接口的成員這時才初始化對應接口。實戰(zhàn)中還有一個小坑靜態(tài)字段初始化順序??催@段public class Order { static { count 10; // 這里count已經(jīng)被賦值但還看不到它的“最終初值” // 因為后面才執(zhí)行 static int count 5; } static int count 5; }靜態(tài)代碼塊里給count 10之后緊接著的static int count 5;還會再覆蓋一次最終結(jié)果永遠是5。所以在靜態(tài)代碼塊里讀靜態(tài)字段前心里要有一張“源碼順序執(zhí)行”的流程圖不然很容易寫出邏輯看似對、結(jié)果全錯的初始化代碼。4. 類加載器的三層模型與雙親委派誰是誰的爸爸上面講的加載、鏈接、初始化屬于“同類的一生”現(xiàn)在換到另一個維度這個類到底是由誰加載進來的。JVM里的類加載器不是只有一個而是一個層級體系。4.1 三個內(nèi)置類加載器的管轄范圍JDK 8與JDK 9差異JVM預置了三個類加載器從頂層到底層啟動類加載器Bootstrap ClassLoader負責加載JDK核心類比如java.lang.String、java.lang.Object、java.util.*。它由C實現(xiàn)不是java.lang.ClassLoader的子類。JDK 8里加載JAVA_HOME/lib下被JVM識別的類JDK 9之后由于模塊化它加載的是java.base等基礎(chǔ)模塊。擴展類加載器JDK 8叫ExtensionJDK 9后叫平臺類加載器PlatformJDK 8里加載JAVA_HOME/lib/ext下的jar包以及被java.ext.dirs指定的目錄。JDK 9以后Java SE標準類庫被極度模塊化平臺類加載器負責加載的是java.sql、java.xml、java.logging這些“非基礎(chǔ)但屬于平臺”的模塊。應用程序類加載器AppClassLoader加載classpath下的用戶類也就是我們平時的com.example這類業(yè)務代碼。它是ClassLoader類的子類在sun.misc.Launcher內(nèi)部創(chuàng)建。JDK 9之后最大的變化就是Extension被替換成Platform。面試和工作中如果看到ExtClassLoader的舊資料要知道那是JDK 8的寫法到了JDK 17還照搬舊概念很容易踩坑。4.2 雙親委派執(zhí)行鏈路與loadClass源碼真相雙親委派機制定義很簡潔當一個類加載器收到類加載請求時它不會自己先去加載而是把這個請求委托給父類加載器。父類加載器再委托給自己的父類加載器直到啟動類加載器。如果父類加載不了子加載器才自己嘗試加載。這里說的“父子關(guān)系”不是繼承關(guān)系而是組合關(guān)系。每個類加載器實例內(nèi)部持有parent字段指向自己的父加載器。看JDK的經(jīng)典實現(xiàn)邏輯JDK 8的AppClassLoader、ExtClassLoader都沿用了這套模板protected Class? loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // 1. 檢查這個類是不是已經(jīng)加載過了 Class? c findLoadedClass(name); if (c null) { try { // 2. 有父加載器先讓父加載器加載 if (parent ! null) { c parent.loadClass(name, false); } else { // 3. 沒有父加載器說明是頂層交給啟動類加載器 c findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // 父加載器都沒找到說明這個類不在父的管轄范圍 } if (c null) { // 4. 父加載不了自己來 c findClass(name); } } if (resolve) { resolveClass(c); } return c; } }注意第1步先查重。findLoadedClass檢查這個類在當前類加載器里是不是已經(jīng)加載過。如果已經(jīng)加載直接返回不會重復加載。這是JVM保證類加載“一次”的重要機制。另外注意loadClass整體是同步的鎖對象是“類加載鎖”。這也是為了并發(fā)安全防止同一個類加載器并發(fā)加載同一個類時出現(xiàn)兩份Class對象。4.3 為什么這么設(shè)計類唯一性、安全沙箱與“爸爸優(yōu)先”雙親委派不是拍腦袋定的它解決三個核心問題。第一個是避免類的重復加載。如果每個類加載器都自己從頭加載java.lang.String你的代碼里可能會出現(xiàn)兩個“String類”并存各自的equals判定都不一樣整個類型系統(tǒng)直接崩潰。第二個是安全。因為每層請求都先向上委托用戶自定義的類加載器根本接觸不到核心類無法用偷換java.lang包的方式包藏惡意代碼。啟動類加載器只會加載信任目錄下的核心類這種“爸爸先試”的路徑天然形成一道安全沙箱。第三個是類唯一性。JVM里判斷兩個類是不是同一個“類”不僅看全限定名是否相同還要看它們是否由同一個類加載器加載。即使同一個class文件被兩個不同的類加載器各加載一次它們也是兩個不同的Class對象。這個原理在后面講類卸載和熱部署時是核心也是無數(shù)框架bug的根源。一個經(jīng)典測試兩個自定義加載器分別加載同一個Hello.class然后用aClass.isInstance(instanceFromB)判斷返回false。不是“長得像”就等于同一個類在JVM眼里加載器不同就是“不同種族”。5. 雙親委派被破壞的典型場景SPI與熱部署雙親委派不是萬能的有些場景必須“逆行”才能工作。最典型的就是Java的SPI機制Service Provider Interface以及熱部署、OSGi這類模塊化容器。5.1 線程上下文類加載器SPI的“借道”先想一個問題數(shù)據(jù)庫驅(qū)動接口定義在java.sql.Driver這個接口由啟動類加載器加載。但驅(qū)動實現(xiàn)類比如某個廠商寫的客戶端Driver是放在classpath里的jar包按雙親委派路徑啟動類加載器根本看不到它AppClassLoader又因為有“爸爸優(yōu)先”的規(guī)則而不會主動去加載。于是DriverManager在加載驅(qū)動時不能靠Class.forName(驅(qū)動類名)這種默認雙親委派的方式因為線程上下文類加載器不在默認委托鏈上它調(diào)用了Thread.currentThread().getContextClassLoader()拿到線程上下文類加載器然后由這個加載器去加載classpath里的數(shù)據(jù)庫驅(qū)動實現(xiàn)類。這個上下文加載器默認是AppClassLoader所以能加載用戶jar里的類。這類場景總結(jié)為核心類庫在頂層加載器里但需要加載底層加載器才可見的實現(xiàn)類。JDK里很多SPI擴展點都用了這個模式比如JNDI、XML解析器、數(shù)據(jù)庫驅(qū)動等。面試時如果被問“哪里打破了雙親委派”SPI 線程上下文類加載器是答案榜第一名。5.2 熱部署/模塊化打破雙親委派的代價熱部署的核心需求是同一個類名在舊版本class被替換后能重新加載一份“新版本”。如果走雙親委派AppClassLoader加載了com.example.Task之后后面改成新代碼findLoadedClass一查發(fā)現(xiàn)已經(jīng)加載過直接返回舊版Class新代碼根本不會生效。所以Tomcat、OSGi這類容器設(shè)計了更復雜的類加載器體系。Tomcat的每個Web應用都有自己的WebAppClassLoader放棄“永遠先給父加載器”的嚴格規(guī)則優(yōu)先加載自身WEB-INF/classes目錄下的類實現(xiàn)應用間的類隔離和熱部署。OSGi更進一步每個Bundle模塊都有獨立的類加載器類可見性由導入/導出包配置控制完全自定義了加載順序。這里的代價很明顯類加載順序不再是線性委托而是變成一張復雜的依賴圖。一旦多個模塊里有同名類就會產(chǎn)生“類沖突”問題——兩個Bundle各自加載出一份同名的類互相強轉(zhuǎn)直接報ClassCastException而且異常信息看起來莫名其妙“A cannot be cast to A”。業(yè)界很多框架的版本沖突問題根源都在這。6. 動手寫一個自定義類加載器從加密class到模擬熱替換雙親委派說得再多不如自己寫一個類加載器。自定義類加載器的常見需求有兩個一是從特殊來源加載字節(jié)碼比如文件加密、網(wǎng)絡(luò)傳輸二是繞過父加載實現(xiàn)“同名類重新加載”來模擬熱部署。6.1 重寫 findClass 而不是 loadClass自定義類加載器最推薦的做法是繼承ClassLoader重寫findClass方法。為什么重寫findClass而不是重寫loadClass因為JDK源碼里的loadClass已經(jīng)實現(xiàn)了完整的雙親委派邏輯先查已加載、再找父加載器、父找不到才調(diào)findClass。我們只需要在“父加載器沒找到”的兜底階段告訴JVM“從哪些自定義位置獲取字節(jié)流”剩下的事JVM幫你處理。如果直接重寫loadClass等于把整條雙親委派鏈親手拆掉一般只有寫容器框架才需要這種操作。標準模板長這樣public class FileClassLoader extends ClassLoader { private final String path; public FileClassLoader(String path) { this.path path; } Override protected Class? findClass(String name) throws ClassNotFoundException { byte[] bytes loadClassData(name); if (bytes null) { throw new ClassNotFoundException(name); } // defineClass 是 ClassLoader 提供的方法把字節(jié)數(shù)組變成 Class 對象 return defineClass(name, bytes, 0, bytes.length); } private byte[] loadClassData(String name) { String fileName path / name.replace(., /) .class; try (InputStream in new FileInputStream(fileName); ByteArrayOutputStream out new ByteArrayOutputStream()) { byte[] buffer new byte[1024]; int len; while ((len in.read(buffer)) ! -1) { out.write(buffer, 0, len); } return out.toByteArray(); } catch (IOException e) { e.printStackTrace(); return null; } } }核心就兩個方法loadClassData負責拿到字節(jié)數(shù)組defineClass負責把字節(jié)數(shù)組轉(zhuǎn)換成Class對象。defineClass是ClassLoader里的一個protected方法不需要自己實現(xiàn)直接調(diào)用即可。6.2 加密字節(jié)碼加載的實戰(zhàn)例子如果class文件被加密過普通ClassLoader讀出來的是一堆亂碼字節(jié)碼驗證直接失敗。解決辦法就是在loadClassData里拿到原始字節(jié)流后、調(diào)用defineClass之前先做一次解密。實際項目中通常用AES或者異或做混淆。簡單起見用一個異或加密示意public class EncryptClassLoader extends ClassLoader { private static final byte KEY 0x5A; private final String classPath; public EncryptClassLoader(String classPath) { this.classPath classPath; } Override protected Class? findClass(String name) throws ClassNotFoundException { byte[] encrypted loadClassData(name); byte[] decrypted new byte[encrypted.length]; for (int i 0; i encrypted.length; i) { decrypted[i] (byte) (encrypted[i] ^ KEY); } return defineClass(name, decrypted, 0, decrypted.length); } }這里的邏輯很簡單加密時對class文件的每個字節(jié)異或一個KEY解密時再異或一次。真實防破解當然不會用這么弱的方式但思路是通用的——在字節(jié)流進入defineClass之前你有充分的自由度對字節(jié)做處理。很多商業(yè)軟件把整個class加密再用native方法在啟動時解密骨架都是這樣。這里提醒一句加密class只能增加逆向門檻不能做到絕對安全。因為JVM最終還是要拿到明文字節(jié)碼只要進程在運行字節(jié)碼就在內(nèi)存里可以被dump。做版權(quán)保護要考慮的是一整套方案別指望一個加密加載器解決所有問題。6.3 同名類“熱替換”的簡易Demo與局限模擬熱部署的最簡單做法不是修改父加載邏輯而是每次創(chuàng)建一個新的類加載器實例去加載同名類。因為JVM判斷“同類”時類加載器也是標準之一。新的類加載器是新對象它的findLoadedClass緩存是空的所以同一個class文件能被再加載一遍。示例邏輯public class HotSwapDemo { public static void main(String[] args) throws Exception { while (true) { FileClassLoader loader new FileClassLoader(./classes); Class? clazz loader.loadClass(demo.Hello); Object instance clazz.newInstance(); clazz.getMethod(say).invoke(instance); Thread.sleep(3000); } } }只要我在./classes/demo/Hello.class里改了內(nèi)容并重新編譯下一輪循環(huán)就會加載出新的Class對象。但這里有個關(guān)鍵局限舊對象還在堆里新的類和舊的對象之間沒有任何血緣關(guān)系。如果嘗試把舊對象強轉(zhuǎn)成新加載的類類型結(jié)果是ClassCastException。真正的熱部署框架要復雜得多需要把對象狀態(tài)遷移、線程上下文切換、資源清理都處理干凈。所以“熱替換”在Demo層面很容易在生產(chǎn)層面極難。如果你只是在本地實驗理解這個概念就夠了如果要上生產(chǎn)系統(tǒng)老老實實用成熟的容器和框架別自己造熱部署輪子。7. 類加載相關(guān)的疑難雜癥與高頻辨析最后把類加載子系統(tǒng)里最容易混淆的幾個問題一次性講透這些也是面試和日常排查中最常遇到的點。7.1 ClassNotFoundException 與 NoClassDefFoundError 到底差在哪這兩個異常名字接近但本質(zhì)完全不同。ClassNotFoundException是一個受檢異常checked exception通常由Class.forName()、ClassLoader.loadClass()這類顯式加載方法拋出表示“你要我加載的類我在指定加載器里找不到”。它發(fā)生在“主動找類”的場景解決思路簡單檢查classpath、檢查類名拼寫、檢查加載器能否看到那個類。NoClassDefFoundError是一個Error發(fā)生在“類已經(jīng)被編譯但運行時加載失敗”或“靜態(tài)初始化失敗”之后。典型場景有兩個第一某個類在編譯期存在運行期卻不在classpath里第二更陰間的是這個類在初始化階段拋異常了JVM標記它為“初始化失敗”后續(xù)再使用它時直接拋NoClassDefFoundError。線上排查時如果只看到NoClassDefFoundError先往兩個方向看底層依賴丟沒丟、該類初始化時有沒有拋過ExceptionInInitializerError。很多時候真正的異常棧發(fā)生在很久之前被別的線程吞了要往回翻日志。7.2 Class.forName 和 ClassLoader.loadClass 的差異Class.forName(com.example.User)和loader.loadClass(com.example.User)最大的差別默認情況下Class.forName會執(zhí)行類的初始化觸發(fā)clinit而ClassLoader.loadClass不會。底層原理是Class.forName有一個參數(shù)boolean initialize默認true。所以經(jīng)典用法是加載數(shù)據(jù)庫驅(qū)動時用Class.forName(某個驅(qū)動類)因為驅(qū)動的靜態(tài)代碼塊里做了注冊動作而Spring的ClassUtils.forName、以及一些延遲加載場景會刻意用ClassLoader.loadClass或指定initializefalse就是為了“只加載類不執(zhí)行靜態(tài)邏輯”。這個差異在動態(tài)生成類、延遲初始化、以及判斷“加載體只要Class對象不要副作用”的場景里非常關(guān)鍵。比如做字節(jié)碼增強時如果增強類的靜態(tài)塊有耗時邏輯用了Class.forName會把啟動時間拖慢一大截而loadClass就不會。7.3 類何時能被卸載元空間OOM的反思很多人以為類加載進來就永遠留在內(nèi)存里其實不是。類可以被卸載但有嚴格條件只有當加載這個類的類加載器本身被回收且該類沒有實例、Class對象沒有外部引用時這個類才能被JVM回收。內(nèi)置類加載器AppClassLoader、PlatformClassLoader等通常生命周期和應用一樣長它們加載的類基本不會卸載。會頻繁產(chǎn)生“可卸載類”的場景幾乎都是自定義類加載器的場景每次熱部署新建一個類加載器、大量使用動態(tài)代理生成新類、頻繁用反射框架做字節(jié)碼生成、JSP熱編譯新class等。如果這類操作失控元空間Metaspace會持續(xù)增長最終觸發(fā)java.lang.OutOfMemoryError: Metaspace。排查這類問題的核心就是回答一個問題除了JVM內(nèi)置加載器還有誰在源源不斷地創(chuàng)建類加載器或加載新類常見元兇包括濫用Class.forName創(chuàng)建大量臨時類、緩存的動態(tài)代理類沒有釋放、每次請求都新建一個ClassLoader、腳本引擎反復編譯同一個腳本。我排查過的一個案例某個接口被調(diào)用一次就創(chuàng)建一個動態(tài)代理Class代理類數(shù)量線性增長重啟前元空間漲到幾個G。這類問題光調(diào)-XX:MaxMetaspaceSize只能治標根本解法是讓Class生成可控、復用緩存、及時釋放類加載器引用。這幾年和類加載子系統(tǒng)打過不少交道最大的體會是它不像GC、并發(fā)那些機制一樣每天都能感知到但一旦出問題往往都是“最講道理卻最難看到全景”的類型。寫業(yè)務代碼時確實很少直接操作ClassLoader可只要你在做中間件、插件化、熱部署、字節(jié)碼增強、或者排查線上詭異類沖突這張“字節(jié)碼入職流水線”的完整地圖就是最趁手的工具。建議你按這篇文章的內(nèi)容自己寫一個自定義類加載器跑一遍加密加載和同名類加載的Demo再動手驗證一下子類引用父類靜態(tài)字段不初始化子類的輸出順序。做完這些類加載子系統(tǒng)在你這里就不再是面試提綱而是真正能指揮調(diào)試的心智模型。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久久婷| 亚洲欧美视| 日少妇亚洲版| 精品国产人成在线| 天天射天天色成人| 操逼视频亚洲| 在线天堂999| 久久色网| 天堂资源欧美| 操逼国产免费| 久久人体一区二区| 1024香蕉视频| 99999精品| 嗯嗯嗯嗯啊啊啊好紧好大| 国产h片在线观看视频| 日韩无码黄色片| 天天操人人操骚逼网站| 乱伦日本色图AⅤ| www超碰| 亚洲性猛| 99热综合| 久久久999| 99热18| 大但人体久久久久| 国产一级αv免费看片| 久肏视频字幕| 亚洲图片偷拍视频区| 国产精彩女在线观看视频| 91九色丨风韵犹存| 中文字幕久久精品一区| 婷婷激情综合网| 国产97亚洲| 少妇69中文| 精品人妻免费观看| 国产av热热色| 怡红院怡春院| 欧美操人| 艹比视频国产精品| 被男人吃奶很爽的毛片| 情色五月天网| 国产男女无套97| 欧美色五月| 蜜桃精品视频一区二区三区| 亚洲av噜噜噜噜噜噜| 粘花网06av视频| 东京热激情视频一二三区| 男女性感激情网站| 亚洲美女色图| 欧美综合骚| 熟妇女伦乱视频| 丝袜美腿射精91| 九九热免费国产视频婷婷伊人五月| 天天干人人看综合| 91色婷婷综合久久中文字幕二区| 加勒比av网| 久操99| 欧洲色| 青娱乐国产精品| 强奸抽插av| 亚洲色交| 无码人妻一区二区三区色欲aⅴ| 亚洲深夜福利| 国产风韵犹存熟妇三区| 国偷自 一区二区| 国产精品不卡一区二区三区| 中文字幕78| 久久不卡一区二区| 免费网色网站| 78久久久| 把腿张开老子CAO烂你| 亚洲大色堂| 射丝袜大香蕉| 久久色人体| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 色悠久| 91热热色| 韩国三级一线观看久| 久久香蕉国产线看观看亚洲女人 | 人人操人人摸人 | 国产精品点击进入在线影院高清| 欧美成熟性爱精品| 国精精品无码一二三区水多多| 操www| 伊人麻豆传媒| 超碰在线欧美性爱激情| 香蕉欧美| 亚洲国产日韩欧美熟妇在线| 七久久久| 精品少妇后入一区二区三区四区人妻巨乳 | 欧美一级特黄淫片在线观看| 内射老妇BBWX0C0CK| 日本高清视频xxxx| 最近的最新的中文字幕视频| 91丨国产丨白浆| 国产女性无套 免费观看| 在线综合色| 肉嘟嘟www视频在线观看高清| 狠狠爱夜夜| 精品人妻免费观看| 东北女人被操| 婷婷美人网| 老司机老司机午夜影院| 欧美亚洲综合色| 欧美一二在线| 99操逼| 天天干天天干天天干| www熟女乱伦com| 蜜臀久久99精品久久久久久婷婷| 97资源亚洲| 欧美91精彩| 高清无码久操视频| 99精品在线播放| 偷拍盗拍亚洲色图图片| 天天日天天舔东京热| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 国产精品久久久久久久黄无码| 亚洲色图A| 亚洲无线码欧洲精品区别| 成人片在线播放| 性色国产东北露脸精品视频| 91色欧美| 91熟女在线| 久久国产乱子伦精品免费女人| 中文字幕视频2区| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 超碰97在线 欧美 国产| 国产精品亚洲一区二区三区四区| 色官网色综合| 日韩,欧美,中文在线| 欧美亚洲综合高清在线| 99国产精品| 婷婷久月| 好舒服视频| 麻豆性爱视频在线播放| 久久久啊啊| 亚卅熟女乱色| 欧美性爱三区二区| 啊啊啊不要好疼视频| 欧美日韩国产高清在线一二三区 | 国产精品视频91久久| 亚洲日韩人妻中文字幕一区| 操逼操逼逼操操逼91 | 欧 美 自 拍 偷 拍| 淫荡熟女乱伦网| 99久久久久久久久| 欧美日综合| 牛牛操视频逼| 亚洲综合影院| 大香蕉久操| 中文字幕亚洲在线一区| 91爱网| 欧美韩国你懂得在线| 伊人成人情色综合| 伊人 俄罗斯 a v| 人妻在线视频| 久久久久中出| 老熟妇一区二区三区啪啪| 大香蕉色欲AV| 老熟妇91| 91被操| 91久久久亚洲| 激情文学网伊人| 收看日本人日bb| 欧美天天干| 麻豆天天躁天天揉揉AV| 国产成久久综合片| 欧美另类精品xxxx| 99日韩| 九热超碰| 中文字幕十五区| 鲁鲁色综合网| 国产伦精品一区二区三区在线观| 97久操| 97亚洲综合影院| 久久av一级av少妇av高潮| 自偷自拍的亚洲视频| 2026国产精品视频| 精国久久一区二区三区98| 国产乱伦一二三区| 乱伦色图网址是多少| 亚洲官网在线| 操死我了嗯嗯嗯| 日韩天天综合| 久综合国内精品自在自线| 中文字幕诱惑制服人妻丝袜美丝袜美| 亚洲色婷婷| 91五十路| 日日狠狠久久偷偷色综合免费| 啊啊啊免费| 蜜臀精品1区2区| 六月婷激情福利天堂69| 久久丁香| 大香网伊人久久综合网eew| 欧美片第一页| 久久鲁干| 欧美 传媒 麻豆 日韩 偷拍| 亚洲精品黑丝| 国产91精品在线免费| 人人看欧美性爱| 97av在线观看| 免费观看的黄色的网站| 欧美精品91| 亚洲熟女人妻中文字幕一区二区| 婷婷午夜成人色中色| 在线无码操| 和协无码影院| 九九九久久久| 99热超碰| 亚洲精品黑丝| 精品毛片久久久精品毛片| 日韩精品国模| 色五月综合| 丁香7月婷婷| 翔田千里AV无码秘 三区| 操我无码| 91亚洲影院综合| 国产熟女乱论| 久久久久久久久久久久黄色| 97天天弄| 偷拍精品一区二区三区| 美国黄片aaa| 劲爆欧美人妖三区91| 久久人人爽爽人人爽人人片αV| 九九九九九九视频| 偷拍2020| 日本一区99| 男人成人黄色视频在线观看免费下载| 97精品视频| 日韩免费在线视频观看| 精产国品一区二三产品| 20cm女自慰在线日韩欧美| 日韩性爱高清免费视频| 亚洲天天精品| 国产 日韩 另类 视频一区爱| 97天天操天天干| 午夜小电影在线插入淫高潮| 又大又长又爽| 97碰碰色| 七久久久| 综合 亚洲 欧美| 五月丁香社区婷婷日韩欧美精品影院| 欧美第一页性| 老熟女乱伦片| 欧美人妻精品| 2024年最新色情网站在线观看| 91干熟女| 五月天人妻综合| 久久成人国产| 天堂av最新电影网| 久久国产AⅤ| 东北黄色电影| 操碰97| 天天躁日日躁xxxxx| 丝袜内射| 欧美一区二区福利在线| 亚洲精品蜜桃久久久久久久| 人人摸人人摸人人干| 天天看特黄的免费网站| 五月天丁香婷婷综合网站| 欧美色图私拍91| 亚洲AV秘无码一区..| 97超碰久| 国产Av超碰| 日本亚欧爱爱| 亚洲性猛| 少妇人妻在线| 欧美日韩国产精品久久色婷婷| 影视综合无码少妇| 日本高清电影欧美色图| 9丨亚洲一区二区在线| 秋霞午夜视频一区二区| 婷婷91| 好吊色青靑草| 91网亚洲| 在线性黄高清免费视频| 一本大道久| 色一情一乱一乱一区91Av| 男人天堂欧美| 91AV天堂| 六月丁香网| 黄色成人网久久久久久| 中字一区| 中文字幕精品丝袜| 亚洲成人av电影在线| 人人操人人大香蕉| 夜嗨影院| 欧美日韩第一页| AV中文字幕剧情1区2区3| 欧美极品少妇| 伊人网av| 国产精品香蕉热久久新品| 天天看天天综合成人网| 免费视频无码| 亚洲 中文 女同| 精品人妻二区三区| 97超色| 夜夜爽妓女| 影音先锋国产精品| 亚洲国产一级中文综合久久天堂在线免费观看 | 思思热在线视频免费| 啊啊啊com| 日韩精品在线观看观看| 日韩 欧美 国产 麻豆| 天天拍天| 人妻天天爽| 99re这里只有精品中心播放| 97在线精品观看视频| 97无码视频在线播放| 91精品人妻五十路| 日本女厕偷拍| 999在线电影香蕉| 欧美性爱第一页久久| 人人摸人人干| 2023天天操夜夜操| 老熟女熟妇| 老司机深夜18禁污污网站| 在线人妻熟女一区二区三区四区五区| 涩综合导航| 大香蕉乱伦视频网| 女生久久网| 亚洲人妻熟妇三十三区| 男插女青青影院| 欧美色图在线视频少妇| 殴美性色a级欧美| 欧美Ⅴ性爱| 日日骚av| 久久久久久中文版| 性欧美另类高清| 日韩色| 亚洲精品九九九九九九| 色爱综合网欧美| 思思热免费视频观看| 人妻少妇精品一区二区三区| 九九亚洲精品| 一级A片女人高潮叫床| 亚洲欧洲日产国产综合网| 秋霞一级视频在线观看免费| 超碰吊日色| 九九99久久| 亚洲成人福利电影免费| 中文字幕美女91| 亚洲熟女av中文字幕| 色五月婷婷网| 夜夜操狠狠操| 五月天激情网图片| 秋霞久久亚洲精品成人| 亚洲图片激情综合另类| 久久区| 麻豆色99999| 任我爽在线视频免费观看| 97视频620| 色婷婷综合久久久久中文一区二区| 日本久久天堂| 日韩亚洲中文字幕在线| 亚洲91网| 9色国产精品一区粉嫩| 久久午夜神马| 亚洲日韩国产精品| 国产精品老师| 亚州男人天堂| 国产乱子伦久久精品综合一区二区三| 操死我了嗯嗯嗯| 欧美久久婷婷| 天天日天天操VV| 98福利在线视频| 亚洲少妇激情一区二区三区| 99re在线视频这里只有精品| 国产熟女无套内射| 欧亚日韩一区在线| 中文字幕一二三| 深夜国产福利| 国产精品一区av在线| 精品亚洲黄色片 国产精品导航一区二区 | 手机在线观看不卡无码av| av在线播放国产一区| 国产精品网址| 岛国福利在线精品播放| 午夜超爽| 久久透逼视频| 9l视频自拍9l九色成人| 人妻少妇视频在线播放| 美日韩一二三区| 精品夜夜澡人妻无码AV| 国产乱色国产精品免费视| 欧美顶级黄色大片免费| 色噜噜国产在线| 99re8超碰| 欧美乱妇狂野欧美在线视频| 狠狠爱综合网| 一区二区三区欧美激情| 亚洲男人的天堂在线看| 91这里只有精品| 一区二区三区四区免费视频| 少妇三P| 亚洲色婷婷久久久综合日本| 精品久久久久久中文字幕三区| 91精品国产高清久久久久久,亚洲成人 | 亚洲色婷婷综合久久久久中文| 人妻欧美| 久久五月综合| 天美一区在线| av在线一区二区三区| 麻豆精品久久久久久久| 精品无人区麻豆乱码1区2区图片| 国产精品欧美日韩久久| 欧天美中出| 欧美性爱无码一区二区三区| 亚洲永久AV无码精品秋霞| 精品黄色电影| 久久九九一区二区三区成人| 丝袜视频网国产90| 久久三| 蜜臀久久99精品久久久| 超碰79人人乐| 亚洲精品白丝| 夜色AV无码手机在线影院| 蜜臀色乳| 久热热| 99综合网| 亚州一区二区| 久久亚洲熟妇在线视频| 高清成年美女黄网站免费大全| 亚洲AV无码久久精品蜜桃小说| 国产精品国产自产高清AV | 97欧美| 亚洲欧美校园另类春色| 久热99999| 久热久| 国产精品高潮久久久无码| 久久久99久9| 91欧美网| 色 婷97| 欧美顶级黄色大片免费| 熟女熟妇一区二区三区视频| 丁香婷婷色五月| 亚洲 综合 第一页| 久久久久久AⅤ无码免费肉站 | 99啪| 秋霞成人做爱| 欧美色91| 手机在线观看不卡无码av| 97爱欧美| 日韩欧美国产高清视频| 久久久精品中文字幕麻豆| 久久久久久久伊人精品| 亚洲黄色| 国产精品97超碰| 天综合中文| WWW啪啪的com| 亚洲精品99999| 超碰97在线中文| 伊人色综合超碰| www.久久久久| 高清无码在线播放网站| 91成人亚洲色图| 亚洲欧美九九九| 色婷婷丁香五月| 亚洲精品第一| 最新三级网址| 青青草日韩免费观看高清在线| 丰满人妻av一区二区三区| 搡老熟女免费视频| 全球成人中文在线| 欧美亚洲清纯| 欧美系列在线一区二区| 大香蕉一级黄色片久久| 限制级中的三级片中的黑粗大屌屌日人妻熟女| 麻豆天天躁天天揉揉AV| 亚洲一区二区三区播放在线| 99久久免费看精品国产一区| 999久久久精品国产| 色噜噜精品一区二区三| av天堂电影网| 中文日韩欧美熟| 狠狠干狠狠色| 夜夜爽33333| 曰韩av中文字幕专区| 无码动漫av中文字幕| 另类图片综合| 富女玩鸭子一级毛片| 另类在线| 亚洲人妻在线一区| 天堂中文资源在线bt| 奇米狠999| 日本成人A片网站| 无码久久国产| 欧美Aⅴ| 精品国产乱码| 无码黑人精品一区二区三区三| 亚洲三区视频| 欧美一区二区三区另类精品| 黄色激情电影在线观看| jizzjizz欧美| 99九九精品| 国产精品分类在线观看| 51久久夜色精品国产麻豆| 国产精品伦理| 91精品人| 日本一级特级毛片视频| 亚洲黑丝在线| 日日夜夜摸| 午夜小电影在线插入淫高潮 | 欧洲精品一级二级精品综合视频综合 | 超碰久热| 又黄又爽在线观看视频| 色月天AV导航| 亚洲色图第一页| 欧亚性爱啪啪| 久久婷婷五月天| 嗯啊不要在线观看嗯啊| 亚洲性网| 密臀在线一区尤物| 国内亚洲精彩视频在线| 天天躁狠狠躁av| 色图四区| 女人双腿搬开让男人桶| 一区,二区,三区视频| 大逼色网站| 亚洲色婷婷久久91| 五月丁香啪啪啪| 91精品婷婷国产综合久久| 久久激情视频| 中文字幕丰满人妻日本| 美女91网址 | 99精品在线观看| 色五月婷婷在线| 久操av在线| 91视频精品| 亚洲图片偷拍视频区| 99爱久久视频频| 欧美性爱一区二区三区四区| 丰满搜索结果 -第18页- 久久高清无码| 厕所偷拍在线| 蜜臀久久99精品久久久久久酒店 | 乱伦一二三| 日韩亚洲美州欧洲综三区一品在线| 亚洲情色一区二区三区| 超碰成人公开| 亚洲不卡三级手机播放| 精品黄色电影| 色五月丁香五月| 极品AV网站在线观看| 韩国轻伦国内自拍一区| 欧美一区二区| 五月天婷婷欧美三区| 蜜臀va69| 国产精品探花在线| 精吧天堂| 色婷婷影视| 精品一国2| 欧美日韩*字幕一区| 精品亚洲俞拍视频一区| 日韩av情韩国爱禁区av一区二区| 色乱二区| 日韩兔费看黄片| 黄色高清久久无码依人| 1024人妻熟女一区二区三区| 色噜噜日韩精品| 激情五月天婷婷| 五十路熟女人妻一区二区在线观看 | 国产精品精品系列在线观看| 欧中日成人免费影视| jazzjazz国产精品麻豆| 国产亚洲精品美女| 99热精品在线| 国产综合在线视频网站| 俺去啦自拍| 亚洲18禁| 无码天天操| 欧美激情内射| 亚州色站 日韩电影| 日韩性爱再线视频| 东京热毛片177b2viP| 91丝袜美腿片| 观看视频图片一区二区三区| 国产超碰AV在线精品| 精品美女少妇一区二区| 熟女中出视频| 天天做日日做| 久操97| 亚洲天堂人人妻| 欧美大香蕉卡久久| 国产 三级自拍| 98人妻精品一区二区色欲| 91熟女少妇| 日韩一级二级| 欧美精品999| 亚洲最大的综合性av| 激情五月综合开心五月| 永久免费发布性爱网| 天天影视色香欲综合网小说| 欧美视频在线视频免费va| 丁香六月激情| 天天色综合天天操| 51一区二区三区| 日韩大香蕉AV影片| 美日韩一二三区| surenchaopeng| 亚洲淫乱骚妇AV| 久久久久人妻| 国产亚洲精品玖玖玖在线观看| 亚洲精品国产精品成人| 视频国产欧美在线播放| 狠狠综合网| 午夜啊啊| 粉嫩av一区二区三区四季| 色偷综合| 男女啊啊啊| 亚洲在线欧美| 国产最火爆久久国产网站网站| 97国产精品视频| 国产亚洲福利第一页丝袜| 九九久久玖玖| 2017大香蕉国产精品久久| 日韩在线AB| 精品一久久久| 免费人人搞97| 激情婷婷丁香网| 精品久久97| 国产丝袜视频| 亚州精人品大香蕉| 丁香六月啪啪| 九九国产| 欧美日本成人一区二区| 乱伦a片视频| av日韩国产一区二区| 久久久久久久久久va| 国产日产精品久久快鸭的功能介绍| 精品蜜乳AV免费观看| 午夜男女爽爽爽影院视频| 亚洲毛片一级带毛片基地| 在线国产探花| 青青草色情网站视频| 人妻少妇色综合| 欧美双插| 国产情侣自拍在线播放| www鬼畜国产男人的天堂| 人人爽夜夜操| 97 色综合| 亚洲性爱免费电影| 日韩精品高清资源在线| 成人精品水蜜桃久久久久久久| 婷婷成人五月天| 97色色国产视频| 国产精品对白自产拍| 日韩性爱长视频免费| 爱av免费| 国产精品在线网站| 国产精品日日摸夜夜添骚逼| 中国探花熟女| 男人的天堂在线| 中文操逼字幕| 国产天美欧美| 日本操逼无码| 人妻第一页| 国产无马视频| 熟妇高潮一区二| 91视频伊人| 美女露胸露屁股| 激情文学小说一区二区 | 亚洲性爱高潮影院| 亚洲狠狠入| 中文字幕免费观看| 久久久人妻| www.色婷婷.com| 天美传媒精品久久视频| 日本视频一区二区三区| 狠狠2050在线观看| 欧美激情久操网| 激情丁香五月婷婷| 五月丁香激情四射| 伊人久久大香蕉线AV五月天| 波多野结衣之双飞调教在线播放 | 自拍啪啪视频| 五月丁香综合啪啪| 嗯嗯啊啊操我| 精品一区二区三区最新| 日本一区二区三区午夜观看| 操我啊啊啊啊啊| 波多野结衣之双飞调教在线播放| 手机不卡视频不卡在线一二三区 | 久久性爱精品一区| 激情文学 亚洲图片| a男人的天堂久久一级A毛片| 欧美在线啊啊啊 | 国产91福利小视频在线观看| 99精品伊人| 园内精品自拍视频在线播放| 大茄子熟女AV导航| 宗合情欲网| 亚欧日韩成人| 92久久| 国产天美欧美| 少妇啪啪自拍| 日韩综合97p| 白丝AV网站| 嫖老熟女A片一二三区| 超碰在线人人射| 日韩欧美蜜桃精品久久中文字幕久久| 97亚洲性爱| 3p国产欧美99热| WWW操逼| 少妇99| 亚州色站 日韩电影| 五月婷色| 成人性爱AV在线免费观看| 综合性视频99| 色色婷婷五月| 国产黄色视频久久| 中国91AV| 久久超碰大香蕉| 欧美日韩第一页| 三及片网站| 插老姨肥穴| 久草五月| 日韩免费看在线黄色片| 亚洲综合第一页| 好吊色综合| 91亚洲人| 欧美色图 色综合图| 欧美色图片色哟哟| 热热色色综合| 嫩草影院永久在线制服丝袜| 四季AV一区二区凹凸精品小说| 亚洲一二三四区机械| 92人人操人人| 久草免费在线一区二区| 一区操逼日比视频| 1禁看欧美黄片免费看| 亚洲自拍天堂| 日韩无码a片| 亚洲综合另类小说色区亚洲成av人片在www| 精品久久久久久久| 午夜福利1区2区3区| 2019精品国产无码成人| 欧美性暴力猛交XXXX | julia ann久久| 精品国产污一区二区三区| 97 九色| 97操B| 天天澡天天爽日日AV| 国产无码三级视频在线观看| 五月丁香综合激情| 天欧美在线| 色九九九综合| 亚洲欧洲无码一区夜| 亚洲自拍青操视频| 亚洲中文字幕在线视频一区二区| 97超碰欧美精品| 放黄片放3级黄片没穿衣服| 婷婷久久五月综合激情| 精品国产人成在线| 婷婷五月丁香五月| 屌妞视频久久久久久久久久久久| 国内精品久9| 一区二区三区麻豆| 亚洲高清自拍| 日韩女模中文造逼| 韩国三级三级BD在线| 91热热色| 大粗鳼巴久久久久| 国产suv精品一区二区四| 亚射在线| 精品人妻久久久| 日日噜噜夜夜狠狠视频无| 亚洲精品亚洲人成在线麻豆| 激情图片伦理国产一区二区日韩| 淫穴高潮色图| 久久久久久69国产一区二区| 99自拍B亚洲| 色偷偷人人玩人人舔人人操人人摸人人爽 | 亚州图片第一页| 欧美另类精品xxxx| 绑缚麻绳人妻寝取完整版| 青青草国产欧美非洲黑人| 99无码视频| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 水澄无码AV| 久热精品在线| 熟女人妻一区二区三区| 伦在线97| 综合操逼| 男人天堂久久精品不卡| 少妇高潮对白在线观看| 国产视频大全| 天堂中文资源在线bt| 91影视亚洲| 久草免费在线一区二区| 曰本道人妻久久久在线不卡色视频| 亚洲色图图片| 免费夜夜爱黄色视频毛片| 久极品在线观看| 男人天堂无码| 国产成年免费大片黄在线观看| а√天堂资源官网在线资源| 色悠久| 99久在线精品99re8| 国产精品久久久久久久电影渣男| 久久久久久久久久久人妻| 啊啊啊爽爽| 青青网三级视频| 欧美激情激情xxxx欧美专区| 久久仑合| 亚洲日韩成人性爱视频| 久草这里只有精品| 日韩懂色网| 欧美一区二区三区日韩| 狠狠操使劲操| 我中文字幕6区| 成人日韩欧美| 国产精品另类| 久久xx| 中文字幕一区二区无码成人| 狠狠图片青青草| 色色婷婷五月| 91社区伊人| 日韩九九九| 日本免费一区二区不卡 | 人妻偷拍一区二区三区| 88在线一区二区三区| 秋霞男人网| 欧美精品第3页| 日本精品无码三级网站| 丁香七月婷婷| 高颜值美女口爆高潮浪叫| 狠狠狠一区二区三区| 性开放中文AV高清无码免费看| 日日不卡av| 久久综合av| 色女99一级片在线观看| 亚洲日韩AV视色| 99成人| 欧美精品日韩久久久九| 人妻欧美| 啊v在线观看视频| 天天天肏屄肏屄肏屄欧美欧美| 操人妻视频| 97超碰总站| 亚洲熟女乱综合一区二区三区| 涩涩五月天| 操逼网免费无码视频| 一个国产在线综合网站| 精品高潮| 噜噜噜亚洲精品| 日韩国语字幕| 2001天天操| 免费综合亚洲中文| 啪啪啪东京| 亚洲性爱免费电影| 久操网址| 亚洲成人性| 911av网站免费观看| 午夜无遮挡男女啪啪视频| 91久久| 亚洲性爱成人| 尤物黄色在线观看网站| 涩涩这里只有精品视频| 伊人久久大香线蕉无码| 欧美综合区| 五月天婷婷影院| 天堂蜜桃无码视频一区二区| 6080yy午夜理论三级一区二区三区无码| 无遮挡猛进视频免费无限观看| 日韩激情毛片一级久久久| 啪啪啪亚欧美视频| 亚洲日韩av专区无码| 亚洲欧美日韩二区视频| 国产女同视频在线播放| 91操人| 九九热九九热| 日日骚中文字幕| 亚洲999综合| 欧美日韩亚洲少妇寂寞影院正在播放| 性爱视频无打码在线观看| 国产无马在线| www.99中文字幕| 摸奶性爱视频网站在线免费播放| 国产精品成人AV片免费看网站| 免费视频一二三区| 国产高清吃奶免费视频网站| 国产女人成人精品视频| 99国产在线绯色一区| 久日综合网| 美女被啪到深处抽搐视频| www欧美性爱| 国产一| 午夜精品99久久久久传媒| 九九久久久久久爱| 日韩BBN| 国产毛片久久久久久久| 神马视频久久久久久| 久久有码视频| 伊人久操| 天天激色| 精品性爱无码在线播放| 青青草在线成人视频| 久久亚洲一区女同性恋中文字幕| 亚洲av影院在线观看| 亚洲乱色视频一区、二区在线| 日日爽熟女| jizzjizz欧美| 97超级欧美| www.色吧5.com| 精品人妻一区二区免费蜜桃| 精品人妻一二三| 蜜桃视频精品一区二区三区| 久久久久久久| 一区二区三区四区免费视频| 久久极品一区二区| 久久精品店| 青草青草久热| 97欧美资源| 狠狠干,狠狠操| 国产91 丝袜在线播放00-百度| 91碰碰| 欧美综色欧| www成人啪啪18秘 免费| 国产精品色| 13小男生GAY自慰脱裤子| 99re95| 日本三级一区二区 在线| 亚洲熟女乱综合一区二区三区| 无码最新| 亚洲自拍欧美色综合| 人人妻人人狠人人| 久超碰这里只有精品| www.伪伪| 9九九国产| 偷拍欧美激情| 中文字幕一区二区三区高清| 91白虎| 天天夜夜久久| 黄片不用下载在线观看| 蜜臀久久99'精品久久久| www.99视频| 免费观看成人www精品视频| 熟妇高潮一区二| 中字乱伦AV| 国产高清无码一区三区二区| 欧美青青草视频| 国产精品视频精品一二| 九九九九久久久| 国产精品成人AV片免费看网站| 激情丁香五月婷婷| 97资源视频| 蜜臀久久99精品久久久老,,| 久久99深爱久久99精品| 日韩免费看黄片| 丰满人妻区一区二区三| 少妇色综合| 人人插人人搞人人操| 911av网站免费观看| 97日韩| 熟妇女伦乱视频视频| 美美91成人国产精品欧美精品久久久久久久| 国产 亚洲 一二三四| 国产日韩美女小穴视频网站不卡| 亚洲视频一二区| 91人妻丝袜无码| 天天色综亚洲91污| 黄色电影在线播放综合网站 | 在线视频一区二区传媒| 啊啊啊啊一区| 日韩成人免费电影| 精品人妻一区| 不卡av在线中文字幕| 欧美乱伦专区| 国产9区| 亚洲国产丝袜熟女av| 夜色91| 78精品| 97欧美资源| 大香蕉中文网| 日韩情色一区二区| 91麻豆天美国产欧美高潮| 久久久久久久9最新免费视频观看| 91美女视频在线免费观看| 天天摸夜夜摸| 中文字幕加勒比海高清无码免费视频| 日产狠狠干| 久久一二三四五六七八九区区区 | 精品国产少妇高潮视频| 中文字幕日产av人| 久操在97| 不卡六六在线91| 玖玖综合视频| 久久久999国产| 亚洲国产精品成人久久蜜臀| 国产家庭乱伦表演| 国产精点久久久成人| a天堂视频| 九九色逼| 午夜情侣自拍网站| 高潮内射在线| 狠狠2050在线观看| 国产国产亚洲一二三久久| 999综合网| 日本精品网站在线中文| 日美免费黄片| 精品久久99| 加勒比aⅴ| 999国产精品999久久久久久| 99久久久| 亚洲熟伦熟妇AV无码春色| 交换娇妻呻吟声不停中文字幕| 欧美激情中文字幕另类小说| 麻豆国产尤物AV| 日韩精品怡红院| 加勒比综合网| 天天干人妇| 久久AV无码1区2区3区| 国产中文字幕在线观看| 日本成a人v网站在线观看| 伊人久久大香大香线蕉中文| 91夜色chaopeng| 日韩97| 中国一区二区亚洲人妻| 操逼日韩无码| 爱爱动态试试看6 0秒| 91黄射| 天天做日日做天天欢。| 黄色不卡视频| 男人天堂网站| 久久精品99| 试看福利| 国产高清精品一区二区三区毛片| caorenqi shipin| 97日亚洲欧美| 国产精品极品美女视频| 97硬碰| 久久久青青草| av资源在线播放天堂| 欧美日韩性感| 男人的天堂 在线一区| 99ri在线视频| 色婷婷A V一二三四区麻豆综合| 欧美一级AAAAAAA| 精品亚州18| 国产精品2020| 欧美色图片91| 又大又大又大又粗爽高潮观看 | 老司机天天操| 欧美性生活内射| 91强热人妻| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 啊啊啊操死我了| 9 9精品一区二区三区| 九久9精品| 亚洲欧美综合色| 超碰成人公开| 亚洲日韩乱码中文无码蜜桃臀网站| www.av在线视频| 伊人伊人LD| 国产综合日韩伦理| 撸撸成人在线视频| 国产精品99久久久www| 亚洲熟女诱惑| 又摸又舔在线观看网站| 成人午夜小视频手机在线看| 亚洲九九视频| 日本人妻一区二区| 狠狠色狠狠色狠狠五月| 91中出在线| 久久a久久| 狼人久草| 国产一区二区在线播放量| 乱子伦一区二区三区国产精品| 日本一区二区成人在线| 精品对白久久不卡| 校园春色中文字幕AV| 久久婷五月| 色欲三区| 另类欧美色| 夜夜青青无码影院| 91狠| 一区二区视频在线播放| 国产强奸无码乱伦| 99超碰碰| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 人妻一区二区三区视频 | 色999人与兽| 超碰碰碰碰| 日韩精品永久在线观看| 国产亚洲色停停久久99精品91| 久热精品色情| 99热这里只有精| 婷婷91| 国产精品久久伊人| 国产精品高清2021在线| 男人天堂2030| 熟女少妇视频| 国产精品久久久亚洲第一牛牛_在线观看 | 亚洲精品电影| 少妇三P| 亚州春色| 久久久偷拍| 国产日韩美女小穴视频网站不卡| 亚洲色图伊人网| 欧美一级欧美三级在线观看| 国语av最新自产拍在线观看| 亚洲AV秘 精品久久老牛影视| 午夜精品久久久久久久久久久久久| 久久久精品一区二区| 中文字幕片| 日本免费一区二| 五月丁香大香蕉| 成年女人一区| WWW4虎| 日日夜夜国产综合| 久久久天美| 久久9精品| 另类天堂| 欧美十八禁视频| 多毛小伙内射老太婆| 国模吧 一区二区三区| 搡老女人老妇女AAA一VU麻豆| 福利操逼| 国产粉嫩出水在线播放| 狠狠干综合| 久久综合女优| 亚洲一区亚洲天堂| 超碰精品97| 91肉丝| 国产色精品午夜大片| 91超级碰碰| 日本人妻一区二区| 国产精品夜夜夜| 日韩九九九| 中文字幕在线免费观看2| 91香蕉国产尤物视频| 国产亚洲女v在线观看| 丁香五月激情综合| 欧美页片| 久久久久久十| 爱妃国产亚洲视频中文字幕| 欧美自拍偷拍免费观看| 精品婷婷| 精品无码久久久久| 免费国产视频| 一区二区三区视频国产免费| 欧美成人一级免费电影| 久久久久久亚洲精品不卡人乳| 高潮内射在线| 加勒比海成人视频网| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 日韩精品影视| 91亚洲色图| 91精品国产高清久久久久久,亚洲成人| 亚洲最大黄网| 2020中文字幕在线| 欧美日韩国产成人高清| 99久久精品国产高潮| 艳美熟妇先锋一二三区| 好爽要喷了| 午夜理论片在线观看免费| 日本A级视频| 永久电影三级在线观看| 天堂九九九九九九九九九| 91爱啪| 狠狠综合网|