日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BATJ面试必会|Jvm 虚拟机篇

發(fā)布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BATJ面试必会|Jvm 虚拟机篇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自??BATJ面試必會|Jvm 虛擬機篇

目錄

  • 一、運行時數(shù)據(jù)區(qū)域

    • 程序計數(shù)器

    • Java 虛擬機棧

    • 本地方法棧

    • 方法區(qū)

    • 運行時常量池

    • 直接內(nèi)存

  • 二、垃圾收集

    • 判斷一個對象是否可被回收

    • 引用類型

    • 垃圾收集算法

    • 垃圾收集器

  • 三、內(nèi)存分配與回收策略

    • Minor GC 和 Full GC

    • 內(nèi)存分配策略

    • Full GC 的觸發(fā)條件

  • 四、類加載機制

    • 類的生命周期

    • 類加載過程

    • 類初始化時機

    • 類與類加載器

    • 類加載器分類

    • 雙親委派模型

    • 自定義類加載器實現(xiàn)

  • 參考資料

一、運行時數(shù)據(jù)區(qū)域

?

程序計數(shù)器

記錄正在執(zhí)行的虛擬機字節(jié)碼指令的地址(如果正在執(zhí)行的是本地方法則為空)。

Java 虛擬機棧

每個 Java 方法在執(zhí)行的同時會創(chuàng)建一個棧幀用于存儲局部變量表、操作數(shù)棧、常量池引用等信息。從方法調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在 Java 虛擬機棧中入棧和出棧的過程。

?

