日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

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

JVM類加載子系統(tǒng)全解析:從雙親委派到自定義類加載器 很多Java開發(fā)者寫了好幾年業(yè)務代碼第一次被JVM的類加載子系統(tǒng)“教育”通常是從某個詭異報錯開始的ClassNotFoundException、NoClassDefFoundError或者“同一個類在兩個ClassLoader里長得不一樣”。我第一次真正理解ClassLoader是幫人排查一個明明classpath里什么都有、啟動卻找不到類的線上問題折騰到凌晨才發(fā)現是兩個類加載器各加載了一份類。從那一刻起我意識到類加載子系統(tǒng)不是面試題里的紙面概念而是每個JVM應用都要走一遍的“字節(jié)碼入職流水線”。這篇文章把JVM類加載子系統(tǒng)拆開講透它接收什么、產出什么加載、鏈接、初始化三個階段到底干了什么事三個內置類加載器和雙親委派機制為什么這么設計以及怎么手寫一個自定義類加載器來做加密加載和模擬熱部署。最后我會把ClassNotFoundException和NoClassDefFoundError的區(qū)別、Class.forName與loadClass的差異這些高頻問題一起清一遍適合正在學JVM的開發(fā)者也適合準備面試或者排查運行時類加載問題的人。1. 類加載子系統(tǒng)在整臺JVM里的“工位”輸入、輸出與全程數據流1.1 它到底接收什么、產出什么類加載子系統(tǒng)的職責簡單說就是一句話“把class文件里的二進制字節(jié)流變成JVM運行時可以直接使用的Class對象?!彼皇菆?zhí)行引擎并不知道方法內部怎么跑它也不管對象實例怎么創(chuàng)建。它只負責“把一個類從無到有地立起來”。它接收的輸入是類的全限定名比如com.example.demo.UserService和對應的二進制字節(jié)流。這個字節(jié)流不一定來自磁盤上的.class文件也可以是jar包、網絡傳輸、動態(tài)生成代理類、JSP編譯產物、甚至加密后的class字節(jié)。JVM規(guī)范對“從哪里拿class”沒有硬性要求只要你給它字節(jié)流。它輸出的結果有兩塊一塊是方法區(qū)HotSpot里對應元空間里的類元數據包括字段結構、方法簽名、常量池、方法字節(jié)碼這些另一塊是堆內存里的java.lang.Class對象。注意每個被加載的類都會在堆里有一個對應的Class對象它是程序通過反射訪問類元數據的入口也是getClass()返回的東西。這兩塊要分清楚類元數據可以理解為“檔案”Class對象是“檔案的窗口”。實例對象userService在初始化時創(chuàng)建它的類信息引用指向Class對象Class對象引用指向方法區(qū)里的元數據。很多人把Class對象和類元數據混在一起一旦后面講到元空間OOM和類卸載就會繞暈。1.2 一個類的完整“入職”時間線把整個過程按時間線排開大概是這樣的代碼里第一次出現new UserService()或者訪問了某個類的靜態(tài)字段/靜態(tài)方法。JVM檢查類是否已經被加載。沒加載就交給類加載子系統(tǒng)。類加載子系統(tǒng)通過全限定名獲取二進制字節(jié)流完成“加載”。加載完成后進入“鏈接”驗證字節(jié)碼合法性、給靜態(tài)變量分配默認值、把符號引用替換成直接引用。鏈接完成后進入“初始化”執(zhí)行clinit方法給靜態(tài)變量賦真實值、執(zhí)行靜態(tài)代碼塊。類加載完成JVM開始真正執(zhí)行new字節(jié)碼在堆上創(chuàng)建實例。這里有個重要細節(jié)類加載的三個階段——“加載、鏈接、初始化”——是嚴格按順序開始的但鏈接里的“解析”不是必須等到所有驗證和準備都做完才開始。JVM規(guī)范允許解析被延遲甚至在某個類已經開始初始化之后才解析它的部分符號引用這是為了支持動態(tài)語言綁定等高級場景。所以面試里如果被問到“解析一定發(fā)生在初始化之前嗎”答案是不一定。還有一個容易被忽略的點什么時候會觸發(fā)加載JVM規(guī)范用的是“首次主動使用”而不是“首次出現”。寫了一百處new UserService()只有第一次執(zhí)行到它時才觸發(fā)加載和初始化。這也是后面講“被動引用”的底層邏輯。2. 加載與鏈接之間的細節(jié)驗證、準備、解析為什么容易被忽略很多人把“加載”和“類加載”混為一談其實“加載”只是整個流程里最前置的一步。加載階段做的事情是通過全限定名獲取二進制字節(jié)流、把字節(jié)流轉換成方法區(qū)數據結構、在堆里生成Class對象。真正決定一個類“能不能被安全使用”的是接下來的鏈接階段。鏈接包含三個子步驟驗證、準備、解析。這三個步驟不像加載那樣有炫酷的ClassLoader參與所以經常被跳過但線上很多詭異的類加載報錯恰恰是這三個環(huán)節(jié)出的問題。2.1 驗證階段在攔什么驗證的目標就一句話防止惡意或不完整的字節(jié)碼破壞JVM運行時。字節(jié)碼不是只能由javac生成任何人都可以手工構造。所以JVM必須驗證字節(jié)碼的每一個細節(jié)。規(guī)范要求的驗證包括四類文件格式驗證、元數據驗證、字節(jié)碼驗證、符號引用驗證。文件格式驗證檢查魔數是不是0xCAFEBABE、主次版本號是否在JVM支持的范圍內元數據驗證檢查這個類是否有父類、是否繼承了不該繼承的final類、抽象方法是否有實現字節(jié)碼驗證對方法體的指令流做數據流分析確保操作數棧的類型不會出問題符號引用驗證發(fā)生在解析階段確認類確實能訪問到引用的符號。給你一個直觀的例子如果你用javap -c看編譯后的class會發(fā)現方法里大量的invokevirtual、getstatic指令后面跟著常量池索引。如果手工篡改字節(jié)碼把一個本該加載字符串的位置改成加載一個對象引用類型就對不上字節(jié)碼驗證階段直接失敗拋出VerifyError。這個錯誤我見過不少大多發(fā)生在字節(jié)碼增強框架比如那些AOP代理工具版本不兼容時。排查建議看到javalang.VerifyError先檢查依賴里做字節(jié)碼增強的庫和JDK版本是否匹配不要一上來就懷疑業(yè)務代碼。2.2 準備階段給靜態(tài)變量發(fā)的“默認工資”準備階段是為靜態(tài)變量分配內存并設置默認值的階段。重點這里設置的是默認值不是代碼里寫的初值。舉個例子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ā)現是另一個線程先觸發(fā)了類初始化但靜態(tài)代碼塊里拋了異常導致clinit失敗之后所有線程拿到的都是“半初始化”的狀態(tài)。2.3 解析符號引用到直接引用別小看這張“地圖”解析階段做的事是把常量池里的符號引用替換為直接引用。符號引用是什么可以理解為一串“字面地址”比如類名com/example/Service、字段描述符java/lang/String、方法名sayHelloJVM看到這些符號還不能直接干活必須找到它們對應的真實內存地址或運行時數據結構才能執(zhí)行指令。直接引用在HotSpot里通常是指向方法區(qū)里相關數據的指針、字段偏移量或者句柄。之所以叫“直接”是因為JVM拿到它之后不需要再做任何查表換算直接用就行。解析最常發(fā)生在哪個指令上invokevirtual。JVM在執(zhí)行invokevirtual時面對的是一個接口方法或虛方法需要根據實際對象類型做動態(tài)分派所以解析過程還會引入方法表查找。這也是為什么動態(tài)代理會產生額外的性能成本——每個代理方法調用都要走方法查找與解析。有一個實戰(zhàn)細節(jié)如果一個類在鏈接階段解析失敗錯誤記錄下來后續(xù)訪問同類引用會直接拋NoClassDefFoundError或IllegalAccessError。所以要分辨“類文件找不到”和“類文件存在但解析不了”后者往往更隱蔽因為會拿著一個完整的類路徑去排查結果發(fā)現那個類在包里好好的。3. 初始化階段真正執(zhí)行static邏輯的時刻加載、鏈接都完成之后類還處于“圖紙階段”——變量都是默認值靜態(tài)字段沒有真正賦初始值。初始化階段執(zhí)行clinit方法才把靜態(tài)初始化塊和靜態(tài)變量賦初值這些代碼真正跑一遍。clinit是類初始化方法不是構造函數。它由javac生成收集所有靜態(tài)變量賦值動作和靜態(tài)代碼塊按它們在源碼里出現的順序合并而成。注意實例構造器是init類初始化是clinit兩者完全不一樣。3.1 觸發(fā)初始化的六種主動引用到底哪些情況會觸發(fā)類初始化JVM規(guī)范列得很明確歸納成六類new一個類的實例創(chuàng)建對象是直接訪問一個類的“實體”必須初始化。訪問類的靜態(tài)字段getstatic或給靜態(tài)字段賦值putstatic如果該字段不是編譯期常量。編譯期常量的值在編譯后直接寫進使用方代碼里根本不需要訪問定義類。調用類的靜態(tài)方法invokestatic。對類進行反射調用比如Class.forName(com.example.User)默認會執(zhí)行初始化注意Class.forName(name, initialize, loader)有一個參數控制是否初始化默認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)建的是數組對象初始化一個“數組類”不會觸發(fā)Parent初始化。這些“看起來會但實際不會”的場景是最容易在面試里翻車的。3.2clinit的三個容易被忽視的坑第一個坑線程安全。JVM保證一個類的clinit方法在多線程環(huán)境下只被執(zhí)行一次。當多個線程同時首次觸發(fā)這個類的初始化時只有一個線程會執(zhí)行clinit其他線程阻塞等待。如果執(zhí)行clinit的線程陷進去了——比如靜態(tài)代碼塊里死循環(huán)、長時間持鎖、發(fā)起網絡請求——其他所有使用這個類的線程全部卡住表現就是應用“假死”。第二個坑異常中斷。clinit如果拋出異常JVM會給首次捕捉到這個異常的線程拋ExceptionInInitializerError并且把這個類標記為“初始化失敗”。下次其他線程再訪問這個類不會再嘗試初始化而是直接拋NoClassDefFoundError。這個問題非常隱蔽因為日志里只會看到第一次的異常堆棧后面的NoClassDefFoundError很容易誤導人往“類缺失”方向排查。第三個坑父類先初始化但接口不一定。初始化子類之前父類一定先初始化這是強約束。但接口的初始化規(guī)則不一樣接口初始化時并不要求父接口先完成初始化除非子接口在運行中使用到了父接口的static字段。這是因為接口里的靜態(tài)字段一旦被引用就意味著真的需要訪問該接口的成員這時才初始化對應接口。實戰(zhàn)中還有一個小坑靜態(tài)字段初始化順序??催@段public class Order { static { count 10; // 這里count已經被賦值但還看不到它的“最終初值” // 因為后面才執(zhí)行 static int count 5; } static int count 5; }靜態(tài)代碼塊里給count 10之后緊接著的static int count 5;還會再覆蓋一次最終結果永遠是5。所以在靜態(tài)代碼塊里讀靜態(tài)字段前心里要有一張“源碼順序執(zhí)行”的流程圖不然很容易寫出邏輯看似對、結果全錯的初始化代碼。4. 類加載器的三層模型與雙親委派誰是誰的爸爸上面講的加載、鏈接、初始化屬于“同類的一生”現在換到另一個維度這個類到底是由誰加載進來的。JVM里的類加載器不是只有一個而是一個層級體系。4.1 三個內置類加載器的管轄范圍JDK 8與JDK 9差異JVM預置了三個類加載器從頂層到底層啟動類加載器Bootstrap ClassLoader負責加載JDK核心類比如java.lang.String、java.lang.Object、java.util.*。它由C實現不是java.lang.ClassLoader的子類。JDK 8里加載JAVA_HOME/lib下被JVM識別的類JDK 9之后由于模塊化它加載的是java.base等基礎模塊。擴展類加載器JDK 8叫ExtensionJDK 9后叫平臺類加載器PlatformJDK 8里加載JAVA_HOME/lib/ext下的jar包以及被java.ext.dirs指定的目錄。JDK 9以后Java SE標準類庫被極度模塊化平臺類加載器負責加載的是java.sql、java.xml、java.logging這些“非基礎但屬于平臺”的模塊。應用程序類加載器AppClassLoader加載classpath下的用戶類也就是我們平時的com.example這類業(yè)務代碼。它是ClassLoader類的子類在sun.misc.Launcher內部創(chuàng)建。JDK 9之后最大的變化就是Extension被替換成Platform。面試和工作中如果看到ExtClassLoader的舊資料要知道那是JDK 8的寫法到了JDK 17還照搬舊概念很容易踩坑。4.2 雙親委派執(zhí)行鏈路與loadClass源碼真相雙親委派機制定義很簡潔當一個類加載器收到類加載請求時它不會自己先去加載而是把這個請求委托給父類加載器。父類加載器再委托給自己的父類加載器直到啟動類加載器。如果父類加載不了子加載器才自己嘗試加載。這里說的“父子關系”不是繼承關系而是組合關系。每個類加載器實例內部持有parent字段指向自己的父加載器??碕DK的經典實現邏輯JDK 8的AppClassLoader、ExtClassLoader都沿用了這套模板protected Class? loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // 1. 檢查這個類是不是已經加載過了 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檢查這個類在當前類加載器里是不是已經加載過。如果已經加載直接返回不會重復加載。這是JVM保證類加載“一次”的重要機制。另外注意loadClass整體是同步的鎖對象是“類加載鎖”。這也是為了并發(fā)安全防止同一個類加載器并發(fā)加載同一個類時出現兩份Class對象。4.3 為什么這么設計類唯一性、安全沙箱與“爸爸優(yōu)先”雙親委派不是拍腦袋定的它解決三個核心問題。第一個是避免類的重復加載。如果每個類加載器都自己從頭加載java.lang.String你的代碼里可能會出現兩個“String類”并存各自的equals判定都不一樣整個類型系統(tǒng)直接崩潰。第二個是安全。因為每層請求都先向上委托用戶自定義的類加載器根本接觸不到核心類無法用偷換java.lang包的方式包藏惡意代碼。啟動類加載器只會加載信任目錄下的核心類這種“爸爸先試”的路徑天然形成一道安全沙箱。第三個是類唯一性。JVM里判斷兩個類是不是同一個“類”不僅看全限定名是否相同還要看它們是否由同一個類加載器加載。即使同一個class文件被兩個不同的類加載器各加載一次它們也是兩個不同的Class對象。這個原理在后面講類卸載和熱部署時是核心也是無數框架bug的根源。一個經典測試兩個自定義加載器分別加載同一個Hello.class然后用aClass.isInstance(instanceFromB)判斷返回false。不是“長得像”就等于同一個類在JVM眼里加載器不同就是“不同種族”。5. 雙親委派被破壞的典型場景SPI與熱部署雙親委派不是萬能的有些場景必須“逆行”才能工作。最典型的就是Java的SPI機制Service Provider Interface以及熱部署、OSGi這類模塊化容器。5.1 線程上下文類加載器SPI的“借道”先想一個問題數據庫驅動接口定義在java.sql.Driver這個接口由啟動類加載器加載。但驅動實現類比如某個廠商寫的客戶端Driver是放在classpath里的jar包按雙親委派路徑啟動類加載器根本看不到它AppClassLoader又因為有“爸爸優(yōu)先”的規(guī)則而不會主動去加載。于是DriverManager在加載驅動時不能靠Class.forName(驅動類名)這種默認雙親委派的方式因為線程上下文類加載器不在默認委托鏈上它調用了Thread.currentThread().getContextClassLoader()拿到線程上下文類加載器然后由這個加載器去加載classpath里的數據庫驅動實現類。這個上下文加載器默認是AppClassLoader所以能加載用戶jar里的類。這類場景總結為核心類庫在頂層加載器里但需要加載底層加載器才可見的實現類。JDK里很多SPI擴展點都用了這個模式比如JNDI、XML解析器、數據庫驅動等。面試時如果被問“哪里打破了雙親委派”SPI 線程上下文類加載器是答案榜第一名。5.2 熱部署/模塊化打破雙親委派的代價熱部署的核心需求是同一個類名在舊版本class被替換后能重新加載一份“新版本”。如果走雙親委派AppClassLoader加載了com.example.Task之后后面改成新代碼findLoadedClass一查發(fā)現已經加載過直接返回舊版Class新代碼根本不會生效。所以Tomcat、OSGi這類容器設計了更復雜的類加載器體系。Tomcat的每個Web應用都有自己的WebAppClassLoader放棄“永遠先給父加載器”的嚴格規(guī)則優(yōu)先加載自身WEB-INF/classes目錄下的類實現應用間的類隔離和熱部署。OSGi更進一步每個Bundle模塊都有獨立的類加載器類可見性由導入/導出包配置控制完全自定義了加載順序。這里的代價很明顯類加載順序不再是線性委托而是變成一張復雜的依賴圖。一旦多個模塊里有同名類就會產生“類沖突”問題——兩個Bundle各自加載出一份同名的類互相強轉直接報ClassCastException而且異常信息看起來莫名其妙“A cannot be cast to A”。業(yè)界很多框架的版本沖突問題根源都在這。6. 動手寫一個自定義類加載器從加密class到模擬熱替換雙親委派說得再多不如自己寫一個類加載器。自定義類加載器的常見需求有兩個一是從特殊來源加載字節(jié)碼比如文件加密、網絡傳輸二是繞過父加載實現“同名類重新加載”來模擬熱部署。6.1 重寫 findClass 而不是 loadClass自定義類加載器最推薦的做法是繼承ClassLoader重寫findClass方法。為什么重寫findClass而不是重寫loadClass因為JDK源碼里的loadClass已經實現了完整的雙親委派邏輯先查已加載、再找父加載器、父找不到才調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é)數組變成 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é)數組defineClass負責把字節(jié)數組轉換成Class對象。defineClass是ClassLoader里的一個protected方法不需要自己實現直接調用即可。6.2 加密字節(jié)碼加載的實戰(zhàn)例子如果class文件被加密過普通ClassLoader讀出來的是一堆亂碼字節(jié)碼驗證直接失敗。解決辦法就是在loadClassData里拿到原始字節(jié)流后、調用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é)碼就在內存里可以被dump。做版權保護要考慮的是一整套方案別指望一個加密加載器解決所有問題。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里改了內容并重新編譯下一輪循環(huán)就會加載出新的Class對象。但這里有個關鍵局限舊對象還在堆里新的類和舊的對象之間沒有任何血緣關系。如果嘗試把舊對象強轉成新加載的類類型結果是ClassCastException。真正的熱部署框架要復雜得多需要把對象狀態(tài)遷移、線程上下文切換、資源清理都處理干凈。所以“熱替換”在Demo層面很容易在生產層面極難。如果你只是在本地實驗理解這個概念就夠了如果要上生產系統(tǒng)老老實實用成熟的容器和框架別自己造熱部署輪子。7. 類加載相關的疑難雜癥與高頻辨析最后把類加載子系統(tǒng)里最容易混淆的幾個問題一次性講透這些也是面試和日常排查中最常遇到的點。7.1 ClassNotFoundException 與 NoClassDefFoundError 到底差在哪這兩個異常名字接近但本質完全不同。ClassNotFoundException是一個受檢異常checked exception通常由Class.forName()、ClassLoader.loadClass()這類顯式加載方法拋出表示“你要我加載的類我在指定加載器里找不到”。它發(fā)生在“主動找類”的場景解決思路簡單檢查classpath、檢查類名拼寫、檢查加載器能否看到那個類。NoClassDefFoundError是一個Error發(fā)生在“類已經被編譯但運行時加載失敗”或“靜態(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有一個參數boolean initialize默認true。所以經典用法是加載數據庫驅動時用Class.forName(某個驅動類)因為驅動的靜態(tài)代碼塊里做了注冊動作而Spring的ClassUtils.forName、以及一些延遲加載場景會刻意用ClassLoader.loadClass或指定initializefalse就是為了“只加載類不執(zhí)行靜態(tài)邏輯”。這個差異在動態(tài)生成類、延遲初始化、以及判斷“加載體只要Class對象不要副作用”的場景里非常關鍵。比如做字節(jié)碼增強時如果增強類的靜態(tài)塊有耗時邏輯用了Class.forName會把啟動時間拖慢一大截而loadClass就不會。7.3 類何時能被卸載元空間OOM的反思很多人以為類加載進來就永遠留在內存里其實不是。類可以被卸載但有嚴格條件只有當加載這個類的類加載器本身被回收且該類沒有實例、Class對象沒有外部引用時這個類才能被JVM回收。內置類加載器AppClassLoader、PlatformClassLoader等通常生命周期和應用一樣長它們加載的類基本不會卸載。會頻繁產生“可卸載類”的場景幾乎都是自定義類加載器的場景每次熱部署新建一個類加載器、大量使用動態(tài)代理生成新類、頻繁用反射框架做字節(jié)碼生成、JSP熱編譯新class等。如果這類操作失控元空間Metaspace會持續(xù)增長最終觸發(fā)java.lang.OutOfMemoryError: Metaspace。排查這類問題的核心就是回答一個問題除了JVM內置加載器還有誰在源源不斷地創(chuàng)建類加載器或加載新類常見元兇包括濫用Class.forName創(chuàng)建大量臨時類、緩存的動態(tài)代理類沒有釋放、每次請求都新建一個ClassLoader、腳本引擎反復編譯同一個腳本。我排查過的一個案例某個接口被調用一次就創(chuàng)建一個動態(tài)代理Class代理類數量線性增長重啟前元空間漲到幾個G。這類問題光調-XX:MaxMetaspaceSize只能治標根本解法是讓Class生成可控、復用緩存、及時釋放類加載器引用。這幾年和類加載子系統(tǒng)打過不少交道最大的體會是它不像GC、并發(fā)那些機制一樣每天都能感知到但一旦出問題往往都是“最講道理卻最難看到全景”的類型。寫業(yè)務代碼時確實很少直接操作ClassLoader可只要你在做中間件、插件化、熱部署、字節(jié)碼增強、或者排查線上詭異類沖突這張“字節(jié)碼入職流水線”的完整地圖就是最趁手的工具。建議你按這篇文章的內容自己寫一個自定義類加載器跑一遍加密加載和同名類加載的Demo再動手驗證一下子類引用父類靜態(tài)字段不初始化子類的輸出順序。做完這些類加載子系統(tǒng)在你這里就不再是面試提綱而是真正能指揮調試的心智模型。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
yiren97| 啊啊啊要高潮了| 精品久久久久久久久久久久| 日本熟妇精品九九| 香港澳门日本三级网站| 少妇同性| 99久久久无码精品国产人| 亚洲精品99| 亚洲日韩东京热一区| 9999久久久| 成人无码在线超碰网| 亚州国产精品乱| 先锋音影AV| 中文字幕三四五区| 熟女久久久| www.yeyecao| 日韩pv中文| 99久久9| 尤物网址| 日韩丨制服丨中文|在线| 13小男生GAY自慰脱裤子| 思思99热| 美国aaaaa一级黄片| 五月天激情小说网| 69一区二区三区| 五月丁香激情啪啪| 欧美成97爱| 亚洲国产一级精品毛一级精品看免费视频| 久久久九精品| 三级片网站在线播放| 欧美第一页| 色婷婷六月丁香七月婷婷| 亚洲不卡av在线| 91精品国产一区三一| 亚洲色久| 色欲天天综合久久久无码网中文| 91成人在线| 中文字幕一二三| 97国产色综合| 亚洲精品国产无码高清| 啊…啊…操我用力操我| 九九九九九精品| 人妻加勒比东京热| 狠狠操官网| 天天综合网1| CCYY草草影院地址入口| 超碰人人干天天射| 国产熟女| 色婷婷狠狠18禁| 日韩图色| 久久综合精品一区二区三区| 亚洲免费成人在线高清无码视频| 青青草好吊| 国产激情综合| 老熟女乱伦片| 日本不卡一区二区三区| 亚洲一区二区三区AV无码| 亚洲在线观看| 欧美色图片91| 性爱乱伦一区| 麻豆久久精品亚洲精品88| 无码99| 在线观看中文字幕| 日韩欧美中文字亚洲慕| 精品视频日日夜夜| 尤物网址| 可以免费看黄片的视频| 亚洲骚男同com| 97干色天堂| 深夜激情无码| 黄色成人网久久久久久| 五月天人妻综合| 无码欧美有限公司| 2024人人操人人摸| 欧美亚洲一级在线观看| 99999国产精品| 丰满人妻一区二区三区四 | www.黄色在线| 极品销魂美女一区二区 | 亚欧美综合网。| 激情AV| 成人一道本免费视频| 粉嫩久久久极品| 亚洲伊人久久精品狠狠在线| 欧美在线干| 夜夜爽夜夜爽| 麻豆熟妇乱妇熟色A片在线看| 中文字幕精品丝袜| 久久女人视频| 久99| 青青久久手机线视频| 亚洲色交| 夜夜操夜夜爽夜夜高潮| 在线无码操| 日本布卡一区二三区| 婷婷三区| 91色碰| 久久婷婷精品| 手机看av网站在线看| 18禁在线视频| 亚洲欧美高清无码| 91精品91久久久中77777| 欧美激情久久久久| 国产青视频| 日本不卡三级网在线播放| 大香蕉丝袜一级片| 日本韩欧美在线播放a| 亚洲一级性爱视频免费看| 大香蕉欧美| 国产九九九九九九| 欧美手机在线综合| 丝袜高跟澳门91视频| 大香蕉99热| 一区中文字幕二区日韩| 91肏屄网| 嗯嗯啊啊用力视频免费| 1204av韩国| 日韩中文字幕av在线播放| 亭亭丁香激情| 好看的91视频| 91亚州欧美| 男人的天堂色偷偷青青草视频婷婷网| 毛片17S| 欧美成人精品一区二区三区| 无码heyzo高清一区| 天天干2019| 97超碰碰碰| 狠狠中文字幕| 久久亚洲人妻| 天天综合麻豆视频| 大香蕉性欧美| 天天澡天天爽日日AV| 三级色影综合网| 蜜臀久久99精品久久久久久| 久久亚洲欧美中文字幕国语 | 五月天亚洲网| 欧美操逼录像国产黄色国产| 免费视频一二三区| 99re热有精品视频国产| 日韩亚洲Av人人夜夜澡人人爽| 黄色av片三级三级三级免费看| 中文字幕一区二区韩| 日韩性爱免费视频在线网站| 99色婷婷| 和协影院中文字幕三区| 精品久久久久成人码免| 欧洲精品一级二级精品综合视频综合 | 五月天开心网| 香蕉久久精品| 欧美草草高清日韩视频| 久久久久久网址| 日韩国产欧美伦理在线| 国产11页| 天天日天天屌天天操| 春色综合免费| 操人人| Blackedraw视频一区二区| 色婷婷导航| 亚洲国产综合久久久性感熟妇| 97天天操天天干| 91劲爆| 亚洲97在线观看| 国产毛片久久久久久久| 五月天激情四射| 97干在线看| 天天操人人操骚逼网站| 超碰色综合| 97精品一区二区视频| 国产美女mm131爽爽爽爽| 日日夜夜干| 双插在线| 亚洲成人贴图| 欧美日韩精品一区二区三区高清| 九九热免费国产视频婷婷伊人| 久9久9精品| 中国熟妇| 在线看免费无码AV天堂的| 日韩国产品视频中文字| 夜夜嗨TV| 在线观看免费视频国产| 亚洲熟妇极品| 亚洲久草AV色图| 欧美精品二区视频在线| 日韩另类色图| 蜜桃臀AV在线| 免费的很黄很污的全部视频| 美女露胸露尿口| 熟妇女伦乱视频视频| 国产美女在线精品免费看| 婷婷操逼| 精品国产乱码久久久久久日本公司| 超碰欧美| 91天天日| 超碰九7| 国产日本久久免费精品| 99热日| 亚洲精品一区二区精品| 欧美亚洲国产自久久| 97se亚洲| 久久五月丁香| 91热热色| 啪啪啪大香蕉| 激情在线青青操| 天堂中文资源在线bt| 黄网站黄视频网站进入口| 啊啊啊无码| 性吧在线视频| 亚洲91网| 中文字幕日产av人| 你懂的在线观看区国产| 日韩精品区二区三区不卡| 干美女人妻| 操我无码| 熟女精品日韩一区二区三区| 日本91白丝| av中亚| 青青欧美在线| a片 xxxx受爽视频| 欧美 中文字幕 一区| 国产精品白丝| 欧美熟女妇同| 在线精品福利免费播放| 亚洲综合校园春色| 欧美99热| 97综合国产| 日本超碰在线国产一区| 91精片| 日日夜夜骚| 国内偷自视频区视频综合| 九九英色视频| 亚洲精品无码久久AV| 一本久久精品中文字| 欧美性爱日韩性爱| 丁香7月婷婷| 99久re热视频精品98| 亚洲熟女人妻中文字幕一区二区| 美骚妇av高清在线| 免费啪啪一级视频| 欧美se综合| 999在线电影香蕉| 天天综合网网欲色| 嗯嗯嗯啊啊啊干死我吧| 狠狠色综合网| 少妇一级无码精品| 91熟女.com| 久久婷综合| 成·人免费午夜在线观看| 夜夜高潮夜夜爽高清视频一 | 高树玛利亚无码流出| 亚洲综合另类小说色区亚洲成av人片在www| 噜噜噜亚洲精品| 久久久久9999| 日韩黄片影院| 亚洲中文字幕熟女少妇一区二区| www.狠狠| 国产精品国产自产拍高清AV| 欧美性爱无码一区二区三区| 久久影视二区三区行押| 偷拍亚洲高清图片| a在线观看| 操屄日韩| 免费观看一区| 青青草大香蕉视频| 国产青青美女玩逼视频| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 夫妻四区五区六区| 丁香五月天堂网| 久久久久久久久久久免费精品| 视频在线97| 玖玖人人爱| 黄片aaaaa一区| 加勒比综合88| 久久亚洲一区女同性恋中文字幕| 99蜜桃臀亚洲成人在线观看| 99激情视频| 国产精品爱欲| 翔田千里无码一区| 青娱乐黄色录像| 青青草字幕AV| 日han少妇无码| 天天流夜夜操| 激情四射五月天| 黄骗免费| 大香蕉黄色一级片免费看| 亚洲丝袜诱惑| 老熟妇一区二区三区| 国产精品网站免费| 久久发布国产伦子伦精品| 中文字幕精品资源在线| 国产a级午夜毛片| 操操吧亚洲乱伦视频| 张柏芝国产一区在线观看| 麻豆一区二区三区在线看 | 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 欧美大片天天看| 97视频在线免费看| 素人播放一区| 亚州色图第三区| 亚洲欧洲网站免费观看| 在线精品福利免费播放| 国产福利电影| 色色色日本| 国产精品第一区第一页| 国产在线视频午夜精华在| 亚洲国产97| 天天天干977| 这里都是精品| 日韩射精| yiqicaoav| 综合 亚洲 欧美| 日韩精品一区二区人人人| 青青青草原| 五月天人妻综合| 丝袜美腿91| 久久久久熟女| 蜜汁欧美| 天天综合97| 无遮挡又黄又刺激的视频| 日本影视久久免费| 成人无码在线视频网站| 免费无码婬片AAAA片直播色戒| 91免费看一区二区三区| av在线播放国产一区| 亚洲美女精品| 亚洲天堂人人妻| 日韩中文9| 久久久久久久综合,国产| 日影院久久婷婷夜夜网| 蜜桃臀一区二区三区久久| 欧美色图在线视频少妇| 九九亚洲| 国产又黄又爽又刺激久久久久久| 色伊人91| 九九热免费视频| 欧美老熟另类| 国产午夜无码片在线观看影视| 国产激情av女片自拍| 电家庭影院午夜69久久夜色精品国产69乱| 99福利社| 中文字幕欧美日韩三级| 国产精品久久久久亚洲av| av天堂5| 丁香六月婷婷综合| 国产农村妇女精品一二区| 极品久久久久久久久久久久久久| 黑人综合色| 精品人妻一区二区免费蜜桃视频| 超碰在线人妻中文字幕| 午夜黄色免费在线观看| 天天综合色| 日韩精品99久久久久久中文字幕 | 黄色电影观看久久9| 色综合久久88色综合久久天天| 97啪啪| 五月婷丁香| 少妇人妻精品| 天天综合网在线观看| 岛国激情视频软件| 精品久久視頻在线| 免费国产| 伊人操你| 一区二区偷拍拍视频| 中文字幕人乱码中文字的预防方法 | 青青11操操操操操操操操| 日韩精品电影| 成人久久久| 影音先锋视频在线| 久久天天摸| 热热色国产一二区AV| 啊啊啊在线观看| 视频分类 国内精品| 人妻密肉在线观看| 亚洲图片欧美色图| 日韩性爱播放| 蜜桃狠狠色伊人亚洲综合| 97综合| 精品超碰国产| 久久久久幕乱码| 日韩99999| 无码高清专| 嫩草伊人久久精品| 九九热AV| 亚洲少妇喷视频看| 欧美激情高清性猛交| 国产午夜无码片在线观看影视 | 色色色色日本| 麻豆性爱视频在线播放| 人妻精品免费一二三区| 久久婷婷色综合一区二区三区| 97操综合| 国产成人综合网| 激情情色五月天| 欧美爆操91| 欧美精品成人一区二区在线观看| 东京热男人的天堂网| 91在线一起| www.大香| 97久久国产精品| yaouchengrenav| 97免费在线视频在线观看| 日韩精品一区二区人人人| 岛国黄色大片网站| 大但人体久久久久| www.色婷婷| 日韩九九九| 五月天精品| 熟妇色99| 操九九九九九九| 2020久久免费视频| 熟女一区二区| 国产成人精品必看| 色臀aV| 人人操人人摸人| 超碰免费欧美7| 丁香五月综合| 色逼综合| 欧美国产一区二区三区麻豆传媒 | 亚洲AV秘 精品久久老牛影视| 欧美少妇性乱| 日亚韩精品视频二区三| 久久久青青草| 日本精品88888888| 18禁免费视频| 久久99久久99精品天美传媒棢·纸:.| 日韩亚洲中文有码视频| 偷拍欧美亚洲| 好吊色在线观看| 亚洲AV麻豆Aⅴ无码电影一| 九九英色视频| 丁香六月激情| 91亚洲人| 男人的亚洲天堂| 91日本在线观看| 在线不欧美| 欧美熟女妇同| 国产精品久久久久久久久AV大片| 国产精品乱码久久久| 日韩97视频!在线| 在线无码网站| 蜜臀久久99精品久久久久| 91麻豆天美传媒HD| 亚洲中文一区二区三区视频| 国产高清成人免费视频| 91精品免费| 东亚亚洲无码高清| 女性91网站| 天堂伊人久久| 天天综合~91入口| 岛国大片在线观看网站入口| 春色91| 无码视频一区二区| 天天摸,夜夜摸| 亚洲阿v天堂在线| 精久久久| 加勒比综合九九99视频在线播放| 狠狠操狠狠插| 日本一区二区成人在线| 国产精品直播在线观看直播| 尤物AV免费网站| 国产精品网站免费 | 老熟女乱伦一区| 日本无码1| 综合 亚洲 欧美| 99爱爱| 96精品久久久久中文字幕| 妺妺跟我一起洗澡没忍住| 中国操逼无码| 我想要 啊 啊 啊| 男人天堂网手机版婷婷| 性色乱AV一区二区| 大香蕉久久| 美女午夜福利免费视频| 性夜影院爽黄A爽免费动漫| 人妻丰满熟妇av无码区蜜桃| 97色色国产视频| 久久综合激情| 亚洲欧美日韩夜夜| 温婉少妇玩3p| 青娱乐国产盛宴视频| 午夜啪| 天天噜| 欧美综合1性辶| 久久久久久久久久久久黄色| 啊a一区在线| 国产精品色色| 日本99视频| 尤物一级在线免费观看| 狠日操| 人人操人人操人人人操| 丁香九月婷婷| 中文字幕一区二区视频在线观看| 俞拍久久国应视频| 一本色道综合久久欧美日韩精品| 在线播放欧洲免费av| 欧美体内射精| 亚洲精品国产拍免费91在线| 日韩电影中文字幕| 日本道人妻久久久在线不卡色视频| 天天操人人操骚逼网站| 小草av不卡亚洲二区| 国产九区| 亚洲精品久久一区二区三区蜜桃臀| 天天综合网1| av东京热男人的天堂| 金典av| 在线观看 99热| 中文字幕诱惑制服人妻丝袜美丝袜美 | 日本一道在线播放高清| 色吧5亚洲| 五月情色天| 啊啊啊好多水| 国产强奸乱伦xd| 在线欧美69V免费观看视频| 亚洲av综合色区无码一| 国产一级内射无挡观看| 亚洲av无线观看| 亚洲欧美日韩夜夜| 亚洲日韩一区电影| 色五月69夫妻| 伊人丝袜美腿高跟在线观看高清| 操逼999| 久久后入制服| 激情小说在线视频| 麻豆国产97在线| 国产亚洲女v在线观看| 天天草天天干天天日| 噜噜在线| 亚洲男人的天堂AV| 五十路熟女,国产欧美精品区一区二区三区| 成人草草视频| 欧美十八禁视频| 1769一区二区| 大香蕉视频啪啪啪啪| 国产后入| 嫩草影院性色| 国产av高清版| 日本黄页视频在线观看| 婷婷午夜清品久久久久久久性色视频观| 97干97色| 丝袜美腿制服人妻二区中文字幕 | 一区二区三区日韩欧美 | 强奸乱伦AV网站| 伊人久久婷婷| 10000部十八禁看电影| 欧美小说区视频区| 人人看人人插| 大香蕉伊人久久| 91色爽欧美| 又黄又硬又粗又长国产视频| 国产日韩无码一区二区三区久久区| 岛国艾薇凹凸视频天堂| 99色综合| 亚洲日韩久久精品一区| 97色97干| 伊人久久艹| 人妻少妇三级| 亚洲啪啪综合?v一区综合精品区| 国产精品久久久鸭无码的功能| 欧美亚综合色图| 亚洲天天自拍| 亚洲av淫乱| 狠狠图片青青草| 男女国产精品| 国产在线精品偷| 91 亚洲情侣偷拍 久久| 日韩无码一级黄色av片| 色播丁香| 96一区二区三区| 在线观看岛国有码| 日韩三级在线观看mp4| 天天天做天天天爱天天天爽| 亚洲国产精品成人综合| 中文字幕国产精品1区| 亚洲成人AB| 久草网站免费在线观看| 欧美在线l亚洲| 欧美激情久操网| 一本道综合色图| 九九九九九九精品| 综合欧美日本三级| 日产成人久久| 成人免费福利网站国产| 欧美91网站| 国产在线强奸视频| 欧美色九九九| 伊人操你| 青青草乱入乱欲视频在线观看| 色网站导航大全| 有码免费观看| 97在线观看免费视频| 久久久久久久久成人av解说| 97精品在线| 91成人久久| 亚州高清av| 屁屁影院一区二区三区国产| 亚洲文学偷乱拍啪啪啪啪 | 国桃视频产巨乳精品一区二区在线| 三级日韩一区二区三区| 五月天伊人| 天天夜躁日日躁狠狠2002| 大香蕉伊人网WWWn0n| 超碰美国| 高清不卡视频| 国产亚洲精品无码三区| 欧洲精品人妻| 精品国产肉丝袜在线拍国语 | 乱欲一区二区| 亚洲区小说| 丁香婷婷久久 | 亚洲色久| 夜夜高潮夜夜爽夜夜爱爱一区| 五月婷久久| 国产9熟妇视频网站| www.五月天| AAAA级日本片免费视频| 手机av天堂久久久久| 久久国产逼| 一区二区三区色综合| 欧美丰满少妇xx高潮| 欧美色图在线视频少妇| 国内外色色色色色成人视频| 午夜精品久久一区二区| 人妻酒店出差被中出免费在线播放| 乱伦图一区| 美女网站黄页| 色色色综合| 午夜福利1区2区3区| 精品无码人妻一区二区免费蜜桃| 久热伊人| 国产99精品一区二区三区免费| 黄色成年| 亚洲综合骚逼| 亚洲情色五月天 | 亚洲麻豆av一区二区| 加勒比性爱成人在线| 真实高潮91| 久久九色| 成人八戒网站| 综合伊人激情| 99re免费| 久久在肏| 久久超碰天天| 久久综合av| 天天日日日射| 日韩乱码Av| 日本欧美国内在线| 福利操逼| 日本一区二区亚洲综合| 欧美姓爱综合网| 少妇特黄一区二区三区| 超碰98综合网| 久久久av爱| 欧美天天拍| 婷婷五月成人| 亚洲超碰在线| 静品嫩模一区二区| 亚洲成人美女无吗| 一区二区三区成人高清视频| A片大香蕉在线| 国产精品美女| se..亚洲欧美| 伊人九九九| 色97欧美| 日韩久射综合| 大茄子熟女AV导航| 伊人宅男大香蕉 | 秋霞一区二区三区四区五区六区七区| 亚洲精品色| 中文字幕国产精品1区| 日韩精品99999| 伊人色综合网| 亚州情色j区| 中文字幕一区 二区三四五 区日 日骚 | 久久啊啊| 亚洲综合第一页| 日日夜夜精品视频| site:sinbotex.com| 亚洲日韩精品一区二区| 人妻精品一区二区| 亚洲图片欧美色| 久久精品人妻一区| 蜜臀一区二区三区在线| 成 人 A V免费视频在线观看| 国产又粗又大硬免费色网视频| 免费在线看黄片av| 26uuu成人影片| 日韩激情毛片一级久久久| 欧美性爱18观看| 久久黄色性爱视频| 国精精品无码一二三区水多多| 天堂无码精品国产久| 每日更新AV| 操操碰| 97日本超碰综合| 天堂国产AV| 国产精品久久久999| 五月天欧美色图| JuliaAnnXXX888| 91久久青青草原精品| 欧美综合国产精品久久丁香| 人人操人人操人人操人人操人人操人人人11.CM | 久久久精品一区二区| 伊人嫩草| 97视频在线播放| 欧美高清无码免费视频高清版| 久久久精品中文字幕爱豆| 搡老女人老妇女AAA一VU麻豆| 伊人黄色视频免费观看| 天天日日夜夜| 男生女生啊啊啊啊| 99热在线只有精品| 亚洲五月婷婷| 中文字幕亚洲在线一区| 久草视频观看视频在线| 五月婷婷丁香| 99re69| 国产激情在线| 国内精品嫩模A∨私拍小视频| 国产欧美岛国精品一区| 色色亚洲| 中文一区在线日| 不卡在线观看视频| 芊芊操逼视频无码| 人妻嗯啊啊在线播放| 熟啊v色欧美热| 日韩精品人妻中文字幕不卡乱码| 欧美国产精品久久九九| 人妻乱仑一区二区三区| 九九无码久久精品视频| 蜜乳av一区二区三区四区不卡| 日本欧美不卡| 久久久亚洲高清不打码| 亚洲男人天堂Av| 制服丝袜第二页| 日本中文熟女视频| 激情丁香婷婷| 熟妇人妻一区二区三在线| 91天堂| 国产色精品午夜大片| 黄色二级片网站| 97亚洲色图| 一区二区影院| 亚洲欧美日韩有码| 欧美懂色综合网| 亚洲精品精品一区二区| 国产25页| 狠狠操,使劲操| 99在线免费观看| 男人成人黄色视频在线观看免费下载| 2018天天日天天日| 天天流夜夜操| 久久亚洲一区女同性恋中文字幕| 亚洲制服aⅴ中文字幕| 日韩伦理视频| 干超碰碰熟女| 久久精品小视频| 密臀在线视频| 精品久久人妻成人网| 亚洲日韩少妇一道本视频| 国产主播福利| 天美国产精品| 日韩啪啪视频| 成人 日韩欧美一区| 女同性恋中文字幕| 大香蕉免费乱伦视频| 精品一二三区四视频| 波多野结衣AV无码一区| 中文字幕91综合| 婷婷五月天激情四射| 大香蕉啪啪网| 91女色| 精品人妻伦一二三区久久| 中文字幕av片| 欧美精品自慰系列寂寞少妇 | 日本三级大片| 一本色道熟妇| 久99| 亚洲人妻久久| 久久最新免费视频23| 亚洲综合999| 欧洲综合视频| 欧美福利视频啊啊啊啊| 久久久久久91香蕉国产| 免费αV在线视频| 综合久欧洲| 无码人妻精品一区二区中文| 一区二区三区成人| 欧美日韩操操操| 少妇熟女视频一二三区| 欧美视频在线视频免费va| 亚州欧美在线| 男人天堂2012| 人人操,人人液| 色情亚洲日本成人| 欧美偷拍区| AV色五月天| 免费毛片在线播放| 亚洲色宗合| 欧美一二三区四五区| 伊人精品久久网站| 超碰 国产熟女精品一区| 亚洲精品久久久久久久蜜桃臀| 男人的天堂99| 国产精品国产自产拍高清AV| 老子午夜伦不卡影院| 1024手机看片欧美日韩| 国产一级αv免费看片| 东京热av影院| 精品v1区| 久操视频资源站公开| 激情综合 婷婷五月 红杏| 亚洲 欧美都市激情| 亚洲日韩精品久久久久一区壹牛 | 超碰人妻久久人妻中文97| 影音先锋视频在线| 黄色成年| 欧美精品丝袜久久久中文字幕| 大香蕉专区| 日韩97在线| 色诱avtt| 影音先锋国产精品| 操逼网站网站| 性色高清..……| 九九热免费国产视频婷婷伊人五月| 国产精品亚洲无码| 91欧美情色| 久久鲁夜| 婷婷五月天AV| 亚洲av国产av综合av卡| 九九九国产精品| 抽查国产福利主播| 无码抄逼网| 成人免费视瓶| henhen91| 97视频新免费| 中文字幕一区二区三区人妻少妇在线| 户外裸露刺激视频第一区| 综合久久97| 欧洲一区二区三区四区在线观看| 18一区二区三区| 免费一级毛片在线视频观看| 大香蕉免费3| 青娱乐黄色录像| 亚洲性猛| 欧美色66| 日韩天美| 国模精品娜娜一二三区| 中文字幕一二区二三区人妻专区| 麻豆成人影音在线| 大香交| 欧美色图 人妻| 中文字幕一区二区三区蜜臀| 日本欧美国内在线| 性色av蜜臀av色欲aV| 日韩日本欧美在线观看| 春色综合网| 亚洲制服aⅴ中文字幕| 蜜臀一区二区三区在线| a啊啊啊啊啊啊啊啊一区二区| 精品一二三区四视频| 少妇被玩视频二三区| 可以看的av| 欧美精品自慰系列寂寞少妇| 一区二区三区黄片免费观看| 午夜视频黄| 亚州综合色| 日本精品一区二区不卡| 偷拍亚洲情色| 超碰午夜| 欧美综合网1| 啊啊啊啊啊啊啊啊啊啊在线观看| 99999久久久久9国产精品| 天天综合精品| 天天操综合网| 丁香五月影院| 五月天社区| 色五月首页| 久99热| 一起草AV| 防屏蔽在线视频| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 欧美狠狠鲁| 天天综合影院91| 欧美亚洲20p| AV天堂男人的天堂| 自拍二页| 国产成人精品午夜福利| 天天内射| 97久久国产亚洲精品超碰热| 久久久久斤小| 人澡逼| 欧美第五页| 农村少妇久久久久久久| 日本幼女18+| 一二三区精品视频| 热热色中文无码| 亚洲图片另类| 99婷婷一区二区| www.亚洲成人一区| 精品视频免费在线一区| 啪一啪免费视频| av国产无码| 日日干夜夜干| 97干com| 一牛一区二区三区久久| 无码男人天堂| 亚洲另类色综合网站| 色色九区| 色哟哟AⅤ| 久久精品国产亚洲AV无码做| 亚欧韩av| 精品国产嫩穴视频| 秋霞一区二区三区四区五区六区七区| 久偷拍欧美日韩三区| 国产精品69久久久久久久| 高颜值美女口爆高潮浪叫| 亚洲天堂2020| 欧洲亚洲国产综合在线| 黄色网址在线免费观看| 久久人妻精品| 久久亚洲不卡一区二区三区| 亚洲国产丝袜在线观看| 欧美综合色| 免费观看日本操逼视频| 插穴性爱视频在线观看| 色婷婷激情| 亚洲激情 欧美色图| 成人小说另类在线| 九热视频| 亚洲欧美视| 激情另类激情| 亚洲成人福利电影免费| 大香蕉青青9| 成人性爱全视频观看| 大香蕉一人| 麻豆国产尤物AV| 3PAV乱伦视频| 91国产大片| 久干9操| 亚洲不卡一| 亚洲色图大香| 玖玖爱在线视频免费观看| 性性久久| 色色色色网站| 亚洲国产97| 91撸色网 玖玖网 欧美| 日本视频一区二区三区| 欧美视频一区二区三区| 欧美在线官网| av天堂精品久久| 国产超碰97| 麻豆精品久久久久久久| 另类小说综合网| 人人操人人精品影片| 东京热激情视频一二三区| 思思热在线视频免费| 日韩中文字幕宗合在线| 99精品久久| 国产探花日韩援交| 日韩欧美久久婷婷网站| 色噜噜人妻av 中文字幕| 在线岛| 2017天天插| 亚州色图欧美| 色婷婷视频| 国产日韩手机视频在线| 18禁久久| 天天综和| 探花激情视频| 国产精品久久久久无码Av网曝门| 超碰97导航| 少妇蜜汁| 久久久成人国产精品无码| 91久久| 国产精品大屁股999| 国产欧美一区二区| 在线观看精品国产免费| 亚洲欧美另类激情小说| 九九九九九九九| 蜜伊人色综合97| 综合啪啪| 日韩在线性爱免费视频| 美女久久久久久久久久久| 综合97亚洲| 1024久久高清视频| 国产精品香蕉热久久新品| 天天干人人看综合| 人妻少妇无码| 九九九九九九成人| 91色艳| 黄色av一区二区在线| 亚洲春色欧美激情自拍| 91黄站| 亚欧美色图| 青青草大香蕉在线视频| 日韩精品一区二区三区四虎影视| 综合操逼| 国产精品嫩草影院午夜两性| 高清无码91| 岛国不卡超碰护士AV在线播放| 青青草视频爽一爽| 99精彩视频| 国产成人bd在线观看| 伦激情人妻另类人妻| 美女诱惑一区| 久久老熟女| 日韩欧美天堂| 做爱福利视频一区二区| 蜜桃臀 后入 一区 二区 三区 在线| 久久99亚洲精品久久99果| 密乳AV免费观看| 69XX一中文字幕人妻91| 国产99热| 清纯唯美激情| 90后后入| 91碰碰| 中文字幕一区二区三四五区日日骚| 亚洲欧洲精品成人| 激激五月| 男人的天堂亚洲| 99久re热视频精品98| 国产 无码 一区二区| 日本十八禁免费看污网站| 12一15性XXXX粉嫩国产| 国产传媒av天美传媒在线| 狠狠爱夜夜| 欧美色97| 日韩99999| 999国产精品999久久久久久| 国产风韵犹存熟妇三区| 国产欧美黑人丰满在线| 日韩无码AB| 青青伊人久久| 亚洲综合性网址| 伊人伊人LD| 啊啊啊好大好湿| 亚洲视频二区| 成人精品欧洲亚洲| 亚洲日韩乱码中文无码蜜桃臀网站| 精品无码一二三四区| 久久一二三四不卡| 蜜臀久久在线视频| 人妻爽爽啪视频| 精品人妻一区二区三区夜夜| 欧美情色贴图| 日韩欧美天天爽爽爽天天爽爽| 欧美男人亚洲天堂| 插入粉嫩少妇视频| 哑洲在线| 五月天久久人妻| 久久精品无码一区二区三区| 成人性交免费视屏| 欧美AB在线| 秋霞网无码| 最新av网站在线观看| 午夜激情成人在线观看| 国产一区二区精品久久99| 99精品视频在线观看免费| 97国产高清视频在线观看| 午夜高清成人在线视频| 超碰免费人人| 伊人综合色网| 青青操少妇| 国产精品在线一区二区| 素人伊尹大香蕉免费下载视频| 国产精品伦理| 翔田千里AV无码秘 三区| 你懂的在线观看区国产| 亚洲精品人妻在线| 99热这里只有精品地址| 亚洲婷婷五月天| 蜜臀亚洲中文| 九七毛片九九毛片| 天天操福利视频综合网站| 老妇女91| 一级@啪啪视频| 蜜乳AV色欲AVAV无码| 人妻天天夜夜爽一区二区| 欧美性暴力猛交XXXX| 后入福利视频| 亚洲在线a| 国产强奸91| 日本熟女中文| 中文字幕视频一区视频二区| 一区二区国产视频在线观看| 91精品操美女| 午夜精品久久一区二区| 亚洲国产精品有声| 色五月婷婷久久| 精品久久久久黄少妇| 肉丝无码中文高清| 欧美高清第一页| 免费观看国产小粉嫩喷水精品午| 一区二区三区视频在线观看免费| 欧美|91色综合| 亚av顶级裸体一区二区三区四区五区 | 男女性扦B| 啊啊啊草死我| 国产黄片在线免费观看| 99热精品在线在线| 美女AV一区二区| 东京太热男人的天堂久久久| 久久久精品中文字幕爱豆| 伊人色综合网电影| 动漫片子网站3黄| chaopen97久久| 妇女性内射冈站HDWWWCOM| 色色色色电影网| 日夜久久久九九九久| 色色97爱| 国产专区第一页| 天天色悠悠激情| 欧美骚少妇| 91久久免费视频互動交流| 婷婷操逼| 在线情色电影 91大 | 亚洲资源一区| 日本操大逼| 国精品一区二区三| 久操免费电影| 日韩卡一卡二卡三在线| 国产精品久久久视频| 97久久综合网| 国模不卡| 少妇与黑人高潮在线| 嗯嗯不要视频| 久久久久久AⅤ无码免费肉站 | 9久久美女首页| 五月婷亚洲精品天堂| 欧美色综合影院| 欧美夜夜骑视频| 国产欧美在线观看免费观看| 91欧美| 91熟女视频网| 日本精品无码三级网站| 国产有码一区| 亚洲成成熟女人综合一区二区| 欧美人妻精品一区二区| 干b在线性社区| 超碰欧美| 丁香五月成人| 亚洲欧美内射| 亚洲情色中文字幕一区| 精品一区二区三区四区女| 青娱乐休闲视频在线观看| 九九成人视频| 亚洲中文字幕久久无码精品| 四虎影视永久在线免费| 久久成年精品| 国产精品直播在线观看直播| 污啪啪啪视频| 超碰97伊人| 国产日韩欧美三级片| 综合九九| 成人aⅴ一区二区三区| 国产丰满少妇久久久精品影院| 偷拍偷窥与盗摄视频专区| 国产伊人自拍| 九七超碰|