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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java垃圾收集机制

發(fā)布時(shí)間:2023/11/30 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java垃圾收集机制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文是《深入理解Java虛擬機(jī)》一書中第三章的讀書總結(jié)。

前面介紹了Java內(nèi)存結(jié)構(gòu)和HotSpot虛擬機(jī)在堆內(nèi)存中管理對象的過程。不過,在Java程序中對象的創(chuàng)建是非常頻繁的,而內(nèi)存的大小又是有限的,為了內(nèi)存的重復(fù)利用,就需要對內(nèi)存中的對象進(jìn)行垃圾收集。其實(shí),這也是Java和C++的一個(gè)區(qū)別,在Java中可以進(jìn)行自動的垃圾收集,而C和C++中需要程序員手動回收不再使用的對象。

Java中的垃圾收集是虛擬機(jī)要考慮的問題。那么以虛擬機(jī)的角度考慮,如果要收集虛擬機(jī)內(nèi)存中的垃圾,需要考慮哪些問題呢?

  • Java虛擬機(jī)中的內(nèi)存分為程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧、Java堆和方法區(qū)等幾部分,在哪些部分回收內(nèi)存呢?
  • 確定了要回收的內(nèi)存,內(nèi)存中必然存在著很多內(nèi)容,如何判定這些內(nèi)容就是不需要的垃圾了呢?
  • 程序不斷運(yùn)行,垃圾收集不可能也隨著程序一直運(yùn)行,那什么時(shí)候進(jìn)行垃圾收集操作呢?
  • 最重要的問題是,怎么回收?

Java的垃圾收集機(jī)制是一個(gè)挺復(fù)雜的過程,涉及到的內(nèi)容也很多,上面的問題一個(gè)一個(gè)解決。

1、回收區(qū)域

在前面幾篇中可以知道,Java內(nèi)存中的程序計(jì)數(shù)器、虛擬機(jī)棧和本地方法棧是線程私有的,線程結(jié)束也就沒了。其中程序計(jì)數(shù)器負(fù)責(zé)指示下一條指令,棧中的棧幀隨著方法的進(jìn)入和退出不停的入棧出棧。每一個(gè)棧幀的大小在編譯時(shí)就基本已經(jīng)確定。所以這幾個(gè)區(qū)域就不需要考慮內(nèi)存回收,因?yàn)榉椒ńY(jié)束或線程停止,內(nèi)存就回收了。

和上述三個(gè)區(qū)域不同的是,Java堆和方法區(qū)是線程共享的。在Java堆中存放著所有線程在運(yùn)行時(shí)創(chuàng)建的對象,在方法區(qū)中存放著關(guān)于類的元數(shù)據(jù)信息。我們在程序運(yùn)行時(shí)才能確定需要加載哪些類的元數(shù)據(jù)信息到方法區(qū),創(chuàng)建哪些對象到堆中,也就是說,這部分的內(nèi)存分配和回收都是動態(tài)的。也因?yàn)檫@樣,這兩個(gè)部分是垃圾收集器所關(guān)注的地方。

2、誰才是垃圾?

首先考慮一下存放對象的Java堆。

程序中創(chuàng)建的對象絕大多數(shù)都會在Java堆中,而程序的運(yùn)行也會創(chuàng)建大量的對象。但這些對象并不總是使用,這樣就產(chǎn)生了一些不會再使用的垃圾。這些垃圾占據(jù)著寶貴的內(nèi)存空間,所以需要回收這些空間。不過,怎么才能確定堆中的對象是垃圾呢?

一種常見的算法是引用計(jì)數(shù)算法,它基于這樣的考慮,給對象添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器的值就加1;當(dāng)引用實(shí)效時(shí),計(jì)數(shù)器的值就減1。當(dāng)計(jì)數(shù)器的值為0時(shí),對象就不可能再被使用。

引用計(jì)數(shù)算法實(shí)現(xiàn)簡單,判定效率也高。不過,主流的Java虛擬機(jī)中并沒有使用引用計(jì)數(shù)算法來管理內(nèi)存,因?yàn)檫@個(gè)算法很難解決對象之間相互循環(huán)引用的問題。

考慮下面的代碼:

public class ReferenceCountingGC {public Object instance=null;private static final int _1mb=1024*1024;@SuppressWarnings("unused")private byte[] bigSize=new byte[2*_1mb];public static void testGC() {ReferenceCountingGC objA=new ReferenceCountingGC();ReferenceCountingGC objB=new ReferenceCountingGC();objA.instance=objB;objB.instance=objA;objA=null;objB=null;System.gc();}public static void main(String[] args) {ReferenceCountingGC.testGC();} }
ReferenceCountingGC類中有一個(gè)實(shí)例對象,在測試代碼中構(gòu)造的兩個(gè)對象objA和objB在instance實(shí)例對象上互相引用。這樣,每個(gè)對象的引用計(jì)數(shù)都是2,當(dāng)兩個(gè)對象都賦值為null時(shí),引用計(jì)數(shù)減1變?yōu)?,按照引用計(jì)數(shù)算法這不是垃圾。但是,很明顯這兩個(gè)對象已經(jīng)不能再被訪問到了,這就是垃圾。實(shí)際上,運(yùn)行之后Java虛擬機(jī)將這兩個(gè)對象作為垃圾回收掉了。

那么Java中使用的是什么方法呢?是可達(dá)性分析算法(Reachability Analysis)。

可達(dá)性分析算法的基本思想是通過一系列稱為“GC Roots”的對象作為起始點(diǎn),從這些節(jié)點(diǎn)開始向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain),當(dāng)一個(gè)對象到GC Roots沒有任何引用鏈相連時(shí),即從GC Roots到這個(gè)對象不可達(dá),就說明這個(gè)對象是不可用的。如下圖,左面的四個(gè)對象都有引用鏈到GC Roots,因此是可用的;右面的三個(gè)對象到GC Roots不可達(dá),所以是不可用的。


在Java中,下面幾種對象可以作為GC Roots:

  • 虛擬機(jī)棧(棧幀中的本地變量表)中引用的對象;
  • 方法區(qū)中類靜態(tài)屬性引用的對象;
  • 方法區(qū)中常量引用的對象;
  • 本地方法棧中JNI(即Native方法)引用的對象;

其實(shí)這兩種方法都涉及到了對象的引用,也就是說對象是否是垃圾都與引用有關(guān),因此有必要全面的理解一下Java中的引用。

其實(shí)Java中的引用一共有四種。這是JDK 1.2 之后對引用概念的擴(kuò)充,分別是強(qiáng)引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)和虛引用(Phantom Reference),這四種引用的強(qiáng)度依次逐漸減弱。

(1)強(qiáng)引用

強(qiáng)引用就是程序中普遍存在的,類似“Object obj=new Object()”這類的引用,只要強(qiáng)引用還存在,垃圾回收器就不會回收被引用的對象。

(2)軟引用

軟引用用來描述一些還有用但不是必須的對象。對于軟引用關(guān)聯(lián)的對象,在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前,將會把這些對象列入回收范圍進(jìn)行第二次回收。如果這次回收還沒有足夠的內(nèi)存,才會拋出內(nèi)存溢出異常。SoftReference類來實(shí)現(xiàn)軟引用。

(3)弱引用

弱引用也用來描述非必須的對象,但是強(qiáng)度比軟引用還弱,被引用的對象只能存活到下一次垃圾收集之前。當(dāng)下一次垃圾收集器工作時(shí),不論內(nèi)存是否足夠,都會回收這些對象。WeakReference類實(shí)現(xiàn)了弱引用。

(4)虛引用

虛引用是最弱的一種引用,也叫幽靈引用或幻影引用。一個(gè)對象是否有虛引用存在不會對其生存時(shí)間產(chǎn)生影響,也無法通過虛引用來取得一個(gè)對象實(shí)例。虛引用的唯一目的就是當(dāng)被虛引用關(guān)聯(lián)的對象被收集器收集時(shí)收到一個(gè)系統(tǒng)通知。PhantomReference類實(shí)現(xiàn)了虛引用。

3、垃圾也有可能變廢為寶