可以通過 -Xss 這個虛擬機參數(shù)來指定每個線程的 Java 虛擬機棧內(nèi)存大小:

  • java -Xss512M HackTheJava

  • 該區(qū)域可能拋出以下異常:

    • 當(dāng)線程請求的棧深度超過最大值,會拋出 StackOverflowError 異常;

    • 棧進行動態(tài)擴展時如果無法申請到足夠內(nèi)存,會拋出 OutOfMemoryError 異常。

    本地方法棧

    本地方法棧與 Java 虛擬機棧類似,它們之間的區(qū)別只不過是本地方法棧為本地方法服務(wù)。

    本地方法一般是用其它語言(C、C++ 或匯編語言等)編寫的,并且被編譯為基于本機硬件和操作系統(tǒng)的程序,對待這些方法需要特別處理。

    ?

    所有對象都在這里分配內(nèi)存,是垃圾收集的主要區(qū)域("GC 堆")。

    現(xiàn)代的垃圾收集器基本都是采用分代收集算法,其主要的思想是針對不同類型的對象采取不同的垃圾回收算法。可以將堆分成兩塊:

    • 新生代(Young Generation)

    • 老年代(Old Generation)

    堆不需要連續(xù)內(nèi)存,并且可以動態(tài)增加其內(nèi)存,增加失敗會拋出 OutOfMemoryError 異常。

    可以通過 -Xms 和 -Xmx 這兩個虛擬機參數(shù)來指定一個程序的堆內(nèi)存大小,第一個參數(shù)設(shè)置初始值,第二個參數(shù)設(shè)置最大值。

  • java -Xms1M -Xmx2M HackTheJava

  • 方法區(qū)

    用于存放已被加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。

    和堆一樣不需要連續(xù)的內(nèi)存,并且可以動態(tài)擴展,動態(tài)擴展失敗一樣會拋出 OutOfMemoryError 異常。

    對這塊區(qū)域進行垃圾回收的主要目標(biāo)是對常量池的回收和對類的卸載,但是一般比較難實現(xiàn)。

    HotSpot 虛擬機把它當(dāng)成永久代來進行垃圾回收。但很難確定永久代的大小,因為它受到很多因素影響,并且每次 Full GC 之后永久代的大小都會改變,所以經(jīng)常會拋出 OutOfMemoryError 異常。為了更容易管理方法區(qū),從 JDK 1.8 開始,移除永久代,并把方法區(qū)移至元空間,它位于本地內(nèi)存中,而不是虛擬機內(nèi)存中。

    運行時常量池

    運行時常量池是方法區(qū)的一部分。

    Class 文件中的常量池(編譯器生成的字面量和符號引用)會在類加載后被放入這個區(qū)域。

    除了在編譯期生成的常量,還允許動態(tài)生成,例如 String 類的 intern()。

    直接內(nèi)存

    在 JDK 1.4 中新引入了 NIO 類,它可以使用 Native 函數(shù)庫直接分配堆外內(nèi)存,然后通過 Java 堆里的 DirectByteBuffer 對象作為這塊內(nèi)存的引用進行操作。這樣能在一些場景中顯著提高性能,因為避免了在堆內(nèi)存和堆外內(nèi)存來回拷貝數(shù)據(jù)。

    二、垃圾收集

    垃圾收集主要是針對堆和方法區(qū)進行。程序計數(shù)器、虛擬機棧和本地方法棧這三個區(qū)域?qū)儆诰€程私有的,只存在于線程的生命周期內(nèi),線程結(jié)束之后就會消失,因此不需要對這三個區(qū)域進行垃圾回收。

    判斷一個對象是否可被回收

    1. 引用計數(shù)算法

    為對象添加一個引用計數(shù)器,當(dāng)對象增加一個引用時計數(shù)器加 1,引用失效時計數(shù)器減 1。引用計數(shù)為 0 的對象可被回收。

    在兩個對象出現(xiàn)循環(huán)引用的情況下,此時引用計數(shù)器永遠不為 0,導(dǎo)致無法對它們進行回收。正是因為循環(huán)引用的存在,因此 Java 虛擬機不使用引用計數(shù)算法。

    public class Test {public Object instance = null;public static void main(String[] args) {Test a = new Test();Test b = new Test();a.instance = b;b.instance = a;}}

    2. 可達性分析算法

    以 GC Roots 為起始點進行搜索,可達的對象都是存活的,不可達的對象可被回收。

    Java 虛擬機使用該算法來判斷對象是否可被回收,GC Roots 一般包含以下內(nèi)容:

    • 虛擬機棧中局部變量表中引用的對象

    • 本地方法棧中 JNI 中引用的對象

    • 方法區(qū)中類靜態(tài)屬性引用的對象

    • 方法區(qū)中的常量引用的對象

    ?

    3. 方法區(qū)的回收

    因為方法區(qū)主要存放永久代對象,而永久代對象的回收率比新生代低很多,所以在方法區(qū)上進行回收性價比不高。

    主要是對常量池的回收和對類的卸載。

    為了避免內(nèi)存溢出,在大量使用反射和動態(tài)代理的場景都需要虛擬機具備類卸載功能。

    類的卸載條件很多,需要滿足以下三個條件,并且滿足了條件也不一定會被卸載:

    • 該類所有的實例都已經(jīng)被回收,此時堆中不存在該類的任何實例。

    • 加載該類的 ClassLoader 已經(jīng)被回收。

    • 該類對應(yīng)的 Class 對象沒有在任何地方被引用,也就無法在任何地方通過反射訪問該類方法。

    4. finalize()

    類似 C++ 的析構(gòu)函數(shù),用于關(guān)閉外部資源。但是 try-finally 等方式可以做得更好,并且該方法運行代價很高,不確定性大,無法保證各個對象的調(diào)用順序,因此最好不要使用。

    當(dāng)一個對象可被回收時,如果需要執(zhí)行該對象的 finalize() 方法,那么就有可能在該方法中讓對象重新被引用,從而實現(xiàn)自救。自救只能進行一次,如果回收的對象之前調(diào)用了 finalize() 方法自救,后面回收時不會再調(diào)用該方法。

    引用類型

    無論是通過引用計數(shù)算法判斷對象的引用數(shù)量,還是通過可達性分析算法判斷對象是否可達,判定對象是否可被回收都與引用有關(guān)。

    Java 提供了四種強度不同的引用類型。

    1. 強引用

    被強引用關(guān)聯(lián)的對象不會被回收。

    使用 new 一個新對象的方式來創(chuàng)建強引用。

  • Object obj = new Object();

  • 2. 軟引用

    被軟引用關(guān)聯(lián)的對象只有在內(nèi)存不夠的情況下才會被回收。

    使用 SoftReference 類來創(chuàng)建軟引用。

  • Object obj = new Object();

  • SoftReference<Object> sf = new SoftReference<Object>(obj);

  • obj = null; // 使對象只被軟引用關(guān)聯(lián)

  • 3. 弱引用

    被弱引用關(guān)聯(lián)的對象一定會被回收,也就是說它只能存活到下一次垃圾回收發(fā)生之前。

    使用 WeakReference 類來創(chuàng)建弱引用。

  • Object obj = new Object();

  • WeakReference<Object> wf = new WeakReference<Object>(obj);

  • obj = null;

  • 4. 虛引用

    又稱為幽靈引用或者幻影引用,一個對象是否有虛引用的存在,不會對其生存時間造成影響,也無法通過虛引用得到一個對象。

    為一個對象設(shè)置虛引用的唯一目的是能在這個對象被回收時收到一個系統(tǒng)通知。

    使用 PhantomReference 來創(chuàng)建虛引用。

  • Object obj = new Object();

  • PhantomReference<Object> pf = new PhantomReference<Object>(obj);

  • obj = null;

  • 垃圾收集算法

    1. 標(biāo)記 - 清除

    ?

    標(biāo)記要回收的對象,然后清除。

    不足:

    • 標(biāo)記和清除過程效率都不高;

    • 會產(chǎn)生大量不連續(xù)的內(nèi)存碎片,導(dǎo)致無法給大對象分配內(nèi)存。

    2. 標(biāo)記 - 整理

    ?

    讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內(nèi)存。

    3. 復(fù)制

    ?

    將內(nèi)存劃分為大小相等的兩塊,每次只使用其中一塊,當(dāng)這一塊內(nèi)存用完了就將還存活的對象復(fù)制到另一塊上面,然后再把使用過的內(nèi)存空間進行一次清理。

    主要不足是只使用了內(nèi)存的一半。

    現(xiàn)在的商業(yè)虛擬機都采用這種收集算法回收新生代,但是并不是劃分為大小相等的兩塊,而是一塊較大的 Eden 空間和兩塊較小的 Survivor 空間,每次使用 Eden 和其中一塊 Survivor。在回收時,將 Eden 和 Survivor 中還存活著的對象全部復(fù)制到另一塊 Survivor 上,最后清理 Eden 和使用過的那一塊 Survivor。

    HotSpot 虛擬機的 Eden 和 Survivor 大小比例默認為 8:1,保證了內(nèi)存的利用率達到 90%。如果每次回收有多于 10% 的對象存活,那么一塊 Survivor 就不夠用了,此時需要依賴于老年代進行空間分配擔(dān)保,也就是借用老年代的空間存儲放不下的對象。

    4. 分代收集

    現(xiàn)在的商業(yè)虛擬機采用分代收集算法,它根據(jù)對象存活周期將內(nèi)存劃分為幾塊,不同塊采用適當(dāng)?shù)氖占惴ā?/p>

    一般將堆分為新生代和老年代。

    • 新生代使用:復(fù)制算法

    • 老年代使用:標(biāo)記 - 清除 或者 標(biāo)記 - 整理 算法

    垃圾收集器

    ?

    以上是 HotSpot 虛擬機中的 7 個垃圾收集器,連線表示垃圾收集器可以配合使用。

    • 單線程與多線程:單線程指的是垃圾收集器只使用一個線程,而多線程使用多個線程;

    • 串行與并行:串行指的是垃圾收集器與用戶程序交替執(zhí)行,這意味著在執(zhí)行垃圾收集的時候需要停頓用戶程序;并行指的是垃圾收集器和用戶程序同時執(zhí)行。除了 CMS 和 G1 之外,其它垃圾收集器都是以串行的方式執(zhí)行。

    1. Serial 收集器

    ?

    Serial 翻譯為串行,也就是說它以串行的方式執(zhí)行。

    它是單線程的收集器,只會使用一個線程進行垃圾收集工作。

    它的優(yōu)點是簡單高效,在單個 CPU 環(huán)境下,由于沒有線程交互的開銷,因此擁有最高的單線程收集效率。

    它是 Client 場景下的默認新生代收集器,因為在該場景下內(nèi)存一般來說不會很大。它收集一兩百兆垃圾的停頓時間可以控制在一百多毫秒以內(nèi),只要不是太頻繁,這點停頓時間是可以接受的。

    2. ParNew 收集器

    ?

    它是 Serial 收集器的多線程版本。

    它是 Server 場景下默認的新生代收集器,除了性能原因外,主要是因為除了 Serial 收集器,只有它能與 CMS 收集器配合使用。

    3. Parallel Scavenge 收集器

    與 ParNew 一樣是多線程收集器。

    其它收集器目標(biāo)是盡可能縮短垃圾收集時用戶線程的停頓時間,而它的目標(biāo)是達到一個可控制的吞吐量,因此它被稱為“吞吐量優(yōu)先”收集器。這里的吞吐量指 CPU 用于運行用戶程序的時間占總時間的比值。

    停頓時間越短就越適合需要與用戶交互的程序,良好的響應(yīng)速度能提升用戶體驗。而高吞吐量則可以高效率地利用 CPU 時間,盡快完成程序的運算任務(wù),適合在后臺運算而不需要太多交互的任務(wù)。

    縮短停頓時間是以犧牲吞吐量和新生代空間來換取的:新生代空間變小,垃圾回收變得頻繁,導(dǎo)致吞吐量下降。

    可以通過一個開關(guān)參數(shù)打開 GC 自適應(yīng)的調(diào)節(jié)策略(GC Ergonomics),就不需要手工指定新生代的大小(-Xmn)、Eden 和 Survivor 區(qū)的比例、晉升老年代對象年齡等細節(jié)參數(shù)了。虛擬機會根據(jù)當(dāng)前系統(tǒng)的運行情況收集性能監(jiān)控信息,動態(tài)調(diào)整這些參數(shù)以提供最合適的停頓時間或者最大的吞吐量。

    4. Serial Old 收集器

    ?

    是 Serial 收集器的老年代版本,也是給 Client 場景下的虛擬機使用。如果用在 Server 場景下,它有兩大用途:

    • 在 JDK 1.5 以及之前版本(Parallel Old 誕生以前)中與 Parallel Scavenge 收集器搭配使用。

    • 作為 CMS 收集器的后備預(yù)案,在并發(fā)收集發(fā)生 Concurrent Mode Failure 時使用。

    5. Parallel Old 收集器

    ?

    是 Parallel Scavenge 收集器的老年代版本。

    在注重吞吐量以及 CPU 資源敏感的場合,都可以優(yōu)先考慮 Parallel Scavenge 加 Parallel Old 收集器。

    6. CMS 收集器

    ?

    CMS(Concurrent Mark Sweep),Mark Sweep 指的是標(biāo)記 - 清除算法。

    分為以下四個流程:

    • 初始標(biāo)記:僅僅只是標(biāo)記一下 GC Roots 能直接關(guān)聯(lián)到的對象,速度很快,需要停頓。

    • 并發(fā)標(biāo)記:進行 GC Roots Tracing 的過程,它在整個回收過程中耗時最長,不需要停頓。

    • 重新標(biāo)記:為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運作而導(dǎo)致標(biāo)記產(chǎn)生變動的那一部分對象的標(biāo)記記錄,需要停頓。

    • 并發(fā)清除:不需要停頓。

    在整個過程中耗時最長的并發(fā)標(biāo)記和并發(fā)清除過程中,收集器線程都可以與用戶線程一起工作,不需要進行停頓。

    具有以下缺點:

    • 吞吐量低:低停頓時間是以犧牲吞吐量為代價的,導(dǎo)致 CPU 利用率不夠高。

    • 無法處理浮動垃圾,可能出現(xiàn) Concurrent Mode Failure。浮動垃圾是指并發(fā)清除階段由于用戶線程繼續(xù)運行而產(chǎn)生的垃圾,這部分垃圾只能到下一次 GC 時才能進行回收。由于浮動垃圾的存在,因此需要預(yù)留出一部分內(nèi)存,意味著 CMS 收集不能像其它收集器那樣等待老年代快滿的時候再回收。如果預(yù)留的內(nèi)存不夠存放浮動垃圾,就會出現(xiàn) Concurrent Mode Failure,這時虛擬機將臨時啟用 Serial Old 來替代 CMS。

    • 標(biāo)記 - 清除算法導(dǎo)致的空間碎片,往往出現(xiàn)老年代空間剩余,但無法找到足夠大連續(xù)空間來分配當(dāng)前對象,不得不提前觸發(fā)一次 Full GC。

    7. G1 收集器

    G1(Garbage-First),它是一款面向服務(wù)端應(yīng)用的垃圾收集器,在多 CPU 和大內(nèi)存的場景下有很好的性能。HotSpot 開發(fā)團隊賦予它的使命是未來可以替換掉 CMS 收集器。

    堆被分為新生代和老年代,其它收集器進行收集的范圍都是整個新生代或者老年代,而 G1 可以直接對新生代和老年代一起回收。

    ?

    G1 把堆劃分成多個大小相等的獨立區(qū)域(Region),新生代和老年代不再物理隔離。

    ?

    通過引入 Region 的概念,從而將原來的一整塊內(nèi)存空間劃分成多個的小空間,使得每個小空間可以單獨進行垃圾回收。這種劃分方法帶來了很大的靈活性,使得可預(yù)測的停頓時間模型成為可能。通過記錄每個 Region 垃圾回收時間以及回收所獲得的空間(這兩個值是通過過去回收的經(jīng)驗獲得),并維護一個優(yōu)先列表,每次根據(jù)允許的收集時間,優(yōu)先回收價值最大的 Region。

    每個 Region 都有一個 Remembered Set,用來記錄該 Region 對象的引用對象所在的 Region。通過使用 Remembered Set,在做可達性分析的時候就可以避免全堆掃描。

    ?

    如果不計算維護 Remembered Set 的操作,G1 收集器的運作大致可劃分為以下幾個步驟:

    • 初始標(biāo)記

    • 并發(fā)標(biāo)記

    • 最終標(biāo)記:為了修正在并發(fā)標(biāo)記期間因用戶程序繼續(xù)運作而導(dǎo)致標(biāo)記產(chǎn)生變動的那一部分標(biāo)記記錄,虛擬機將這段時間對象變化記錄在線程的 Remembered Set Logs 里面,最終標(biāo)記階段需要把 Remembered Set Logs 的數(shù)據(jù)合并到 Remembered Set 中。這階段需要停頓線程,但是可并行執(zhí)行。

    • 篩選回收:首先對各個 Region 中的回收價值和成本進行排序,根據(jù)用戶所期望的 GC 停頓時間來制定回收計劃。此階段其實也可以做到與用戶程序一起并發(fā)執(zhí)行,但是因為只回收一部分 Region,時間是用戶可控制的,而且停頓用戶線程將大幅度提高收集效率。

    具備如下特點:

    • 空間整合:整體來看是基于“標(biāo)記 - 整理”算法實現(xiàn)的收集器,從局部(兩個 Region 之間)上來看是基于“復(fù)制”算法實現(xiàn)的,這意味著運行期間不會產(chǎn)生內(nèi)存空間碎片。

    • 可預(yù)測的停頓:能讓使用者明確指定在一個長度為 M 毫秒的時間片段內(nèi),消耗在 GC 上的時間不得超過 N 毫秒。

    三、內(nèi)存分配與回收策略

    Minor GC 和 Full GC

    • Minor GC:回收新生代上,因為新生代對象存活時間很短,因此 Minor GC 會頻繁執(zhí)行,執(zhí)行的速度一般也會比較快。

    • Full GC:回收老年代和新生代,老年代對象其存活時間長,因此 Full GC 很少執(zhí)行,執(zhí)行速度會比 Minor GC 慢很多。

      ?

    內(nèi)存分配策略

    1. 對象優(yōu)先在 Eden 分配

    大多數(shù)情況下,對象在新生代 Eden 區(qū)分配,當(dāng) Eden 區(qū)空間不夠時,發(fā)起 Minor GC。

    2. 大對象直接進入老年代

    大對象是指需要連續(xù)內(nèi)存空間的對象,最典型的大對象是那種很長的字符串以及數(shù)組。

    經(jīng)常出現(xiàn)大對象會提前觸發(fā)垃圾收集以獲取足夠的連續(xù)空間分配給大對象。

    -XX:PretenureSizeThreshold,大于此值的對象直接在老年代分配,避免在 Eden 區(qū)和 Survivor 區(qū)之間的大量內(nèi)存復(fù)制。

    3. 長期存活的對象進入老年代

    為對象定義年齡計數(shù)器,對象在 Eden 出生并經(jīng)過 Minor GC 依然存活,將移動到 Survivor 中,年齡就增加 1 歲,增加到一定年齡則移動到老年代中。

    -XX:MaxTenuringThreshold 用來定義年齡的閾值。

    4. 動態(tài)對象年齡判定

    虛擬機并不是永遠地要求對象的年齡必須達到 MaxTenuringThreshold 才能晉升老年代,如果在 Survivor 中相同年齡所有對象大小的總和大于 Survivor 空間的一半,則年齡大于或等于該年齡的對象可以直接進入老年代,無需等到 MaxTenuringThreshold 中要求的年齡。

    5. 空間分配擔(dān)保

    在發(fā)生 Minor GC 之前,虛擬機先檢查老年代最大可用的連續(xù)空間是否大于新生代所有對象總空間,如果條件成立的話,那么 Minor GC 可以確認是安全的。

    如果不成立的話虛擬機會查看 HandlePromotionFailure 設(shè)置值是否允許擔(dān)保失敗,如果允許那么就會繼續(xù)檢查老年代最大可用的連續(xù)空間是否大于歷次晉升到老年代對象的平均大小,如果大于,將嘗試著進行一次 Minor GC;如果小于,或者 HandlePromotionFailure 設(shè)置不允許冒險,那么就要進行一次 Full GC。

    Full GC 的觸發(fā)條件

    對于 Minor GC,其觸發(fā)條件非常簡單,當(dāng) Eden 空間滿時,就將觸發(fā)一次 Minor GC。而 Full GC 則相對復(fù)雜,有以下條件:

    1. 調(diào)用 System.gc()

    只是建議虛擬機執(zhí)行 Full GC,但是虛擬機不一定真正去執(zhí)行。不建議使用這種方式,而是讓虛擬機管理內(nèi)存。

    2. 老年代空間不足

    老年代空間不足的常見場景為前文所講的大對象直接進入老年代、長期存活的對象進入老年代等。

    為了避免以上原因引起的 Full GC,應(yīng)當(dāng)盡量不要創(chuàng)建過大的對象以及數(shù)組。除此之外,可以通過 -Xmn 虛擬機參數(shù)調(diào)大新生代的大小,讓對象盡量在新生代被回收掉,不進入老年代。還可以通過 -XX:MaxTenuringThreshold 調(diào)大對象進入老年代的年齡,讓對象在新生代多存活一段時間。

    3. 空間分配擔(dān)保失敗

    使用復(fù)制算法的 Minor GC 需要老年代的內(nèi)存空間作擔(dān)保,如果擔(dān)保失敗會執(zhí)行一次 Full GC。具體內(nèi)容請參考上面的第五小節(jié)。

    4. JDK 1.7 及以前的永久代空間不足

    在 JDK 1.7 及以前,HotSpot 虛擬機中的方法區(qū)是用永久代實現(xiàn)的,永久代中存放的為一些 Class 的信息、常量、靜態(tài)變量等數(shù)據(jù)。

    當(dāng)系統(tǒng)中要加載的類、反射的類和調(diào)用的方法較多時,永久代可能會被占滿,在未配置為采用 CMS GC 的情況下也會執(zhí)行 Full GC。如果經(jīng)過 Full GC 仍然回收不了,那么虛擬機會拋出 java.lang.OutOfMemoryError。

    為避免以上原因引起的 Full GC,可采用的方法為增大永久代空間或轉(zhuǎn)為使用 CMS GC。

    5. Concurrent Mode Failure

    執(zhí)行 CMS GC 的過程中同時有對象要放入老年代,而此時老年代空間不足(可能是 GC 過程中浮動垃圾過多導(dǎo)致暫時性的空間不足),便會報 Concurrent Mode Failure 錯誤,并觸發(fā) Full GC。

    四、類加載機制

    類是在運行期間第一次使用時動態(tài)加載的,而不是一次性加載。因為如果一次性加載,那么會占用很多的內(nèi)存。

    類的生命周期

    ?

    包括以下 7 個階段:

    • 加載(Loading)

    • 驗證(Verification)

    • 準(zhǔn)備(Preparation)

    • 解析(Resolution)

    • 初始化(Initialization)

    • 使用(Using)

    • 卸載(Unloading)

    類加載過程

    包含了加載、驗證、準(zhǔn)備、解析和初始化這 5 個階段。

    1. 加載

    加載是類加載的一個階段,注意不要混淆。

    加載過程完成以下三件事:

    • 通過類的完全限定名稱獲取定義該類的二進制字節(jié)流。

    • 將該字節(jié)流表示的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)換為方法區(qū)的運行時存儲結(jié)構(gòu)。

    • 在內(nèi)存中生成一個代表該類的 Class 對象,作為方法區(qū)中該類各種數(shù)據(jù)的訪問入口。

    其中二進制字節(jié)流可以從以下方式中獲取:

    • 從 ZIP 包讀取,成為 JAR、EAR、WAR 格式的基礎(chǔ)。

    • 從網(wǎng)絡(luò)中獲取,最典型的應(yīng)用是 Applet。

    • 運行時計算生成,例如動態(tài)代理技術(shù),在 java.lang.reflect.Proxy 使用 ProxyGenerator.generateProxyClass 的代理類的二進制字節(jié)流。

    • 由其他文件生成,例如由 JSP 文件生成對應(yīng)的 Class 類。

    2. 驗證

    確保 Class 文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機的要求,并且不會危害虛擬機自身的安全。

    3. 準(zhǔn)備

    類變量是被 static 修飾的變量,準(zhǔn)備階段為類變量分配內(nèi)存并設(shè)置初始值,使用的是方法區(qū)的內(nèi)存。

    實例變量不會在這階段分配內(nèi)存,它會在對象實例化時隨著對象一起被分配在堆中。應(yīng)該注意到,實例化不是類加載的一個過程,類加載發(fā)生在所有實例化操作之前,并且類加載只進行一次,實例化可以進行多次。

    初始值一般為 0 值,例如下面的類變量 value 被初始化為 0 而不是 123。

  • public static int value = 123;

  • 如果類變量是常量,那么它將初始化為表達式所定義的值而不是 0。例如下面的常量 value 被初始化為 123 而不是 0。

  • public static final int value = 123;

  • 4. 解析

    將常量池的符號引用替換為直接引用的過程。

    其中解析過程在某些情況下可以在初始化階段之后再開始,這是為了支持 Java 的動態(tài)綁定。

    5. 初始化

    初始化階段才真正開始執(zhí)行類中定義的 Java 程序代碼。初始化階段是虛擬機執(zhí)行類構(gòu)造器 <clinit>() 方法的過程。在準(zhǔn)備階段,類變量已經(jīng)賦過一次系統(tǒng)要求的初始值,而在初始化階段,根據(jù)程序員通過程序制定的主觀計劃去初始化類變量和其它資源。

    在準(zhǔn)備階段,已經(jīng)為類變量分配了系統(tǒng)所需的初始值,并且在初始化階段,根據(jù)程序員通過程序進行的主觀計劃來初始化類變量和其他資源。

    <clinit>() 是由編譯器自動收集類中所有類變量的賦值動作和靜態(tài)語句塊中的語句合并產(chǎn)生的,編譯器收集的順序由語句在源文件中出現(xiàn)的順序決定。特別注意的是,靜態(tài)語句塊只能訪問到定義在它之前的類變量,定義在它之后的類變量只能賦值,不能訪問。例如以下代碼:

  • public class Test {

  • static {

  • i = 0; // 給變量賦值可以正常編譯通過

  • System.out.print(i); // 這句編譯器會提示“非法向前引用”

  • }

  • static int i = 1;

  • }

  • 由于父類的 <clinit>() 方法先執(zhí)行,也就意味著父類中定義的靜態(tài)語句塊的執(zhí)行要優(yōu)先于子類。例如以下代碼:

  • static class Parent {

  • public static int A = 1;

  • static {

  • A = 2;

  • }

  • }

  • ?

  • static class Sub extends Parent {

  • public static int B = A;

  • }

  • ?

  • public static void main(String[] args) {

  • System.out.println(Sub.B); // 2

  • }

  • 接口中不可以使用靜態(tài)語句塊,但仍然有類變量初始化的賦值操作,因此接口與類一樣都會生成 <clinit>() 方法。但接口與類不同的是,執(zhí)行接口的 <clinit>() 方法不需要先執(zhí)行父接口的 <clinit>() 方法。只有當(dāng)父接口中定義的變量使用時,父接口才會初始化。另外,接口的實現(xiàn)類在初始化時也一樣不會執(zhí)行接口的 <clinit>() 方法。

    虛擬機會保證一個類的 <clinit>() 方法在多線程環(huán)境下被正確的加鎖和同步,如果多個線程同時初始化一個類,只會有一個線程執(zhí)行這個類的 <clinit>() 方法,其它線程都會阻塞等待,直到活動線程執(zhí)行 <clinit>() 方法完畢。如果在一個類的 <clinit>() 方法中有耗時的操作,就可能造成多個線程阻塞,在實際過程中此種阻塞很隱蔽。

    類初始化時機

    1. 主動引用

    虛擬機規(guī)范中并沒有強制約束何時進行加載,但是規(guī)范嚴格規(guī)定了有且只有下列五種情況必須對類進行初始化(加載、驗證、準(zhǔn)備都會隨之發(fā)生):

    • 遇到 new、getstatic、putstatic、invokestatic 這四條字節(jié)碼指令時,如果類沒有進行過初始化,則必須先觸發(fā)其初始化。最常見的生成這 4 條指令的場景是:使用 new 關(guān)鍵字實例化對象的時候;讀取或設(shè)置一個類的靜態(tài)字段(被 final 修飾、已在編譯期把結(jié)果放入常量池的靜態(tài)字段除外)的時候;以及調(diào)用一個類的靜態(tài)方法的時候。

    • 使用 java.lang.reflect 包的方法對類進行反射調(diào)用的時候,如果類沒有進行初始化,則需要先觸發(fā)其初始化。

    • 當(dāng)初始化一個類的時候,如果發(fā)現(xiàn)其父類還沒有進行過初始化,則需要先觸發(fā)其父類的初始化。

    • 當(dāng)虛擬機啟動時,用戶需要指定一個要執(zhí)行的主類(包含 main() 方法的那個類),虛擬機會先初始化這個主類;

    • 當(dāng)使用 JDK 1.7 的動態(tài)語言支持時,如果一個 java.lang.invoke.MethodHandle 實例最后的解析結(jié)果為 REFgetStatic, REFputStatic, REF_invokeStatic 的方法句柄,并且這個方法句柄所對應(yīng)的類沒有進行過初始化,則需要先觸發(fā)其初始化;

      ?

    2. 被動引用

    以上 5 種場景中的行為稱為對一個類進行主動引用。除此之外,所有引用類的方式都不會觸發(fā)初始化,稱為被動引用。被動引用的常見例子包括:

    • 通過子類引用父類的靜態(tài)字段,不會導(dǎo)致子類初始化。

  • System.out.println(SubClass.value); // value 字段在 SuperClass 中定義

    • 通過數(shù)組定義來引用類,不會觸發(fā)此類的初始化。該過程會對數(shù)組類進行初始化,數(shù)組類是一個由虛擬機自動生成的、直接繼承自 Object 的子類,其中包含了數(shù)組的屬性和方法。

  • SuperClass[] sca = new SuperClass[10];

    • 常量在編譯階段會存入調(diào)用類的常量池中,本質(zhì)上并沒有直接引用到定義常量的類,因此不會觸發(fā)定義常量的類的初始化。

  • System.out.println(ConstClass.HELLOWORLD);

  • 類與類加載器

    兩個類相等,需要類本身相等,并且使用同一個類加載器進行加載。這是因為每一個類加載器都擁有一個獨立的類名稱空間。

    這里的相等,包括類的 Class 對象的 equals() 方法、isAssignableFrom() 方法、isInstance() 方法的返回結(jié)果為 true,也包括使用 instanceof 關(guān)鍵字做對象所屬關(guān)系判定結(jié)果為 true。

    類加載器分類

    從 Java 虛擬機的角度來講,只存在以下兩種不同的類加載器:

    • 啟動類加載器(Bootstrap ClassLoader),使用 C++ 實現(xiàn),是虛擬機自身的一部分;

    • 所有其它類的加載器,使用 Java 實現(xiàn),獨立于虛擬機,繼承自抽象類 java.lang.ClassLoader。

    從 Java 開發(fā)人員的角度看,類加載器可以劃分得更細致一些:

    • 啟動類加載器(Bootstrap ClassLoader)此類加載器負責(zé)將存放在 <JRE_HOME>\lib 目錄中的,或者被 -Xbootclasspath 參數(shù)所指定的路徑中的,并且是虛擬機識別的(僅按照文件名識別,如 rt.jar,名字不符合的類庫即使放在 lib 目錄中也不會被加載)類庫加載到虛擬機內(nèi)存中。啟動類加載器無法被 Java 程序直接引用,用戶在編寫自定義類加載器時,如果需要把加載請求委派給啟動類加載器,直接使用 null 代替即可。

    • 擴展類加載器(Extension ClassLoader)這個類加載器是由 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實現(xiàn)的。它負責(zé)將 <JAVA_HOME>/lib/ext 或者被 java.ext.dir 系統(tǒng)變量所指定路徑中的所有類庫加載到內(nèi)存中,開發(fā)者可以直接使用擴展類加載器。

    • 應(yīng)用程序類加載器(Application ClassLoader)這個類加載器是由 AppClassLoader(sun.misc.Launcher$AppClassLoader)實現(xiàn)的。由于這個類加載器是 ClassLoader 中的 getSystemClassLoader() 方法的返回值,因此一般稱為系統(tǒng)類加載器。它負責(zé)加載用戶類路徑(ClassPath)上所指定的類庫,開發(fā)者可以直接使用這個類加載器,如果應(yīng)用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載器。

      ?

    雙親委派模型

    應(yīng)用程序是由三種類加載器互相配合從而實現(xiàn)類加載,除此之外還可以加入自己定義的類加載器。

    下圖展示了類加載器之間的層次關(guān)系,稱為雙親委派模型(Parents Delegation Model)。該模型要求除了頂層的啟動類加載器外,其它的類加載器都要有自己的父類加載器。類加載器之間的父子關(guān)系一般通過組合關(guān)系(Composition)來實現(xiàn),而不是繼承關(guān)系(Inheritance)。

    1. 工作過程

    一個類加載器首先將類加載請求轉(zhuǎn)發(fā)到父類加載器,只有當(dāng)父類加載器無法完成時才嘗試自己加載。

    2. 好處

    使得 Java 類隨著它的類加載器一起具有一種帶有優(yōu)先級的層次關(guān)系,從而使得基礎(chǔ)類得到統(tǒng)一。

    例如 java.lang.Object 存放在 rt.jar 中,如果編寫另外一個 java.lang.Object 并放到 ClassPath 中,程序可以編譯通過。由于雙親委派模型的存在,所以在 rt.jar 中的 Object 比在 ClassPath 中的 Object 優(yōu)先級更高,這是因為 rt.jar 中的 Object 使用的是啟動類加載器,而 ClassPath 中的 Object 使用的是應(yīng)用程序類加載器。rt.jar 中的 Object 優(yōu)先級更高,那么程序中所有的 Object 都是這個 Object。

    3. 實現(xiàn)

    以下是抽象類 java.lang.ClassLoader 的代碼片段,其中的 loadClass() 方法運行過程如下:先檢查類是否已經(jīng)加載過,如果沒有則讓父類加載器去加載。當(dāng)父類加載器加載失敗時拋出 ClassNotFoundException,此時嘗試自己去加載。

  • public abstract class ClassLoader {

  • // The parent class loader for delegation

  • private final ClassLoader parent;

  • ?

  • public Class<?> loadClass(String name) throws ClassNotFoundException {

  • return loadClass(name, false);

  • }

  • ?

  • protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {

  • synchronized (getClassLoadingLock(name)) {

  • // First, check if the class has already been loaded

  • Class<?> c = findLoadedClass(name);

  • if (c == null) {

  • try {

  • if (parent != null) {

  • c = parent.loadClass(name, false);

  • } else {

  • c = findBootstrapClassOrNull(name);

  • }

  • } catch (ClassNotFoundException e) {

  • // ClassNotFoundException thrown if class not found

  • // from the non-null parent class loader

  • }

  • ?

  • if (c == null) {

  • // If still not found, then invoke findClass in order

  • // to find the class.

  • c = findClass(name);

  • }

  • }

  • if (resolve) {

  • resolveClass(c);

  • }

  • return c;

  • }

  • }

  • ?

  • protected Class<?> findClass(String name) throws ClassNotFoundException {

  • throw new ClassNotFoundException(name);

  • }

  • }

  • 自定義類加載器實現(xiàn)

    FileSystemClassLoader 是自定義類加載器,繼承自 java.lang.ClassLoader,用于加載文件系統(tǒng)上的類。它首先根據(jù)類的全名在文件系統(tǒng)上查找類的字節(jié)代碼文件(.class 文件),然后讀取該文件內(nèi)容,最后通過 defineClass() 方法來把這些字節(jié)代碼轉(zhuǎn)換成 java.lang.Class 類的實例。

    java.lang.ClassLoader 的 loadClass() 實現(xiàn)了雙親委派模型的邏輯,自定義類加載器一般不去重寫它,但是需要重寫 findClass() 方法。

  • public class FileSystemClassLoader extends ClassLoader {

  • ?

  • private String rootDir;

  • ?

  • public FileSystemClassLoader(String rootDir) {

  • this.rootDir = rootDir;

  • }

  • ?

  • protected Class<?> findClass(String name) throws ClassNotFoundException {

  • byte[] classData = getClassData(name);

  • if (classData == null) {

  • throw new ClassNotFoundException();

  • } else {

  • return defineClass(name, classData, 0, classData.length);

  • }

  • }

  • ?

  • private byte[] getClassData(String className) {

  • String path = classNameToPath(className);

  • try {

  • InputStream ins = new FileInputStream(path);

  • ByteArrayOutputStream baos = new ByteArrayOutputStream();

  • int bufferSize = 4096;

  • byte[] buffer = new byte[bufferSize];

  • int bytesNumRead;

  • while ((bytesNumRead = ins.read(buffer)) != -1) {

  • baos.write(buffer, 0, bytesNumRead);

  • }

  • return baos.toByteArray();

  • } catch (IOException e) {

  • e.printStackTrace();

  • }

  • return null;

  • }

  • ?

  • private String classNameToPath(String className) {

  • return rootDir + File.separatorChar

  • + className.replace('.', File.separatorChar) + ".class";

  • }

  • }

  • 參考資料

    • 周志明. 深入理解 Java 虛擬機 [M]. 機械工業(yè)出版社, 2011.

    • Chapter 2. The Structure of the Java Virtual Machine

    • Jvm memory?Getting Started with the G1 Garbage Collector

    • JNI Part1: Java Native Interface Introduction and “Hello World” application

    • Memory Architecture Of JVM(Runtime Data Areas)

    • JVM Run-Time Data Areas

    • Android on x86: Java Native Interface and the Android Native Development Kit

    • 深入理解 JVM(2)——GC 算法與內(nèi)存分配策略

    • 深入理解 JVM(3)——7 種垃圾收集器

    • JVM Internals

    • 深入探討 Java 類加載器

    • Guide to WeakHashMap in Java

    • Tomcat example source code file (ConcurrentCache.java)

    總結(jié)

    以上是生活随笔為你收集整理的BATJ面试必会|Jvm 虚拟机篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    99热这里只有精品免费 | 91网在线看 | 国产在线观看一区 | 国产免费观看av | 99热官网| 99视频精品全部免费 在线 | 在线日韩中文 | 欧美视频二区 | 久久精品视频网站 | 在线观看免费黄视频 | 精品久久国产一区 | 欧美色图亚洲图片 | 久久观看免费视频 | 亚洲男男gⅴgay双龙 | 日韩a在线观看 | 波多野结衣资源 | 免费观看性生交大片3 | 久久免费美女视频 | 国产亚洲精品女人久久久久久 | 玖玖综合网 | 少妇bbr搡bbb搡bbb | 九九色网 | 91精品视屏 | 中文字幕91在线 | 一本色道久久综合亚洲二区三区 | 亚洲在线色 | 狠狠狠色丁香婷婷综合激情 | 99亚洲天堂| 波多野结衣资源 | 91激情视频在线 | 天天综合色网 | 国内外成人在线 | av资源在线观看 | 成人一级视频在线观看 | 不卡的av | 伊人电影在线观看 | 国产精品大片在线观看 | 免费在线观看的av网站 | 日韩一片| 一区二区三区四区精品视频 | 久久精品电影网 | 激情校园亚洲 | 国产一级二级三级视频 | 成年人黄色大片在线 | 国产群p| 欧美日韩国产高清视频 | 精品天堂av| 国产一区欧美在线 | 日本在线观看一区二区三区 | 国产色一区 | 国产精品久久麻豆 | 日韩在线观看不卡 | 日日夜夜精品免费 | 天天草夜夜 | 午夜电影一区 | 亚洲免费精品一区二区 | 波多野结衣电影久久 | 精品国产一区二区三区四区vr | 中文字幕乱视频 | 六月丁香激情网 | 亚洲视频在线观看 | 中文字幕在线资源 | 91久久丝袜国产露脸动漫 | 日韩国产精品毛片 | 国产一级视频在线 | 欧美成人按摩 | 成人av影视 | 成人毛片在线视频 | 久久视频在线视频 | 久久激情综合 | 日韩欧美视频一区二区三区 | 日本一区二区高清不卡 | a爱爱视频| 成人午夜剧场在线观看 | av片在线看 | 久久免费精品一区二区三区 | 精品九九九 | 婷婷色伊人 | 中文字幕免费高清在线观看 | 亚洲精品视频在线观看视频 | 国产一区二区三区高清播放 | 久久精品视频免费观看 | 午夜色大片在线观看 | 伊人国产在线播放 | 国产午夜精品一区二区三区 | 最新国产在线视频 | 黄色免费视频在线观看 | 久久久久免费精品国产小说色大师 | 日韩精品久久久免费观看夜色 | 日韩av电影一区 | 国产精品久久久久久高潮 | 久久精品老司机 | www夜夜操 | 日韩av资源在线观看 | 日韩高清片 | 91丨九色丨国产在线观看 | 日韩手机视频 | 日韩一区二区三区免费视频 | 精品国产成人 | 国产精品国产亚洲精品看不卡 | 欧美嫩草影院 | 国产中文字幕在线免费观看 | 国产热re99久久6国产精品 | 国产精品久久久久久一区二区三区 | 美女网站视频色 | 日韩一级黄色av | 69夜色精品国产69乱 | 波多野结衣理论片 | 久久国产精品一国产精品 | 国产视频中文字幕在线观看 | 色综合久久88色综合天天 | 日韩 在线a | www.国产在线观看 | 日韩理论片 | 久久久久黄 | 久久久久99精品国产片 | 欧美日本不卡 | 国产一区欧美在线 | 97香蕉超级碰碰久久免费软件 | 99re亚洲国产精品 | 成人久久18免费网站麻豆 | 色综合天天天天做夜夜夜夜做 | 少妇按摩av | 午夜久久久影院 | 欧美精品九九99久久 | 国产日韩欧美在线观看 | 国产一级免费电影 | 四虎影视成人永久免费观看视频 | 草樱av | 国内精品免费久久影院 | 91久久偷偷做嫩草影院 | 99久久国产免费,99久久国产免费大片 | 成年人黄色免费视频 | 天天干国产 | 日本三级人妇 | 国产精品毛片久久久久久久久久99999999 | 亚洲jizzjizz日本少妇 | 久久久久久久久久网站 | 久久免费99精品久久久久久 | 亚洲成av| 超碰电影在线观看 | 一区二区三区国产精品 | 天天草综合网 | 一区二区三区精品在线 | 精品久久久久久久久久久院品网 | 996久久国产精品线观看 | 夜又临在线观看 | 国产精品区在线观看 | 国产福利资源 | 久久久久亚洲精品成人网小说 | 91最新视频在线观看 | 奇米影视在线99精品 | 揉bbb玩bbb少妇bbb | 亚洲dvd| 在线免费高清视频 | 国产一区二区三区在线免费观看 | 伊人国产在线播放 | 久久久久亚洲最大xxxx | 五月综合色| 国产96在线视频 | 91香蕉视频好色先生 | 91伊人久久大香线蕉蜜芽人口 | 国产成人黄色 | 高清av中文在线字幕观看1 | 久久综合视频网 | 91九色网址| 天天干夜夜操视频 | 在线成人av | 久草资源免费 | 在线观看日韩视频 | 精品国产aⅴ一区二区三区 在线直播av | 久久综合久久综合九色 | 久久久在线视频 | 日韩久久精品一区 | 色婷五月天 | 超碰在线成人 | 亚洲伊人色 | 81精品国产乱码久久久久久 | 亚洲理论在线观看电影 | 亚洲综合欧美精品电影 | 日韩免费三区 | 不卡的av电影在线观看 | 国产短视频在线播放 | 日韩免费视频网站 | 激情亚洲综合在线 | 黄色在线观看网站 | 久久综合之合合综合久久 | 亚洲夜夜网 | 亚洲成人网在线 | 91av国产视频 | 81精品国产乱码久久久久久 | 麻豆免费在线视频 | 久久er99热精品一区二区三区 | 国产99久久99热这里精品5 | 一区av在线播放 | 麻豆94tv免费版 | 国内一级片在线观看 | 国产一区二区三区在线 | 手机av网站| 国产在线观看网站 | 久久国际影院 | av中文字幕免费在线观看 | 日韩va欧美va亚洲va久久 | 狠狠狠干狠狠 | 久久久国产99久久国产一 | 国产精品久久久久久久久久99 | 久久高清免费观看 | 欧美激情va永久在线播放 | 中文字幕av播放 | 久久综合九色综合欧美就去吻 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 欧美精品国产综合久久 | 亚洲一级电影在线观看 | 99热在线国产精品 | 精品国产伦一区二区三区观看体验 | 国产精品麻豆免费版 | av丝袜天堂 | 免费看片黄色 | 国产一区二区在线免费视频 | 亚洲一区二区三区在线看 | 欧美射射射 | 欧美激情精品久久久久久免费印度 | 国产精品一区二区在线观看免费 | 久久精品国产免费看久久精品 | 中文字幕资源站 | 午夜影院三级 | 伊色综合久久之综合久久 | 国产123区在线观看 国产精品麻豆91 | 亚州精品天堂中文字幕 | 久色 网| 精品国产精品一区二区夜夜嗨 | 在线黄色国产电影 | 欧美乱熟臀69xxxxxx | 中文字幕免费观看视频 | 日韩黄色网络 | www亚洲精品 | 免费在线观看国产黄 | 亚洲专区在线 | 亚洲一二三区精品 | 午夜电影久久 | 日韩在线电影一区二区 | 黄色大片日本 | 手机看片国产日韩 | 亚洲色视频 | 天天色天天上天天操 | 免费在线观看一级片 | 免费看特级毛片 | 日韩免费成人av | 日韩精品一区二区在线 | 国产亚洲精品久久19p | 久久久久北条麻妃免费看 | 亚洲三级影院 | 91看片黄色 | 玖玖在线观看视频 | 黄色aa久久 | 久久久精品久久 | 日韩二区在线观看 | 亚洲第五色综合网 | 久久精品成人欧美大片古装 | 国产成人一区二区三区 | 亚洲成人免费在线观看 | 在线观看成人小视频 | 99热在线观看免费 | 久久免费观看视频 | 91传媒视频在线观看 | 国产亚洲精品久久久久久无几年桃 | 五月天六月色 | 国产最新在线视频 | 国产精品免费人成网站 | www.超碰97.com | 综合久久一本 | 美女免费视频一区 | 麻豆传媒视频在线 | 成人网中文字幕 | 日日干影院 | 日韩啪啪小视频 | 97在线观| 日日夜夜艹 | av在线看片| 色视频在线看 | 国产中年夫妇高潮精品视频 | 亚洲精品美女久久久久网站 | 亚洲精色 | 国产高清小视频 | 亚洲精品资源在线观看 | 人人干人人搞 | 激情综合五月天 | 999日韩| 午夜久久久久久久久久影院 | 成人在线视频在线观看 | 97在线视频免费 | 91探花在线 | 日本激情动作片免费看 | 狠狠操天天射 | 亚洲激情六月 | 91麻豆视频网站 | 久久视频国产精品免费视频在线 | 丁香六月色 | 黄网站app在线观看免费视频 | 日本不卡视频 | 波多野结衣一区二区三区中文字幕 | 欧美一区二区日韩一区二区 | 免费看的黄色的网站 | 久久免费电影 | 国产一卡在线 | 青青河边草免费观看 | 久草久草在线 | 国产精品扒开做爽爽的视频 | 午夜999| 免费人成网 | 婷婷中文字幕综合 | 好看的国产精品视频 | 国内一区二区视频 | 天天色天天爱天天射综合 | 日韩一区二区三区高清免费看看 | 丁香 久久 综合 | 国产精品美女久久久久久久久 | 91精品视频网站 | 久久久www成人免费毛片 | 三级视频片 | 久久精品久久久精品美女 | 国产小视频在线看 | 97在线观看视频国产 | 91成人亚洲 | 国产视频在线观看一区 | 日韩三级精品 | 欧美国产亚洲精品久久久8v | 99久久这里有精品 | 成人亚洲精品国产www | 欧美性护士 | 久久99国产精品自在自在app | 久亚洲精品| 久久精品国产v日韩v亚洲 | 日本爱爱免费 | 亚洲 综合 国产 精品 | 亚洲精品1区2区3区 超碰成人网 | 啪一啪在线 | 久久亚洲电影 | 国产在线a视频 | 欧美激情精品久久久 | 超碰人人草 | 99精品久久久久久久久久综合 | 亚洲婷婷伊人 | 国产精品日韩高清 | 久操视频在线播放 | 丝袜足交在线 | japanesexxxhd奶水 国产一区二区在线免费观看 | 欧美福利片在线观看 | 亚洲三级在线免费观看 | 色视频在线 | 亚洲欧美日本一区二区三区 | 久久午夜国产 | 最近中文字幕久久 | 女人18片 | 永久中文字幕 | 日日干天天 | 久久久激情网 | 99精品国产一区二区三区麻豆 | 91成人免费看片 | 五月婷网站 | 毛片网站观看 | 久久国产手机看片 | 97夜夜澡人人爽人人免费 | 97超碰总站 | 婷婷色网址 | 亚洲最大激情中文字幕 | 欧美精品九九99久久 | 国产91精品一区二区麻豆网站 | 久久成年人视频 | aav在线| 在线免费三级 | 亚洲天堂网在线播放 | 91最新中文字幕 | 成人免费视频播放 | 天天爽天天爽天天爽 | 久久久久久片 | 成片免费观看视频999 | 国产一区在线视频播放 | 在线免费观看黄 | 久久人人爽av | 久久试看 | 天天爱综合 | 国产成人综合在线观看 | 色在线免费观看 | 久久久毛片| 超碰人人做| 日韩欧美在线观看 | 国产在线专区 | 久久久999精品视频 国产美女免费观看 | 免费国产视频 | 在线免费av观看 | 天天色天天爱天天射综合 | 狠狠躁日日躁狂躁夜夜躁av | 中文字字幕在线 | 欧美一二区视频 | 欧美一区二区在线刺激视频 | 亚洲国产黄色片 | 国产一级特黄毛片在线毛片 | 国产精品91一区 | 蜜臀av性久久久久蜜臀av | 国产精品99久久久久久有的能看 | 欧美一级视频在线观看 | 综合久久五月天 | 色婷婷88av视频一二三区 | 色资源二区在线视频 | 视频成人免费 | 国产xx在线 | 丁香花中文在线免费观看 | 成人av在线亚洲 | 亚洲精品91天天久久人人 | 五月开心激情网 | 久久调教视频 | 91精品国产综合久久福利不卡 | 久久国产精品久久国产精品 | 亚洲精品在线免费 | 欧美日韩高清在线观看 | 久久久午夜精品理论片中文字幕 | 国内精品美女在线观看 | 丁香综合激情 | 精品亚洲一区二区三区 | 国产精品美女久久久久久久 | 久久综合狠狠综合久久狠狠色综合 | 丁香婷婷综合五月 | 曰韩精品| 日韩理论影院 | 黄色视屏在线免费观看 | 毛片精品免费在线观看 | 日韩中文在线观看 | 九九精品毛片 | 久久久久久久av麻豆果冻 | 日韩免费一区二区在线观看 | 色综合久久久久综合 | 免费人成网ww44kk44 | 在线91播放| 欧美日韩国产网站 | 国精产品满18岁在线 | 亚洲日日日 | 99r精品视频在线观看 | 国产一区二区成人 | 成人亚洲精品久久久久 | 久久精品福利视频 | 一区二区三区在线视频观看58 | 午夜电影一区 | 日韩精品在线观看av | 国产精品欧美一区二区三区不卡 | 色网站在线 | 欧美精品中文在线免费观看 | 日韩在线一区二区免费 | 久久精品中文字幕免费mv | 91丨九色丨国产在线观看 | 成年人免费av网站 | 中国一级特黄毛片大片久久 | 五月激情在线 | 国产精品麻豆视频 | 国产中文自拍 | 国产偷国产偷亚洲清高 | 欧美精品一区二区蜜臀亚洲 | 欧美激情精品久久久久久免费 | 中文字幕视频在线播放 | 精品1区2区3区 | 99久久精品电影 | 国产一级在线播放 | 中文字幕国产精品一区二区 | 国产精品成人自产拍在线观看 | 亚洲精品激情 | 天天插天天干天天操 | 丁香电影小说免费视频观看 | 中文字幕在线免费 | 97超碰精品 | 精品视频在线免费观看 | 99热国产在线中文 | 韩日电影在线免费看 | 91精品国产自产在线观看 | 欧美日韩在线免费观看视频 | 超碰97在线资源站 | 97国产大学生情侣白嫩酒店 | 久久草 | 国产乱码精品一区二区蜜臀 | 亚洲人人精品 | 欧美日韩18 | 色五丁香 | 亚洲免费av片 | 最近能播放的中文字幕 | 婷香五月| 久草电影在线观看 | 亚洲视频第一页 | 免费在线激情电影 | 日韩免费观看高清 | 中文在线字幕观看电影 | 欧美a在线看 | 九九视频在线观看视频6 | 狠狠色狠狠色综合日日小说 | 国产一二三区av | 国产黄色一级片在线 | 中文字幕亚洲欧美日韩 | 97在线免费视频观看 | 有码一区二区三区 | 麻豆视频成人 | 国产男女无遮挡猛进猛出在线观看 | 欧美国产日韩一区二区三区 | 国产精品a久久 | 亚洲精品久久久久久久不卡四虎 | 久久6精品 | 99视频这里只有 | 人人爽人人澡 | 国产视频在线观看一区 | 高清av在线 | 久久福利小视频 | www.久艹| 黄色大片日本免费大片 | 久热国产视频 | 在线观看视频你懂得 | 免费a现在观看 | 人人干人人超 | 特级毛片在线免费观看 | 97成人在线免费视频 | 成人av免费在线播放 | 国产精品一区在线播放 | 99国产在线观看 | 91精品视频免费观看 | 久久精品一区二区三区国产主播 | 免费精品在线视频 | 成人av资源在线 | 欧产日产国产69 | 久久99深爱久久99精品 | 国产精品国产三级国产aⅴ9色 | 888av| 欧美三级免费 | 最新高清无码专区 | 色婷婷精品大在线视频 | 久久黄色精品视频 | 丁香婷婷久久久综合精品国产 | 国产成人一区二区三区久久精品 | 久久综合视频网 | 中文字幕 二区 | 国产精品成人久久久 | 女人18毛片a级毛片一区二区 | 丁香花中文在线免费观看 | 青草视频在线播放 | 91在线麻豆| 又大又硬又黄又爽视频在线观看 | 欧美 日韩 国产 成人 在线 | 字幕网资源站中文字幕 | 亚洲在线网址 | 91久久偷偷做嫩草影院 | 色综合天天狠狠 | 久久久 精品| 狠狠操精品 | 黄色软件在线观看 | 午夜av不卡 | 日韩电影在线观看一区二区三区 | 久久天天操 | 黄色特级毛片 | 国产精品久久久久久久久久久久午 | 中文字幕网站视频在线 | 国产精品一区二区av日韩在线 | 国产系列精品av | 午夜av在线电影 | 97在线看 | 99re6热在线精品视频 | 日本丰满少妇免费一区 | 中文字幕精品一区二区精品 | 国产在线视频不卡 | 91香蕉视频好色先生 | 久久视频网址 | 99这里只有久久精品视频 | 午夜久久福利影院 | 四虎www | 久久久高清视频 | 日本黄色大片免费看 | 国产成人精品久 | 又黄又爽又湿又无遮挡的在线视频 | 麻豆视频在线播放 | 欧美日韩在线免费观看 | 亚洲精品资源在线观看 | 国产精品美女久久久久久久久久久 | 国产成人一区二区精品非洲 | 免费在线观看av网址 | 999在线视频 | 91在线公开视频 | 久视频在线 | 亚洲精品黄色在线观看 | 成人在线免费小视频 | 成人午夜电影在线播放 | 欧美三级高清 | 日韩欧美在线观看一区二区 | 色综合久久久久久中文网 | 日韩av资源在线观看 | 伊人中文字幕在线 | 久久精品视频在线观看免费 | 日韩免费在线观看 | 国产一区二区视频在线 | 最近乱久中文字幕 | 免费三级网 | www99久久| 亚洲一二三久久 | 欧美精选一区二区三区 | 国产欧美综合在线观看 | 国产中文字幕一区二区三区 | 亚洲国产精品成人女人久久 | 夜夜天天干 | 日韩二区在线播放 | 婷婷六月天丁香 | 久久的色 | 91麻豆产精品久久久久久 | 在线 精品 国产 | 精品久久久影院 | 久草视频免费播放 | 欧美精品一区在线 | 欧美另类xxx| 亚洲色图美腿丝袜 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 久久99这里只有精品 | 色婷婷av一区二 | 精品国产电影一区二区 | av在线看片 | 91日韩在线视频 | 在线播放精品一区二区三区 | 婷婷六月丁香激情 | 欧美日韩国产一区二 | 日本中文字幕在线电影 | 日本黄色免费在线观看 | 日韩在线视频网站 | www.在线观看视频 | 91桃色视频 | 欧美日韩精品综合 | 成人一区二区三区中文字幕 | 成年人电影免费在线观看 | 欧美少妇xxx| 黄色av影院 | 久久久久久久久久久免费av | 国产精品入口a级 | 美女网站免费福利视频 | 日韩中字在线 | 奇米网在线观看 | 色资源网免费观看视频 | 在线视频1卡二卡三卡 | 久草精品资源 | 久久激情五月婷婷 | 国产精彩视频一区 | 亚洲高清在线观看视频 | 九九综合九九 | 国产午夜精品久久 | 欧美中文字幕第一页 | 99欧美| 天天爽天天做 | 午夜视频在线观看一区二区三区 | 99久久精品免费看国产麻豆 | 色网站免费在线看 | 久草在线91| 97视频免费观看2区 亚洲视屏 | 国产在线一线 | 丁香六月婷婷综合 | av导航福利 | 天天爱天天草 | 在线影视 一区 二区 三区 | 激情视频区 | 99热这里只有精品免费 | av在线免费观看网站 | 国产福利一区二区在线 | 欧美在线观看视频一区二区三区 | 亚洲欧美成人网 | 日韩专区视频 | 国产精品综合久久久久久 | 日日天天av | 四季av综合网站 | 国产精品久久9 | 五月激情亚洲 | 国产999精品久久久久久麻豆 | 亚洲亚洲精品在线观看 | 久久久人人爽 | 色综合久久久久综合体 | 91精品久久久久久久久久入口 | 手机av在线网站 | 日韩大片在线 | 国产亚洲在线视频 | 亚洲码国产日韩欧美高潮在线播放 | 欧美视频不卡 | 久久躁日日躁aaaaxxxx | 久久久免费毛片 | 91在线视频在线观看 | 亚洲免费av电影 | 蜜臀久久99精品久久久无需会员 | 四虎在线观看精品视频 | 成人a免费看 | 国产精品成人免费一区久久羞羞 | 一区二区三区免费在线观看视频 | av电影中文 | 精品国内自产拍在线观看视频 | 96精品视频 | 日韩欧美在线综合网 | 亚洲永久精品视频 | 日韩精品在线一区 | 国产69精品久久99不卡的观看体验 | 999在线观看视频 | 成人一级片视频 | 午夜精品电影一区二区在线 | 狠狠狠色丁香综合久久天下网 | 999亚洲国产996395 | 国产美女被啪进深处喷白浆视频 | 97人人艹 | 黄色aaa级片 | 国内三级在线 | 久久亚洲精品国产亚洲老地址 | 亚洲欧美日本一区二区三区 | 狠狠搞,com| 亚洲精品乱码白浆高清久久久久久 | 国产一区二区三区网站 | 激情久久小说 | 色综合色综合色综合 | 九九九在线观看 | 99爱在线观看 | 中文字幕日本在线观看 | 不卡av在线| 日韩精品欧美专区 | 亚洲黄色成人 | 最新av网址在线 | 很污的网站 | 欧美精品免费视频 | 九九视频免费在线观看 | 日韩精品免费在线视频 | 欧美日产在线观看 | 在线精品亚洲一区二区 | 国产精品久久久久久久久毛片 | a色视频| 日韩一级片网址 | 亚洲一区二区三区四区在线视频 | 久久久久久久久久福利 | 欧美日一级片 | 午夜精品一区二区三区免费 | 国产精品区在线观看 | 日韩激情片在线观看 | 四虎成人精品在永久免费 | 91视频高清免费 | 久久久 精品 | 91爱在线| 亚洲精品国精品久久99热一 | 久久女教师 | 国产成人久久精品77777综合 | 亚洲精品乱码 | 国产精品久久久久久999 | 国产999精品久久久影片官网 | 国产资源精品在线观看 | av在线网站观看 | 国产日韩欧美视频在线观看 | 国产精品淫片 | 国产美女精品在线 | 久久国语 | 日韩精品久久久 | 日韩一区二区三区高清在线观看 | 国产免费成人 | 91九色在线视频 | 69精品视频| 视频在线一区二区三区 | 在线视频麻豆 | www九九热| 麻豆久久精品 | 国产在线色视频 | 久草成人在线 | 国产录像在线观看 | 99久久精品免费看 | 在线久草视频 | 一区二区精品国产 | 91av官网| 中文字幕久久久精品 | 99热这里只有精品在线观看 | 婷婷色网视频在线播放 | 国产精品第10页 | 国产黄色视 | 日本黄色免费网站 | 国产精品高潮在线观看 | 岛国精品一区二区 | 国产你懂的在线 | 91丨九色丨蝌蚪丨老版 | 中文不卡视频在线 | 久久99精品国产一区二区三区 | 精品欧美小视频在线观看 | 精品一区中文字幕 | 在线观看国产区 | 国产精品剧情 | 丁香婷婷久久久综合精品国产 | 在线观看va | 亚洲精品a区 | 色狠狠婷婷 | 在线视频99 | 91探花在线| 国产黑丝一区二区 | 成人国产精品一区二区 | 国产一在线精品一区在线观看 | 在线观看国产一区二区 | 欧美在线1区 | 五月天综合色 | 久草在线免费看视频 | 久久精品首页 | 亚洲国产精品久久久久久 | av电影久久 | 欧美精品久久久久久久久老牛影院 | 97在线观看免费 | www.亚洲黄 | 深爱开心激情网 | 免费观看日韩av | 玖玖在线观看视频 | av电影中文字幕在线观看 | 久久国产精品视频 | 制服丝袜成人在线 | 高清国产在线一区 | 国产香蕉久久精品综合网 | 天天天天综合 | 日韩专区 在线 | 免费视频99 | 婷婷六月网 | 极品美女被弄高潮视频网站 | 涩涩成人在线 | 国产人成在线观看 | 日韩三级在线观看 | 99久久精品国产一区二区三区 | 亚洲人成人天堂h久久 | 四虎国产精品永久在线国在线 | 日韩色在线观看 | 综合网五月天 | 久久综合狠狠综合久久综合88 | 亚洲国产97在线精品一区 | 婷婷亚洲五月 | 国产一区二区三区视频在线 | 国产高清久久久久 | 亚洲三级在线播放 | 日韩一区二区三免费高清在线观看 | 成人av在线资源 | 97视频中文字幕 | 国产一区二区三精品久久久无广告 | 久久综合九色综合97_ 久久久 | 性色av一区二区三区在线观看 | 超碰人人舔 | 91精品国自产在线观看欧美 | 日本一区二区三区视频在线播放 | 成人黄色av免费在线观看 | 免费成人在线观看 | 天天舔天天射天天操 | 毛片视频网址 | 成人午夜黄色影院 | 激情婷婷av| 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 国产在线观看污片 | 色综合 久久精品 | 欧美精品一区二区蜜臀亚洲 | 日韩簧片在线观看 | 九九热精品在线 | 天天插视频 | 日韩高清国产精品 | 可以免费看av | 婷婷伊人综合 | 欧美激情视频一区 | 欧美极品裸体 | 亚洲九九爱 | 911精品视频 | 国产黄色高清 | 丰满少妇对白在线偷拍 | 国产成人一区二区三区在线观看 | 黄色特级一级片 | 精品99视频 | 日本护士三级少妇三级999 | 麻豆成人网 | 久久美女视频 | 婷婷色吧 | 成人影片在线播放 | 欧美成人按摩 | 亚洲国产中文字幕 | 91少妇精拍在线播放 | 日韩久久精品一区二区 | 97色资源| 精品久久久久久一区二区里番 | 日韩欧美在线综合网 | 欧美日韩视频一区二区三区 | 日韩欧美电影 | av在线超碰| 九九热.com | 国产成人一区二区三区久久精品 | 99久久er热在这里只有精品66 | 国产亚洲视频在线免费观看 | a亚洲视频 | 九九九毛片 | 激情综合电影网 | 久草在线久草在线2 | 日本h视频在线观看 | 久99久精品视频免费观看 | 奇米影视777四色米奇影院 | 丝袜av一区 | 一级一片免费看 | 亚洲免费一级 | 激情五月色播五月 | 91丨九色丨首页 | 婷婷色吧| 波多野结衣在线播放一区 | 99久免费精品视频在线观看 | 91精品国产高清自在线观看 | 日韩一级理论片 | 日韩午夜视频在线观看 | 中午字幕在线观看 | 性色av免费看 | 97夜夜澡人人爽人人免费 | 久久不卡免费视频 | 在线网站黄 | 中文字幕乱在线伦视频中文字幕乱码在线 | 婷婷激情5月天 | 人人看看人人 | 美女网站黄免费 | 免费在线精品视频 | 97色婷婷成人综合在线观看 | 四虎成人精品在永久免费 | 国产一区二区三区高清播放 | 91香蕉视频色版 | 超碰97人人射妻 | 天天操天天射天天插 | 欧美日韩在线第一页 | 成年人精品 | 欧美性大战 | 欧美日韩国产精品一区二区三区 | av看片在线观看 | 一区二区三区av在线 | 欧美成人h版电影 | 91av原创 | 国产高清在线看 | 男女视频久久久 | 一区二区三区中文字幕在线 | 91久久国产自产拍夜夜嗨 | 免费av试看| www.黄色小说.com| 国产1区在线观看 | 久久午夜精品 | 免费情趣视频 | 国产精品一区二区精品视频免费看 | 激情丁香 | 精品 激情 | 丁香婷婷电影 | 免费能看的黄色片 | 亚洲黄色大片 | 欧洲视频一区 | 国产精品久免费的黄网站 | 91日韩精品视频 | 91黄视频在线 | 国产精品久久久一区二区 | 国产偷国产偷亚洲清高 | 国产精品久久久久久久av电影 | 成人午夜网址 | 国产精品久久久久久婷婷天堂 | 久久成 | 国产日产亚洲精华av | 91网在线看 | 69欧美视频 | 久草色在线观看 | 色狠狠久久av五月综合 | 免费久久网站 | 久久精选 | 久久不射电影网 | 97理论电影 | 狠狠色丁香婷婷综合 | 国产中文在线播放 | 精品国产亚洲日本 | 99九九免费视频 | 播五月综合 | 成年人在线免费视频观看 | 色偷偷男人的天堂av | 亚洲成av人片 | 欧美成人在线免费 | 久久国产三级 | 少妇啪啪av入口 | 偷拍区另类综合在线 | 永久免费的啪啪网站免费观看浪潮 | 一级片黄色片网站 | 久久综合欧美精品亚洲一区 | 国产一区视频在线观看免费 | 亚洲国产精品久久久久 | 激情久久久久 | 国产黄av| 三级黄色欧美 | 亚洲精品在线视频 | 久久福利电影 | 国产偷国产偷亚洲清高 | 91超碰免费在线 | 波多野结衣在线观看视频 | 人人揉人人揉人人揉人人揉97 | 伊人亚洲综合 | 欧美国产日韩一区二区三区 | 色噜噜狠狠狠狠色综合久不 | 日日操夜 | 国产在线精品一区二区三区 | 狠狠色丁香婷综合久久 | 日韩啪啪小视频 | 精品网站999www| 夜夜嗨av色一区二区不卡 | 992tv又爽又黄的免费视频 | 国产伦理一区二区 | 婷婷久草 | 欧美性猛片 | 就要干b| 天堂成人在线 | 热久久精品在线 | a在线免费 |