垃圾也有可能變廢為寶然后再利用呢。其實(shí),即使在可達(dá)性分析算法中不可達(dá)的對象,也并非是“非死不可”的,要真正認(rèn)為一個(gè)對象是垃圾要收集,至少要經(jīng)過兩次標(biāo)記過程:如果對象在進(jìn)行可達(dá)性分析后發(fā)現(xiàn)不可達(dá),那么就將它進(jìn)行第一標(biāo)記并進(jìn)行一次篩選,篩選的條件是這個(gè)對象是否有必要執(zhí)行finalize()方法。當(dāng)對象沒有覆蓋finalize方法,或finalize方法已經(jīng)被虛擬機(jī)執(zhí)行過了,虛擬機(jī)任何沒有必要執(zhí)行finalize方法。

如果這個(gè)對象被判定為有必要執(zhí)行finalize方法,那么這個(gè)對象會放置在一個(gè)叫做F-Queue的隊(duì)列中,并在稍后由一個(gè)由虛擬機(jī)自動建立的、低優(yōu)先級的Finalizer線程去執(zhí)行。不過虛擬機(jī)只是會觸發(fā)這個(gè)方法,但不承諾會等待執(zhí)行完畢,這是因?yàn)?#xff0c;如果一個(gè)對象的finalize方法執(zhí)行緩慢,或發(fā)生了死循環(huán),就會導(dǎo)致F-Queue對象中的其他對象處于等待,甚至整個(gè)垃圾收集系統(tǒng)崩潰。稍后GC會在F-Queue中的對象進(jìn)行第二次小規(guī)模的標(biāo)記,如果這時(shí)標(biāo)記為可達(dá),就可以不被收集;如果仍然不可達(dá),那么就被標(biāo)記為垃圾了。具體的流程圖如下:


下面的代碼演示了上面所說的內(nèi)容。

public class FinalizeEscapeGC {public static FinalizeEscapeGC SAVE_HOOK=null;public void isAlive(){System.out.println("yes,i am still alive.");}protected void finalize()throws Throwable{super.finalize();System.out.println("finalize method executed!");FinalizeEscapeGC.SAVE_HOOK=this;}public static void main(String[] args) throws InterruptedException {SAVE_HOOK=new FinalizeEscapeGC();SAVE_HOOK=null;System.gc();Thread.sleep(500);if(SAVE_HOOK!=null){SAVE_HOOK.isAlive();}else{System.out.println("no,i am dead.");}SAVE_HOOK=null;System.gc();Thread.sleep(500);if(SAVE_HOOK!=null){SAVE_HOOK.isAlive();}else{System.out.println("no,i am dead.");}} }
結(jié)果如下:


FinalizeEscapeGC類覆蓋了finalize方法,所以在GC將SAVE_HOOK第一次標(biāo)記為垃圾后的篩選中認(rèn)為finalize有必要執(zhí)行。在覆蓋的finalize方法中,將自己賦值給了類的變量SAVE_HOOK,成功拯救自己,第一次沒有被收集。但是第二次雖然代碼相同,但是由于虛擬機(jī)已經(jīng)執(zhí)行過finalize方法了,GC不認(rèn)為有必要執(zhí)行,在第二次標(biāo)記中也標(biāo)記為垃圾,所以沒有能拯救自己,被當(dāng)做垃圾收集了。

4、回收方法區(qū)

除了Java堆,方法區(qū)中也存在垃圾收集。只不過這里的收集效率比較低。

方法區(qū),在HotSpot虛擬機(jī)中叫永久代,GC收集兩部分內(nèi)容,廢棄常量和無用的類。收集廢棄常量與收集Java堆中的對象類似。以常量池中字面量的收集為例,假如一個(gè)字符串“ABC”已經(jīng)在常量池中,但是當(dāng)前系統(tǒng)中沒有任何一個(gè)String對象是“ABC”,即沒有對象引用常量池中的“ABC”,也沒有其他地方引用了這個(gè)字面量,如果這時(shí)發(fā)生內(nèi)存回收,而且必要的話,“ABC”就會被清理出常量池。常量池中的其他類(接口)、方法和字段的符號引用也類似。

不過要判斷一個(gè)類是否無用就麻煩很多了。要同時(shí)滿足如下三個(gè)條件一個(gè)類才是無用的類:

  • 該類的所有實(shí)例都已經(jīng)被回收,也就是Java堆中不存在該類的任何的實(shí)例;
  • 加載該類的ClassLoader已經(jīng)被回收;
  • 該類對應(yīng)的java.lang.Class對象沒有在任何地方被引用,無法在任何地方通過反射訪問到該類的方法。
  • 滿足上面的三個(gè)條件,虛擬機(jī)就可以回收。不過,對于HotSpot虛擬機(jī)來說,是否回收通過-Xnoclassgc參數(shù)來設(shè)置。

    5、垃圾收集算法

    現(xiàn)在我們知道了在哪里收集垃圾以及如何判定一個(gè)對象是否是垃圾。接下來就要考慮如何收集垃圾,即垃圾收集算法。不過由于垃圾收集算法涉及到大量的程序細(xì)節(jié),所以這里僅僅介紹算法的基本思想及其發(fā)展過程。

    (1)標(biāo)記-清除算法

    標(biāo)記-清除(Mark-Sweep)算法是最基礎(chǔ)的收集算法,算法名字表明這個(gè)算法的垃圾收集過程包括兩步:標(biāo)記和清除。前面介紹的判定垃圾的過程就是標(biāo)記過程,在標(biāo)記過后的清除過程中會清理標(biāo)記為垃圾的對象。后序的垃圾收集算法都是在這個(gè)算法的基礎(chǔ)上改進(jìn)而成的。這個(gè)算法有兩個(gè)不足:一個(gè)就是標(biāo)記和清除的效率不高;第二個(gè)是空間問題,標(biāo)記清除后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多的話可能導(dǎo)致以后分配大塊內(nèi)存時(shí)失敗的問題,這樣就會觸發(fā)另一次垃圾收集操作。算法的執(zhí)行過程如下圖:


    (2)復(fù)制算法

    復(fù)制算法是為了解決標(biāo)記-清除算法效率不高的問題的,它將可用內(nèi)存按照容量分為大小相等的兩部分,每次只使用其中的一塊。當(dāng)一塊的內(nèi)存用完了,就將還存活的對象復(fù)制到另一塊,然后再把已經(jīng)使用過的內(nèi)存空間一次性清理掉。這樣使得每次是對整個(gè)半?yún)^(qū)進(jìn)行內(nèi)存回收,內(nèi)存分配時(shí)也不需要考慮內(nèi)存碎片的問題,只要移動堆頂指針,按順序進(jìn)行分配就好。算法的執(zhí)行過程如下圖:


    不過這個(gè)算法使得內(nèi)存只能一半能用,代價(jià)太高了。現(xiàn)在的虛擬機(jī)都采用這種方法來回收新生代,不過不是1:1分配的,而是將堆內(nèi)存分為以塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和一個(gè)Survivor空間。當(dāng)回收時(shí),將Eden和Survivor中還存活的對象復(fù)制到另一塊Survivor中,然后清理Eden和使用過的Survivor空間。HotSpot虛擬機(jī)默認(rèn)的Eden和Survivor比例是8:1,即Eden占堆的80%空間,Survivor占10%的空間,每次只能使用90%的堆空間。

    不過,我們并不能保證每次回收只有不多于10%的對象存活,當(dāng)Survivor空間不夠時(shí),需要使用其他內(nèi)存空間(老年代)進(jìn)行分配擔(dān)保,即如果Survivor空間不夠,存活的對象直接進(jìn)入老年代。

    (3)標(biāo)記-整理算法

    復(fù)制收集算法在對象存活率較高時(shí)就需要進(jìn)行較多的復(fù)制操作,效率就會降低。更關(guān)鍵的是,如果不想浪費(fèi)50%的空間,就需要有額外的空間進(jìn)行分配擔(dān)保,以應(yīng)對被使用的內(nèi)存中所有對象都存活的極端情況,所以在老年代中一般不使用這種算法。

    根據(jù)老年代的特點(diǎn),可以使用另一種標(biāo)記-整理(Mark-Compact)算法,標(biāo)記過程和標(biāo)記-清除算法一樣,但后續(xù)步驟不是直接對可回收對象進(jìn)行清理,而是整理存活的對象,將存活的對象都向一端移動,然后直接清理掉邊界外的內(nèi)存。算法的執(zhí)行過程如下:


    這樣,也沒有了內(nèi)存碎片的問題。

    (4)分代收集算法

    現(xiàn)在的虛擬機(jī)都使用“分代收集”算法,這種算法只是根據(jù)對象的存活周期的不同將內(nèi)存劃分為幾塊。一般把Java堆空間分為新生代和老年代,這樣就可以根據(jù)各個(gè)年代的特點(diǎn)采用最適合的收集算法。在新生代,每次垃圾收集都會有大量的對象死去,只有少量存活,這樣就可以選擇復(fù)制算法,只需復(fù)制少量存活的對象就可以完成垃圾收集。在老年代中,對象的存活率高、沒有額外的空間對它進(jìn)行分配擔(dān)保,就必須采用標(biāo)記-清除或標(biāo)記-整理算法來進(jìn)行回收。

    6、HotSpot的算法實(shí)現(xiàn)

    前面從理論的角度介紹了對象存活判定和垃圾收集算法,接下來介紹下HotSpot虛擬機(jī)的實(shí)現(xiàn)。

    (1)枚舉根節(jié)點(diǎn)

    在對象存活判定中使用的是GC Roots可達(dá)性分析算法,可作為GC Roots的節(jié)點(diǎn)主要在全局的引用(例如常量和類靜態(tài)屬性)與執(zhí)行上下文(例如棧幀中的本地變量表)中,不過現(xiàn)在很多應(yīng)用僅僅方法區(qū)就有數(shù)百兆,如果逐個(gè)檢查這里的引用,就必然會消耗很多時(shí)間。

    另外,可達(dá)性分析對執(zhí)行時(shí)間的敏感還體現(xiàn)在GC停頓上,因?yàn)檫@項(xiàng)工作必須在一個(gè)能確保一致性的快照中進(jìn)行,就是說在整個(gè)分析過程中執(zhí)行系統(tǒng)看起來就像被凍結(jié)在某個(gè)時(shí)間點(diǎn)上,不可以出現(xiàn)分析過程中對象引用關(guān)系還在不停變化的情況,否則分析的結(jié)果就不能保證準(zhǔn)確。這是導(dǎo)致GC進(jìn)行時(shí)必須停頓所有Java執(zhí)行線程的一個(gè)重要原因,Sun將這個(gè)事件叫做“Stop the World”。

    由于目前的主流虛擬機(jī)使用的都是準(zhǔn)確式GC,所以當(dāng)執(zhí)行系統(tǒng)停頓后,并不需要檢查所有的引用和執(zhí)行上下文,虛擬機(jī)有辦法直接得知哪些地方存放著對象的引用。在HotSpot的實(shí)現(xiàn)中,使用一組OopMap的數(shù)據(jù)結(jié)構(gòu)來達(dá)到這個(gè)目的,在類加載完成的時(shí)候,HotSpot就把對象內(nèi)什么偏移量上是什么類型的數(shù)據(jù)計(jì)算出來,在JIT編譯過程中,也會在特定的位置記錄下棧和寄存器中哪些位置是引用。這樣,GC在掃描時(shí)就可以直接得知這些信息了。

    (2)安全點(diǎn)

    在OopMap的協(xié)助下,HotSpot可以快速且準(zhǔn)確的完成GC Roots的枚舉,但是,這樣可能導(dǎo)致引用關(guān)系變化,或者說OopMap內(nèi)容變化的指令非常多,如果每一條指令都生成對應(yīng)的OopMap,將會消耗大量的空間。

    實(shí)際上,HotSpot只是在特定的位置記錄OopMap的信息,這些位置稱為“安全點(diǎn)”(Safe Point),即程序執(zhí)行時(shí)并非在所有地方都能停下來開始GC,只有到達(dá)安全點(diǎn)時(shí)才能停止。SafePoint的選定不能太少也不能太多,所以,安全點(diǎn)的選定基本上是以程序“是否具有讓程序長時(shí)間執(zhí)行的特點(diǎn)”為標(biāo)準(zhǔn)進(jìn)行選定。因?yàn)槊織l指令執(zhí)行的時(shí)間都非常短,程序不太可能因?yàn)橹噶盍鏖L度太長而長時(shí)間執(zhí)行,長時(shí)間執(zhí)行最明顯的特征就是指令序列復(fù)用,比如方法調(diào)用、循環(huán)跳轉(zhuǎn)和異常跳轉(zhuǎn)等,具有這些特征的指令才會產(chǎn)生安全點(diǎn)。

    對于SafePoint來說,還有一個(gè)問題,就是如何在GC發(fā)生時(shí)讓所有的線程(不包括執(zhí)行JNI調(diào)度的線程)都跑到最近的安全點(diǎn)停下來,這里有兩種方案:搶占式中斷和主動式中斷。搶占式中斷不需要線程的執(zhí)行代碼主動去配合,在GC發(fā)生時(shí),首先把所有的線程全部中斷,如果有線程中斷的地方不在安全點(diǎn)上,就恢復(fù)線程執(zhí)行到安全點(diǎn)。不過幾乎沒有虛擬機(jī)采用這種方法。

    另一個(gè)方法就是主動式中斷,就是說當(dāng)GC需要中斷線程的時(shí)候,不直接對線程操作,僅僅簡單的設(shè)置一個(gè)標(biāo)志,各個(gè)線程執(zhí)行時(shí)主動去輪詢這個(gè)標(biāo)志,發(fā)現(xiàn)為真時(shí)就自己中斷掛起。輪詢標(biāo)志的地方和安全點(diǎn)重合,此外還有創(chuàng)建對象需要分配內(nèi)存的地方。

    (3)安全區(qū)域

    SafePoint機(jī)制保證了程序執(zhí)行時(shí),在不太長的時(shí)間內(nèi)就會遇到可進(jìn)入GC的SafePoint。但如果程序由于沒有分配CPU時(shí)間或者線程處于sleep或blocked狀態(tài)而沒有執(zhí)行呢?這時(shí)線程無法響應(yīng)JVM的中斷請求,無法跑到安全點(diǎn)然后掛起,JVM也不可能等著線程重新執(zhí)行。這時(shí)就需要安全區(qū)域(Safe Region)了。

    安全區(qū)域是指在一段代碼片段中,引用關(guān)系不會發(fā)生變化。在這個(gè)區(qū)域中的任何地方開始GC都是安全的,也就是說,安全區(qū)域是擴(kuò)展了的安全點(diǎn)。

    在線程執(zhí)行到安全區(qū)域中的代碼時(shí),首先標(biāo)識自己已經(jīng)進(jìn)入安全區(qū)域,這樣,當(dāng)在這段時(shí)間JVM要發(fā)起GC時(shí),就不用管已經(jīng)標(biāo)識進(jìn)入安全區(qū)域的線程了。在線程要離開安全區(qū)域時(shí),要檢查系統(tǒng)是否完成了GC Roots的枚舉或者整個(gè)GC過程,如果完成了,那線程就繼續(xù)執(zhí)行,否則就等待可以安全離開安全區(qū)域的信號。

    7、HotSpot虛擬機(jī)中的垃圾收集器

    上面只是介紹了垃圾收集算法的原理,而由于HotSpot虛擬機(jī)的垃圾收集是按照分代完成的,所以虛擬機(jī)中實(shí)現(xiàn)了多個(gè)垃圾收集器。這里依據(jù)的是JDK 1.7之后的實(shí)現(xiàn),垃圾收集器如下圖所示:


    這張圖體現(xiàn)了HotSpot虛擬機(jī)中各個(gè)垃圾收集器的關(guān)系,其中上面的三個(gè)垃圾收集器工作在新生代,下面的三個(gè)收集器工作在老年代,而G1收集器在兩個(gè)部分都可以工作。收集器之間的連線表明兩個(gè)收集器可以協(xié)同工作。下面來分別介紹一下各個(gè)垃圾收集器的原理、特性和使用場景。

    (1)Serial收集器

    Serial收集器是最基本的、歷史最悠久的收集器,曾經(jīng)是JDK 1.3.1之前虛擬機(jī)的新生代收集的唯一選擇。Serial這個(gè)名字揭示了這是一個(gè)單線程的垃圾收集器,特點(diǎn)如下:

    • 僅僅使用一個(gè)線程完成垃圾收集工作;
    • 在垃圾收集時(shí)必須暫停其他所有的工作線程,知道垃圾收集結(jié)束;
    • Stop the World是在用戶不可見的情況下執(zhí)行的,會造成某些應(yīng)用響應(yīng)變慢;
    • 使用復(fù)制算法;

    Serial收集器的工作流程如下圖:


    雖然如此,Serial收集器依然是虛擬機(jī)運(yùn)行在Client模式下的默認(rèn)新生代收集器。它的優(yōu)點(diǎn)同樣明顯:簡單而高效(單個(gè)線程相比),并且由于沒有線程交互的開銷,專心做垃圾收集自然課獲得最高的單線程效率。在一般情況下,垃圾收集造成的停頓時(shí)間可以控制在幾十毫秒甚至一百多毫秒以內(nèi),還是可以接受的。

    (2)ParNew收集器

    ParNew收集器其實(shí)是Serial收集器的多線程版本,與Serial不同的地方就是在垃圾收集過程中使用多個(gè)線程,剩下的所有行為包括控制參數(shù)、收集算法、Stop the World、對象分配規(guī)則和回收策略等都一樣。ParNew收集器也使用復(fù)制算法。ParNew收集器的工作流程如下圖:


    ParNew收集器看似沒有多大的創(chuàng)新之處,但卻是許多運(yùn)行在Server模式下的虛擬機(jī)中首選的新生代收集器,因?yàn)?#xff0c;除了Serial收集器外,目前只有ParNew收集器能夠與CMS收集器配合工作,而CMS收集器是HotSpot在JDK 1.5時(shí)期推出的具有劃時(shí)代意義的垃圾收集器(后面會介紹到)。

    ParNew收集器在單個(gè)線程的情況下由于線程交互的開銷沒有Serial收集器的效果好。不過,隨著CPU個(gè)數(shù)的增加,它對于GC時(shí)系統(tǒng)資源的有效利用還是很有好處的。它默認(rèn)開啟的收集線程數(shù)與CPU的數(shù)量相同??梢允褂?XX:ParallelGCThreads參數(shù)來限制垃圾收集的線程數(shù)。

    (3)Parallel Scavenge收集器

    Parallel Scavenge收集器和ParNew類似,是一個(gè)新生代收集器,使用復(fù)制算法,又是并行的多項(xiàng)成收集器。不過和ParNew不同的是,Parallel Scavenge收集器的關(guān)注點(diǎn)不同。

    CMS等收集器的關(guān)注點(diǎn)是盡可能縮短垃圾收集時(shí)用戶線程的停頓時(shí)間,而Parallel Scavenge收集器的目的則是達(dá)到一個(gè)可控制的吞吐量。吞吐量就是CPU用于運(yùn)行用戶代碼的時(shí)間與CPU總消耗時(shí)間的比值,即吞吐量=運(yùn)行用戶代碼時(shí)間/(運(yùn)行用戶代碼時(shí)間+運(yùn)行垃圾收集時(shí)間)。如果虛擬機(jī)一共運(yùn)行100分鐘,垃圾收集運(yùn)行了1分鐘,那么吞吐量就是99%。

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

    Parallel Scavenge收集器提供了兩個(gè)參數(shù)來精確控制吞吐量,分別是控制最大垃圾收集停頓時(shí)間的-XX:MaxGCPauseMillis參數(shù)以及直接設(shè)置吞吐量大小的-XX:GCTimeRatio參數(shù)。

    MaxGCPauseMillis參數(shù)允許的值是一個(gè)大于0的毫秒數(shù),收集器將盡可能在給定時(shí)間內(nèi)完成垃圾收集。不過垃圾收集時(shí)間的縮短是以犧牲吞吐量和新生代空間為代價(jià)的,短的垃圾收集時(shí)間會導(dǎo)致更加頻繁的垃圾收集行為,從而導(dǎo)致吞吐量的降低。

    GCTimeRatio參數(shù)的值是一個(gè)大于0且小于100的整數(shù),也就是垃圾收集時(shí)間占總時(shí)間的比率,相當(dāng)于吞吐量的倒數(shù)。如果設(shè)置為19,那允許的最大GC時(shí)間就是總時(shí)間的5%(1/(1+19))。默認(rèn)是99,也就是允許最大1%的垃圾收集時(shí)間。

    Parallel Scavenge收集器也叫吞吐量優(yōu)先收集器,它還有一個(gè)參數(shù)-XX:UseAdaptiveSizePolicy,這是一個(gè)開關(guān)參數(shù),當(dāng)這個(gè)參數(shù)打開后,就不需要手工指定新生代的大小(-Xmn)、Eden和Survivor的比例(-XX:SurvivorRatio)、晉升老年代對象年齡(-XX:PretenureSizeThreshold)等細(xì)節(jié)了,虛擬機(jī)會根據(jù)當(dāng)前系統(tǒng)的運(yùn)行情況收集性能監(jiān)控信息,動態(tài)調(diào)整這些參數(shù)以提供最適合的停頓時(shí)間或最大的吞吐量,這叫GC自適應(yīng)的調(diào)節(jié)策略。這也是Parallel Scavenge收集器和ParNew收集器的一個(gè)重要區(qū)別。

    (4)Serial Old收集器

    Serial Old是Serial的老年版本,在Serial的工作流程圖中可以看到,Serial Old收集器也是一個(gè)單線程收集器,使用“標(biāo)記-整理”算法。這個(gè)收集器主要給Client模式下的虛擬機(jī)使用。如果在Serve模式下,它有兩個(gè)用途:一個(gè)是在JDK 1.5之前的版本中與Parallel Scavenge收集器搭配使用;另一個(gè)就是作為CMS收集器的后備預(yù)案,在并發(fā)收集發(fā)生Concurrent Mode Failure時(shí)使用。這個(gè)收集器的工作流程在Serial的后半部分有所體現(xiàn)。

    (5)Parallel Old收集器

    Parallel Old收集器是Parallel Scavenge收集器的老年版本,它也使用多線程和“標(biāo)記-整理”算法。這個(gè)收集器是在JDK 1.6開始提供。

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


    (6)CMS收集器

    CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。在重視響應(yīng)速度和用戶體驗(yàn)的應(yīng)用中,CMS應(yīng)用很多。

    CMS收集器使用“標(biāo)記-清除”算法,運(yùn)作過程比較復(fù)雜,分為4個(gè)步驟:

    • 初始標(biāo)記(CMS initial mark)
    • 并發(fā)標(biāo)記(CMS Concurrent mark)
    • 重新標(biāo)記(CMS remark)
    • 并發(fā)清除(CMS Concurrent Sweep)

    其中,初始標(biāo)記和并發(fā)標(biāo)記仍然需要Stop the World、初始標(biāo)記僅僅標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對象,速度很快,并發(fā)標(biāo)記就是進(jìn)行GC RootsTracing的過程,而重新標(biāo)記階段則是為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)行而導(dǎo)致標(biāo)記產(chǎn)生變動的那一部分對象的標(biāo)記記錄,這個(gè)階段的停頓時(shí)間一般會比初始標(biāo)記階段長,但遠(yuǎn)比并發(fā)標(biāo)記的時(shí)間短。

    由于整個(gè)過程中耗時(shí)最長的并發(fā)標(biāo)記和并發(fā)清除過程收集器線程都可以與用戶線程一起工作,所以整體上說,CMS收集器的內(nèi)存回收過程是與用戶線程一共并發(fā)執(zhí)行的。下圖是流程圖:


    CMS的優(yōu)點(diǎn)就是并發(fā)收集、低停頓,是一款優(yōu)秀的收集器。不過,CMS也有缺點(diǎn),如下:

    • CMS收集器對CPU資源非常敏感。CMS默認(rèn)啟動的回收線程數(shù)是(CPU數(shù)量+3)/4,當(dāng)CPU個(gè)數(shù)大于4時(shí),垃圾收集線程使用不少于25%的CPU資源,當(dāng)CPU個(gè)數(shù)不足時(shí),CMS對用戶程序的影響很大;
    • CMS收集器無法處理浮動垃圾,可能出現(xiàn)“Concurrent Mode Failure”失敗而導(dǎo)致另一次Full GC;
    • CMS使用標(biāo)記-清除算法,會產(chǎn)生內(nèi)存碎片;

    (7)G1收集器

    G1(Garbage first)收集器是最先進(jìn)的收集器之一,是面向服務(wù)端的垃圾收集器。與其他收集器相比,G1收集器有如下優(yōu)點(diǎn):

    • 并行與并發(fā):有些收集器需要停頓的過程G1仍然可以通過并發(fā)的方式讓用戶程序繼續(xù)執(zhí)行;
    • 分代收集:可以不使用其他收集器配合管理整個(gè)Java堆;
    • 空間整合:使用標(biāo)記-整理算法,不產(chǎn)生內(nèi)存碎片;
    • 可預(yù)測的停頓:G1除了降低停頓外,還能建立可預(yù)測的停頓時(shí)間模型;

    G1中也有分代的概念,不過使用G1收集器時(shí),Java堆的內(nèi)存布局與其他收集器有很大的差別,它將整個(gè)Java堆劃分為多個(gè)大小相等的獨(dú)立區(qū)域(Region),G1收集器之所以能建立可預(yù)測的停頓時(shí)間模型,是因?yàn)樗梢杂杏?jì)劃的避免在整個(gè)Java堆中進(jìn)行全區(qū)域的垃圾收集。G1跟蹤各個(gè)Region里垃圾堆積的價(jià)值大小(回收所獲得的空間大小以及回收所需要的時(shí)間的經(jīng)驗(yàn)值),在后臺維護(hù)一個(gè)優(yōu)先列表,每次優(yōu)先收集價(jià)值最大的那個(gè)Region。這樣就保證了在有限的時(shí)間內(nèi)盡可能提高效率。

    G1收集器的大致步驟如下:

    • 初始標(biāo)記(Initial mark)
    • 并發(fā)標(biāo)記(Concurrent mark)
    • 最終標(biāo)記(Final mark)
    • 篩選回收(Live Data Counting and Evacuation)

    收集器的流程如下圖:


    添加公眾號Machairodus,我會不時(shí)分享一些平時(shí)學(xué)到的東西~


    總結(jié)

    以上是生活随笔為你收集整理的Java垃圾收集机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    伊人电影在线观看 | 国产91对白在线播 | 国产69精品久久99不卡的观看体验 | 伊人久久五月天 | 国产丝袜美腿在线 | 亚洲精品国产综合99久久夜夜嗨 | 五月天亚洲精品 | 日本护士撒尿xxxx18 | 亚洲国产成人精品电影在线观看 | 日韩精品久久久久久 | 麻花豆传媒一二三产区 | 国产视频一区二区在线观看 | 天天综合网天天综合色 | 色五丁香 | 特级毛片在线免费观看 | 婷五月激情 | 久久久久99精品国产片 | 九九精品毛片 | 午夜精品福利一区二区 | 国产亚洲视频中文字幕视频 | 91亚色视频在线观看 | 99热999| 日韩在线视频观看 | 精品视频久久久久久 | 人人人爽| 欧美精品小视频 | ,午夜性刺激免费看视频 | 国产精品久久久久久久久大全 | 特级西西444www大胆高清无视频 | 免费裸体视频网 | 久久一线 | 欧美国产日韩在线观看 | 涩涩伊人| 久久精品一区二区三区中文字幕 | 九九久久免费视频 | 欧美日韩视频在线一区 | 麻豆果冻剧传媒在线播放 | 四虎国产精品免费 | 亚洲国产精品一区二区久久hs | 午夜久久久久久久 | 一级淫片a | 9在线观看免费高清完整版在线观看明 | 夜夜澡人模人人添人人看 | 在线高清| 国产精品 中文字幕 亚洲 欧美 | 欧美精品亚洲精品日韩精品 | 97精品国产91久久久久久 | 午夜12点| 日韩欧美一二三 | 国产第一福利 | 日本精品午夜 | 日韩视频1 | 精品国产免费人成在线观看 | 99精品热| 中文字幕影片免费在线观看 | 色婷婷久久久综合中文字幕 | 日本系列中文字幕 | 国产成人久久av | 丁香六月伊人 | 天天操天天射天天添 | 久久免费看毛片 | 日韩一级黄色片 | 高清视频一区二区三区 | 久久久久久久国产精品视频 | 久久久蜜桃一区二区 | 欧美在线一 | 国产麻豆电影在线观看 | 蜜桃视频在线观看一区 | 国产日韩中文字幕 | 三上悠亚一区二区在线观看 | 懂色av一区二区在线播放 | 国产一区二区精品在线 | 久久av一区二区三区亚洲 | 久久免费国产精品 | 欧美精品免费视频 | 97精品国产97久久久久久春色 | 六月丁香在线视频 | 精品一区二区在线免费观看 | 亚洲国产最新 | 91色网址| 中文字幕第一页在线视频 | 黄色a视频免费 | 久久久这里有精品 | 超碰在线1 | 亚州av免费| 国产五月色婷婷六月丁香视频 | 99久视频| 亚洲精品久久久久久中文传媒 | 91九色蝌蚪视频在线 | 亚洲永久精品国产 | 高清精品在线 | 高清免费在线视频 | 一区二区三区四区精品 | 成人免费亚洲 | 日韩在线视频在线观看 | 日本久久久久久久久 | 91综合久久一区二区 | 国产精品乱码久久久久久1区2区 | 国产成人久久精品77777 | 91热在线| 成人综合婷婷国产精品久久免费 | 欧美污污视频 | 日韩精品电影在线播放 | 中日韩免费视频 | 在线视频观看国产 | 亚洲国产免费 | 国产午夜三级 | 日本三级在线观看中文字 | 中文字幕国产 | 日韩综合在线观看 | 婷婷在线色 | 狠狠色狠狠色合久久伊人 | 精品福利视频在线观看 | 亚洲男人天堂2018 | 国产精品久久久久久久久久不蜜月 | 国产精品久久久久久吹潮天美传媒 | 欧美亚洲xxx| 九九九电影免费看 | 丝袜av一区 | 国产网红在线观看 | 国产精品黑丝在线观看 | 三三级黄色片之日韩 | 韩国三级一区 | 三级av网站| 国产小视频在线看 | 特级黄录像视频 | 97人人看 | 久草视频2 | 日本成人中文字幕在线观看 | 国产精品一区在线观看 | 最新av中文字幕 | 色综合天天综合 | 国产精品www| 四虎在线视频 | 女女av在线| 人人爽影院 | 亚洲电影图片小说 | 超碰av免费| 黄色片网站 | 国产美女精品人人做人人爽 | 日韩av伦理片 | 国产免费黄色 | 中文字幕久久精品 | 国产成人精品av | 亚洲精品乱码久久久久久写真 | 国产最新在线视频 | 91高清免费 | 亚洲精品国产麻豆 | 91你懂的 | 看黄色91| 91精品第一页 | 亚洲精品中文在线 | 91专区在线观看 | 亚洲国产mv | 久久艹99 | 在线国产精品一区 | 丁香六月伊人 | av成年人电影 | 精品中文字幕在线观看 | 婷婷四房综合激情五月 | 2020天天干夜夜爽 | 最新国产福利 | 亚洲成av人片在线观看www | 亚洲色图激情文学 | 亚洲激情电影在线 | 久草视频在线资源 | 色av婷婷 | 最近2019中文免费高清视频观看www99 | 欧美无极色| 国产午夜精品一区二区三区欧美 | av资源免费看 | 蜜桃av久久久亚洲精品 | 亚洲乱码在线观看 | 91精品久久久久久综合乱菊 | 丁香色综合| 国产精品一区二区三区久久 | 成人av片免费观看app下载 | 综合色在线 | 日韩免费不卡av | 四虎在线永久免费观看 | 欧美日韩综合在线观看 | 国产精品久久一 | a视频免费看 | 一区二区三区动漫 | 视频在线观看入口黄最新永久免费国产 | 久久伊人国产精品 | 国产福利资源 | 最新午夜电影 | 毛片a级片 | 午夜视频亚洲 | 伊人久久精品久久亚洲一区 | 天天天综合 | 69精品人人人人 | 爱干视频 | 成人精品视频 | 久久99热精品这里久久精品 | 18国产精品白浆在线观看免费 | 亚洲一级黄色 | 97在线观看视频免费 | 国产精品久久久久久久午夜 | 日韩午夜视频在线观看 | 亚洲精品国产拍在线 | www蜜桃视频| 国产在线观看你懂得 | 国产色小视频 | 五月婷婷激情综合网 | 99九九热只有国产精品 | 欧美大片在线观看一区 | 黄色aaa毛片 | 啪啪免费视频网站 | 成 人 黄 色 视频 免费观看 | 麻豆传媒视频在线播放 | 国产在线小视频 | 伊人天堂网 | 亚洲午夜av久久乱码 | 久久国产午夜精品理论片最新版本 | 麻豆系列在线观看 | 国产精品99免视看9 国产精品毛片一区视频 | 在线视频在线观看 | 福利视频区| 97在线资源 | 国产麻豆精品一区二区 | 国产精品mv在线观看 | 色资源在线观看 | av电影免费观看 | 免费av在| 天天操福利视频 | 亚洲精品在线免费观看视频 | 国产福利a | 国产一卡久久电影永久 | 99国产在线观看 | av色影院 | 久久精品一区二区三区中文字幕 | 奇米影视8888 | 免费a v观看| 特级西西444www高清大视频 | 国产成人久久精品77777 | 丁香六月天 | 97精品国产97久久久久久久久久久久 | 久久一区二区三区四区 | 国产精品美女久久久久久 | av中文在线影视 | 日韩高清观看 | 日本性高潮视频 | 欧美在线观看禁18 | 国产色综合天天综合网 | 久久系列 | 成人视屏免费看 | av观看免费在线 | 亚洲自拍自偷 | 99视频免费观看 | 国产成人1区 | 99精品国产一区二区三区麻豆 | 91精品久久久久久粉嫩 | 欧美视频一区二 | 欧美男女爱爱视频 | 久久新视频 | 91在线porny国产在线看 | 丁香婷婷色月天 | 国产色综合天天综合网 | 亚洲va欧洲va国产va不卡 | 丁香六月在线 | 黄色小说视频网站 | 日韩免费成人av | 久久精品福利 | 五月婷婷视频在线观看 | 黄色一二级片 | 国产一级视频免费看 | 久视频在线播放 | 色a在线观看| 国产最新网站 | 国产一级片一区二区三区 | 人人涩| 六月丁香婷| 亚洲视频分类 | 成人 国产 在线 | 婷婷六月综合网 | 精品99久久久久久 | 麻豆视频在线免费 | 91亚洲精品久久久 | 天天插天天操天天干 | 亚洲人成免费 | 日韩精品第1页 | 久草观看 | 黄色日本免费 | 日韩动漫免费观看高清完整版在线观看 | 九九九九九九精品任你躁 | av在线影片| 日韩爱爱网站 | 丁香婷婷久久久综合精品国产 | 久久久综合色 | 天天射天天| 美女网站视频久久 | 日韩色区 | 色婷久久 | 99在线视频免费观看 | 超碰人人在线观看 | 91亚洲精品乱码久久久久久蜜桃 | 四虎天堂 | 亚洲免费视频观看 | 久久草草热国产精品直播 | 国产精品第一视频 | 婷婷日韩 | 免费av在 | 国产中文a| 91精品国产成人 | 欧美一区在线观看视频 | 日韩精品久久久久久久电影竹菊 | 中文字幕成人网 | 美女久久久久久久久久久 | 国产精品观看在线亚洲人成网 | 成人国产一区 | 四虎天堂 | 成人在线黄色 | 午夜黄色一级片 | 色综合狠狠干 | 97视频在线免费观看 | 韩日色视频 | 最近免费观看的电影完整版 | 久久午夜羞羞影院 | 欧美日韩一区三区 | 激情综合五月天 | 国产不卡视频在线播放 | 久久电影中文字幕视频 | 五月婷在线 | 91精品办公室少妇高潮对白 | 99精品视频免费观看 | 色综合久久综合 | 一区二区三区在线播放 | 免费看久久久 | 精品v亚洲v欧美v高清v | 果冻av在线 | 国产精品涩涩屋www在线观看 | 久久图| 免费91麻豆精品国产自产在线观看 | 亚洲精品乱码久久久久v最新版 | 精品国产免费观看 | 久久伊人国产精品 | 成人av一级片| 国产九色91 | 国产精品剧情在线亚洲 | 中文字幕视频观看 | 激情大尺度视频 | 久久精品4 | 国产一二区精品 | 91精品入口 | 人成免费网站 | 午夜精品一区二区三区四区 | 国产成人在线观看免费 | 五月婷网| 日本动漫做毛片一区二区 | 久久色亚洲 | 9992tv成人免费看片 | 国产精品av在线 | 日韩在线视频一区二区三区 | 久草视频在线免费看 | 91日韩精品视频 | 韩日在线一区 | 激情喷水| 97夜夜澡人人爽人人免费 | 亚洲区精品视频 | 在线观看韩国av | 色综合夜色一区 | 久久香蕉一区 | 狠狠操狠狠操 | 日韩激情片在线观看 | 午夜色场| 国产高清不卡一区二区三区 | 国产精品乱码一区二三区 | 国产精品一区二区久久国产 | 色综合久久久久综合体 | 中文字幕久久精品亚洲乱码 | 欧日韩在线 | 久热免费| 亚洲国产精品成人av | 国产手机在线 | 国产美女视频网站 | 欧美肥妇free | 亚洲欧美国产日韩在线观看 | 日韩在线观 | 很污的网站 | 国产免费成人 | 欧美中文字幕第一页 | 97超碰伊人 | a天堂最新版中文在线地址 久久99久久精品国产 | 久久综合中文色婷婷 | 国产精品成人一区二区 | 久草电影在线观看 | 91精品视频免费 | 特级a老妇做爰全过程 | 99精彩视频| 在线观看视频免费播放 | 色综合久久88色综合天天免费 | 午夜精品一区二区三区在线视频 | 一区二区国产精品 | 久久特级毛片 | 欧美精品久久久 | 国产精品毛片一区 | 亚洲永久av | 久久免费成人精品视频 | 精品国产一区二区三区av性色 | 少妇bbb | 国产老太婆免费交性大片 | 日本中文乱码卡一卡二新区 | 天堂成人在线 | 综合色天天 | 亚洲动漫在线观看 | 在线观看91网站 | 日日添夜夜添 | 不卡中文字幕在线 | 天天天天爱天天躁 | 亚洲蜜桃在线 | 亚洲一级电影视频 | 99r在线精品 | 久草在线资源免费 | 成人性生爱a∨ | 国产淫a| 香蕉视频在线网站 | 97久久精品午夜一区二区 | 日韩免费在线观看视频 | 婷婷在线综合 | 国产群p | 91精品久久久久久综合乱菊 | 97电影网手机版 | 五月天综合| 在线观看视频97 | 91一区二区在线 | 国产精品18久久久久vr手机版特色 | 日精品在线观看 | 亚洲精品视频一 | 精品在线观看一区二区 | 激情影院在线 | 久草视频免费播放 | av中文资源在线 | 在线看黄网站 | 日韩电影一区二区三区在线观看 | 婷婷深爱五月 | 国产精品1024| 韩国中文三级 | av成人免费网站 | 免费三级黄 | 国产在线观看高清视频 | 欧美视屏一区二区 | 久久理论电影网 | 九九精品久久久 | 天天干天天干天天干 | 在线观看成人一级片 | 国产黄a三级三级三级三级三级 | 亚洲视频免费视频 | 国产精品国产三级国产 | 五月在线视频 | 91精品久久久久久久久久久久久 | 婷婷色影院 | 国产成人综 | 婷婷精品 | 色婷婷久久久 | 天天天插| 波多野结衣在线观看一区二区三区 | 高清av免费看 | 婷婷精品| 亚洲爱爱视频 | 日韩动态视频 | 黄色一级免费电影 | 草久电影 | 国产精品激情偷乱一区二区∴ | 五月婷婷黄色 | 国产美女无遮挡永久免费 | 亚洲国产精品成人精品 | 欧美日韩国产一区二区在线观看 | av片无限看 | 在线观看中文字幕av | 国产盗摄精品一区二区 | 国产色婷婷精品综合在线手机播放 | 久久免费一级片 | 最近中文字幕视频完整版 | 久久久激情视频 | 久久一视频 | 亚洲天堂毛片 | 国产成人精品一区二区三区 | 色wwww| 干天天| 国产黄色在线看 | 国产五月| 在线观看日韩免费视频 | 久久久亚洲精华液 | 国产99久久九九精品免费 | 一区二区观看 | 国产中文在线视频 | 午夜性生活片 | 日韩欧美一区二区不卡 | 在线成人高清电影 | 99久热在线精品 | 国产精品18久久久久久久 | 黄色的网站免费看 | 国产 中文 日韩 欧美 | 五月婷婷综合网 | 国产aaa毛片| 丁香六月久久综合狠狠色 | 99这里都是精品 | 中文字幕国语官网在线视频 | 国产福利在线 | 狠色在线| 国产专区一 | 国产伦理一区二区三区 | 处女av在线 | 国产精品 亚洲精品 | 日韩黄视频 | 久久综合丁香 | 狠狠躁夜夜躁人人爽超碰91 | 欧美aaa一级 | 欧美a级一区二区 | 国产日产在线观看 | 中文字幕韩在线第一页 | 日韩一级成人av | 中文字幕在线中文 | 国产成人在线一区 | 黄色的视频 | 99超碰在线播放 | 久在线观看 | 91精品国产综合久久婷婷香蕉 | 午夜色场| 国产成人99av超碰超爽 | 91麻豆精品久久久久久 | 中文字幕电影网 | 日本韩国精品一区二区在线观看 | 日韩久久久久久久久久久久 | 波多野结衣一区二区三区中文字幕 | 91视频一8mav| 国产精品大全 | 成人黄在线观看 | 5月丁香婷婷综合 | 欧美日韩国产精品一区二区三区 | 精品国产一区二区三区四区在线观看 | 精品一区二区三区在线播放 | 综合激情网...| 日韩免费在线 | 成人免费视频网址 | 久久视频一区二区 | 国产永久免费观看 | 九九久久精品 | 丰满少妇高潮在线观看 | 四虎永久网站 | 伊人色综合网 | 国产99久久久国产精品成人免费 | 中文字幕中文中文字幕 | 91福利在线观看 | 91免费看黄色| 国产精品成人久久久 | 天天操夜夜曰 | 五月激情在线 | 日本不卡一区二区三区在线观看 | 中文字幕二区在线观看 | 久久久国产精品电影 | 女人高潮特级毛片 | 91高清免费看 | 久久精品2 | 精品国产成人av | 男女靠逼app | 天堂网在线视频 | 91在线中文字幕 | 日韩中文字幕一区 | 久草色在线观看 | 色综合天天爱 | 在线播放精品一区二区三区 | 午夜三级理论 | 特级毛片在线 | 成人av电影免费在线观看 | 久久高清| 69精品在线 | 久久亚洲私人国产精品va | 综合久久婷婷 | 日韩av快播电影网 | 国产精品福利无圣光在线一区 | 久久久久成人精品免费播放动漫 | 一区二区三区久久精品 | 天天天操天天天干 | 四虎永久免费在线观看 | 操一草 | 久久视频网址 | 玖玖爱国产在线 | 成年免费在线视频 | 久久三级毛片 | 97超碰在 | 亚洲视频电影在线 | 国产精品淫 | 亚洲区精品 | 久久99精品久久久久久三级 | 久久五月天综合 | 亚洲精品国产麻豆 | 黄色毛片一级片 | 国产一区二区视频在线 | 久久久999免费视频 日韩网站在线 | 亚洲免费小视频 | 亚洲成人二区 | 在线观看视频一区二区 | 综合色播 | 天天插狠狠干 | 国产精品亚洲片夜色在线 | 中文在线字幕免费观看 | 久久国产综合视频 | 日韩午夜一级片 | 国产高清一 | 中文字幕乱码电影 | 久久一级片 | 国产福利精品一区二区 | 在线а√天堂中文官网 | 夜夜躁日日躁狠狠久久av | 黄色的网站在线 | 天天射综合 | 日韩精品在线观看视频 | 国产精彩在线视频 | 久久伊人操 | 日本中文字幕高清 | 少妇自拍av| 国产精品色视频 | 天天视频色版 | 国产一区二区三区午夜 | 国产成人一区二 | 日韩成人欧美 | 免费黄色看片 | 久久香蕉国产精品麻豆粉嫩av | 国产午夜精品理论片在线 | 在线看欧美 | 国产视频在线播放 | 综合久久久久 | 99这里只有久久精品视频 | 91视频麻豆 | 91精品啪在线观看国产81旧版 | 亚洲在线不卡 | 国产精品色在线 | 亚洲精品美女在线 | 五月天婷亚洲天综合网鲁鲁鲁 | 国产99中文字幕 | 日日摸日日添夜夜爽97 | www.久草视频 | 性色av免费在线观看 | 毛片播放网站 | 国产麻豆剧果冻传媒视频播放量 | 久久丁香网 | 最新高清无码专区 | 免费看一及片 | 91久久国产自产拍夜夜嗨 | 韩国av免费观看 | 一区二区精 | 国产精品丝袜久久久久久久不卡 | 日韩中文字幕免费看 | 欧美91片 | 久久精品中文字幕免费mv | 免费av在线网 | 日韩在线在线 | 久久综合激情 | 久久撸在线视频 | 四虎成人免费观看 | 天天艹| 久久国产视屏 | 91成人免费视频 | 国产精品中文 | 91激情 | 中文字幕丝袜 | 97综合在线| 成年人免费在线观看网站 | av黄色免费网站 | 久久久九九 | 国产69精品久久久久99尤 | 亚洲国产精品一区二区久久,亚洲午夜 | 亚洲精品毛片一级91精品 | 精品久久久久久亚洲综合网 | 手机看片1042 | 中文字幕影片免费在线观看 | 成人网444ppp| 亚洲国内精品在线 | 豆豆色资源网xfplay | 国色综合 | 天天爱天天操天天射 | 亚州av免费 | 中文字幕视频网 | 精品欧美日韩 | 日韩免费在线视频 | 色综合久久88色综合天天6 | 成人av一区二区兰花在线播放 | 97视频在线观看成人 | 丁香视频免费观看 | 亚洲性xxxx| 亚洲专区在线播放 | 亚洲国产精品一区二区久久,亚洲午夜 | 在线观看av黄色 | 天天色天天艹 | 亚洲国产操| 中文字幕视频在线播放 | 日日干干夜夜 | 国产三级国产精品国产专区50 | 国产精品欧美日韩在线观看 | 91九色视频在线观看 | 伊人天堂网 | 91系列在线 | 美女网站黄免费 | 亚洲国产精品久久久久婷婷884 | 国产真实精品久久二三区 | 日韩在线在线 | 日韩成人精品一区二区 | 亚洲一二区视频 | 色综合咪咪久久网 | 成人一级电影在线观看 | 激情综合久久 | 亚洲精品小区久久久久久 | 狠狠狠狠狠操 | 欧美日韩在线精品一区二区 | 中文字幕刺激在线 | 亚洲精品久久久久www | 日韩欧美电影 | 国产剧情av在线播放 | 亚洲精品午夜久久久久久久久久久 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 精品一区二区在线观看 | 一区三区在线欧 | 最新av在线网站 | 久久婷婷视频 | 日韩有码专区 | 四虎影视成人永久免费观看视频 | 久久99热精品 | 狠狠色2019综合网 | 人人干免费 | 天天综合狠狠精品 | 制服丝袜在线 | 国产精品免费观看久久 | 一区二区三区国 | 国产精品18毛片一区二区 | 中文av不卡| 最新国产在线视频 | 日韩免费三区 | 国产精品一区二区无线 | 天天操天天操天天操天天操天天操天天操 | 三级动态视频在线观看 | 黄色av电影一级片 | 精品99免费视频 | 国产成人免费观看久久久 | 狠狠色狠狠色合久久伊人 | 中文字幕一区在线观看视频 | 成人一区二区三区在线 | 91精品在线免费观看视频 | 亚洲精品福利视频 | 午夜精品久久久久久久爽 | 国产高清免费视频 | 亚洲影院色 | 视频一区二区三区视频 | 夜夜干夜夜 | 午夜视频在线瓜伦 | 超级碰碰免费视频 | 人人爽人人av | 在线观看资源 | 免费黄色a网站 | 亚洲黄色一级大片 | 中文字幕av全部资源www中文字幕在线观看 | 久在线 | 国产成人av免费在线观看 | 色偷偷88888欧美精品久久久 | 一区二区三区日韩视频在线观看 | 九九热中文字幕 | 色99在线 | 丝袜少妇在线 | 国产午夜精品一区二区三区嫩草 | 天堂av在线网 | 日精品 | 中文字幕在线人 | av网站地址 | 日韩中文字幕免费电影 | 欧美一二在线 | 亚洲电影久久久 | 天天要夜夜操 | 天天性天天草 | 免费看久久 | 精品a级片 | 一区二区成人国产精品 | 狠狠色丁香婷婷综合久小说久 | 免费观看mv大片高清 | 91网在线观看 | 国产91对白在线 | 91九色视频在线 | 久久草 | 国产精品2区 | 亚洲爱av | 久久亚洲私人国产精品 | 狠狠色丁香婷婷综合橹88 | 午夜精品福利影院 | 在线不卡a | 激情 一区二区 | 17婷婷久久www | 九七在线视频 | 一区二区三区精品在线 | 高清视频一区 | 欧美精品一区二区在线观看 | 日韩在线影视 | 最新国产在线 | 四虎在线免费视频 | 手机看片久久 | 麻豆视频大全 | 中国一 片免费观看 | 久久草视频 | www久久九 | av在线专区 | www.伊人网 | 亚洲精品 在线视频 | 综合网久久 | 国产一区二区久久精品 | www五月| 日韩国产欧美在线播放 | 日韩精品一区二区三区免费观看视频 | 最近免费观看的电影完整版 | 黄色大片网 | 日本久久不卡视频 | 欧美亚洲国产日韩 | 国产精品一区免费在线观看 | 国产免费av一区二区三区 | 国产中文字幕视频在线观看 | 最新av观看 | 欧美在线观看视频 | 国产成人久久精品77777综合 | 丰满少妇在线观看 | 手机成人免费视频 | 久久高清免费观看 | 国产精品久久久久久吹潮天美传媒 | 免费麻豆| 91精品国产综合久久久久久久 | 精品久久一级片 | 久久精品9 | 2018亚洲男人天堂 | 婷婷资源站 | 午夜黄色影院 | 人人插人人做 | 久久久久久综合网天天 | 久久亚洲精品电影 | 九九九九九九精品 | 久久成人在线 | 伊人伊成久久人综合网小说 | 在线视频成人 | 亚洲精品456在线播放 | 免费高清在线观看成人 | 久久精品99国产精品亚洲最刺激 | 欧美日韩国产亚洲乱码字幕 | 国产在线永久 | 久久久精品综合 | 五月婷婷操 | 国产色婷婷精品综合在线手机播放 | www.综合网.com | 最新国产中文字幕 | 99精品在线观看 | 99中文视频在线 | 青草视频网 | 国产精品久久99综合免费观看尤物 | 国语自产偷拍精品视频偷 | 久久久久久久久久网站 | 五月婷婷香蕉 | a视频在线播放 | 18性欧美xxxⅹ性满足 | 91精品国产乱码 | 亚洲精品小区久久久久久 | 久久久精品二区 | 中国精品一区二区 | 国产一级在线观看视频 | 日韩一级精品 | 摸bbb搡bbb搡bbbb | 播五月综合 | 久久精品国产一区二区 | 欧美久久久久 | 久久超碰99| 国产一区视频导航 | 日韩精品不卡在线 | 国产精品九九久久99视频 | 国产精品一区二区免费在线观看 | 国产精品久久久一区二区三区网站 | 久久怡红院 | 波多野结衣一区二区三区中文字幕 | 97精品视频在线播放 | 99自拍视频在线观看 | 国产精品123 | 香蕉在线观看视频 | 黄色免费电影网站 | 日韩女同一区二区三区在线观看 | 久久99精品久久久久久久久久久久 | 亚洲国产精品视频 | 欧美 亚洲 另类 激情 另类 | 麻豆成人在线观看 | 欧美大片www| 热99在线视频| 久久伦理网 | 日韩成人不卡 | 在线观看国产日韩欧美 | 午夜精品一区二区三区在线播放 | 91亚洲精品乱码久久久久久蜜桃 | 国产色视频一区二区三区qq号 | 中文一二区 | 999免费视频| 国产亚洲久久 | 中文字幕频道 | 91日本在线播放 | 欧美日本在线观看视频 | 精品久久久久久久久久国产 | 丝袜美女视频网站 | 国内精品久久天天躁人人爽 | 狠狠狠色丁香婷婷综合激情 | 韩国av一区 | 免费在线色 | 国产一级片免费观看 | 欧美日韩不卡一区二区三区 | 五月天亚洲综合 | 中文在线免费观看 | 黄网站污 | 久久免费视频观看 | 色wwww| 天天躁天天狠天天透 | 综合色中文 | 免费黄色激情视频 | 日日干夜夜爱 | 亚洲黄色app| 国产精品久久久久久五月尺 | 干天天 | 精品国产一区二区三区日日嗨 | 天天操天天操天天操 | 伊人五月天综合 | 国产精品 日本 | 久久婷婷综合激情 | 国内外成人在线 | 91精品国产99久久久久久红楼 | 狠狠操精品 | 久热免费| 免费看黄网站在线 | 狠狠狠操| 97视频网站 | 久久经典视频 | 在线观看a视频 | 丁香激情五月 | 天天射综合网视频 | 午夜精品在线看 | 久久国产精品小视频 | 国产在线精品视频 | 五月天天色 | 成年人视频免费在线播放 | 国产精品视频久久久 | 久久免费视频在线观看6 | 久久久久久久久久久久av | 日韩欧美国产免费播放 | 久久国产手机看片 | 亚洲一区精品人人爽人人躁 | 果冻av在线| 美女网站在线看 | 美女视频黄在线 | 国产原创91 | 成人国产精品 | 美女视频黄免费的 | 天天干天天操天天射 | 精品在线观看免费 | 97电影在线观看 | 色视频一区| 日韩中文在线播放 | 九九精品在线观看 | 永久免费精品视频网站 | 欧美激情综合五月色丁香 | 黄色网址中文字幕 | 2023国产精品自产拍在线观看 | 久久热首页 | 国产国语在线 | 国产高清视频色在线www | 亚洲美女精品视频 | 五月天亚洲综合 | 一本一本久久a久久精品综合小说 | 黄色免费网 | 四虎在线免费观看 | 夜色在线资源 | 久久免费播放视频 | 国产精品女主播一区二区三区 | 欧美极品xxx| 天天做天天爱夜夜爽 | 日韩久久在线 | 日韩精品免费一区二区 | www.天天草 | 色久综合 | 日韩欧美视频免费看 | 天天操天天舔天天爽 | 日韩电影精品一区 | 欧美日韩另类在线 | 一区在线播放 | 欧美精品乱码久久久久久 | 国产成人一区二区啪在线观看 | 99热这里有 | 9999国产| 免费网站黄 | 六月激情 | 黄色福利 | 国产福利专区 | 色综合久久久 | 久久香蕉一区 | 激情丁香久久 | www五月天com| 又黄又爽又无遮挡免费的网站 | www.天天色| 1000部18岁以下禁看视频 | 亚洲 欧洲 国产 日本 综合 | 99久久99视频只有精品 |