精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

三分鐘帶你了解對象的創建過程

開發 前端
Java 中最典型的聚合量是對象,如果逃逸分析證明一個對象不會被外部訪問,并且這個對象是可分解的,那程序真正執行的時候將可能不創建這個對象,而改為直接創建它的若干個被這個方法使用到的成員變量來代替,拆散后的變量便可以被單獨分析與優化,可以各自分別在棧幀或寄存器上分配空間,原本的對象就無需整體分配空間了。

一、摘要

在之前的文章中,我們介紹了類加載的過程和 JVM 內存布局相關的知識。本篇我們綜合之前的知識,結合代碼一起推演一下對象的真實創建過程,以及對象創建完成之后在 JVM 中是如何保存的。

二、對象的創建

在 Java 中,創建對象的方式有很多種,比如最常見的通過new xxx()來創建一個對象,通過反射Class.forName(xxx).newInstance()來創建對象等。其實無論是哪種創建方式,JVM 底層的執行過程是一樣的。

對象的創建過程,可以用如下圖來簡要概括。

圖片圖片

創建對象大致分為 5 個步驟:

1.檢查類是否加載,如果沒有就先執行類的加載

2.分配內存

3.初始化零值

4.設置頭對象

5.執行初始化方法,例如構造方法等

下面我們一起來看下每個步驟具體的工作內容。

2.1、類加載檢查

當需要創建一個類的實例對象時,比如通過new xxx()方式,虛擬機首先會去檢查這個類是否在常量池中能定位到一個類的符號引用,并且檢查這個符號引用代表的類是否已經被加載、解析和初始化,如果沒有,那么必須先執行類的加載流程;如果已經加載過了,會在堆區有一個類的 class 對象,方法區會有類的相關元數據信息。

為什么在對象創建時,需要有這一個檢查判斷?

主要原因在于:類的加載,通常都是懶加載,只有當使用類的時候才會加載,所以先要有這個判斷流程。

關于類的加載過程,在之前的文章中已經有所介紹,有興趣的朋友可以翻看之前的文章。

2.2、分配內存

類加載成功后,虛擬機就能夠確定對象的大小了,此時虛擬機會在堆內存中劃分一塊對象大小的內存空間出來,分配給新生對象。

虛擬機如何在堆中分配內存的呢?

主要有兩種方式:

1.指針碰撞法

2.空閑列表法

下面我們一起來看看相關的內存分配方式。

2.2.1、指針碰撞法

如果內存是規整的,那么虛擬機將采用指針碰撞法來為對象分配內存。

指針碰撞法,簡單的說就是所有用過的內存在一邊,空閑的內存在另一邊,中間放著一個指針作為分界點的指示器,分配內存時會把指針向空閑一方挪動一段,直到能容納對象大小的位置。

如果垃圾收集器選擇的是 Serial、ParNew 這種基于壓縮算法的,虛擬機會采用這種分配方式。

2.2.2、空閑列表法

如果內存不是規整的,已使用的內存和未使用的內存相互交錯,那么虛擬機將采用空閑列表法來為對象分配內存。

空閑列表法,簡單的說就是在虛擬機內部維護了一個列表,會記錄哪些內存塊是可用的,在分配的時候會從列表中找到一塊能容納對象大小的空間,劃分給對象實例,并更新列表上的內容。

如果垃圾收集器選擇的是 CMS 這種基于標記-清除算法的,虛擬機會采用這種分配方式。

2.2.3、內存分配安全問題

我們知道,虛擬機是支持多個線程同時分配內存的,是否會有線程安全的問題呢?

答案是:肯定存在的。比如用指針碰撞法時,虛擬機正在給對象 A 分配內存,但指針還沒來及修改,此時又有一個線程給對象 B 分配內存,同時使用了原來的指針來分配,最后的結果就是這個區域只分配來一個對象,另一個對象被覆蓋了。

針對內存分配時存在的線程安全問題,虛擬機采用了兩種方式來進行處理:

  • CAS+重試機制:通過 CAS 操作移動指針,只有一個線程可以移動成功,移動失敗的線程重試,直到成功為止
  • TLAB (thread local Allocation buffer):也稱為本地線程分配緩沖,這個處理方式思想很簡單,就是當線程開啟時,虛擬機會為每個線程分配一塊較大的空間,然后線程內部創建對象的時候,就從自己的空間分配,這樣就不會有并發問題了,當線程自己的空間用完了才會從堆中分配內存,之后會轉為通過 CAS+重試機制來解決并發問題

以上就是虛擬機解決對象內存分配時存在的線程安全問題的措施。

2.3、初始化零值

初始化零值,顧名思義,就是對分配的這一塊內存初始化零值,也就是給實例對象的成員變量賦于零值,比如 int 類型賦值為 0,引用類型為null等操作。這樣對象就可以在沒有賦值情況下使用了,只不過訪問對象的成員變量都是零值。

2.4、設置頭對象

初始化零值完成之后,虛擬機就會對對象進行必要的設置,比如這個對象是哪個類的實例、如何才能找到類的元數據信息、對象的哈希碼、對象的 GC 分代年齡等信息,這些信息都會存放在對象頭中。這部分數據,官方稱它為“Mark Word”。

在 HotSpot 虛擬機中,對象在內存中存儲的布局可以分為 3 塊區域:對象頭 (Header)、 實例數據 (Instance Data) 和對齊填充位 (Padding)。

以 32 位的虛擬機為例,對象的組成可以用如下圖來簡要概括。(64位的虛擬機略有不同)

圖片圖片

各部分區域功能如下:

  • 對象頭:分為 Mark Word 和元數據區,如果是數組對象,還有記錄數組長度的區域。這三塊保存著對象的 hashCode 值,鎖的狀態,類元數據指針,對象的分代年齡等等信息。
  • 實例數據:顧名思義,用于保存對象成員變量的值,如果變量是引用類型,保存的是內存地址
  • 對齊填充位:因為 HotSpot 虛擬機要求對象的起止地址必須是 8 字節的整數倍,也就是要求對象的大小為 8 字節的整數倍,如果不足  8 字節的整數倍,那么就需要通過對齊填充進行占位,補夠 8 字節的整數倍。

我們重點來看下 Mark Word 的組成,不同的操作系統環境下占用的空間不同,在 32 位操作系統中占 4 個字節,在 64 位中占 8 個字節。

以 32 位操作系統為例,Mark Word 內部結構如下:

圖片圖片

各部分的含義如下:

  • identity_hashcode:25 位的對象標識哈希碼。采用延遲加載技術,調用System.identityHashCode()方法獲取,并會將結果寫到該對象頭中。當對象被鎖定時,該值會移動到管程 Monitor 中。
  • age:4 位的 Java 對象年齡。在GC中,如果對象在 Survivor 區復制一次,年齡增加 1,當對象達到設定的閾值時,將會晉升到老年代。默認情況下,并行 GC 的年齡閾值為 15,并發 GC 的年齡閾值為 6。由于 age 只有4位,所以最大值為15,這就是為什么-XX:MaxTenuringThreshold選項最大值為 15 的原因。
  • lock:2 位的鎖狀態標記位。對象的加鎖狀態分為無鎖、偏向鎖、輕量級鎖、重量級鎖等幾種標記,不同的標記值,表示的含義也不同。
  • biased_lock:對象是否啟用偏向鎖標記,只占 1 個二進制位。為 1 時表示對象啟用偏向鎖,為 0 時表示對象沒有偏向鎖。偏向鎖是一種鎖的優化手段,開啟偏向鎖,某些時候可以省去線程頻繁申請鎖的操作,提升程序執行性能。
  • thread:持有偏向鎖的線程 ID,如果該線程再次訪問這個鎖的代碼塊,可以直接訪問
  • epoch:偏向鎖在 CAS 鎖操作過程中的標識
  • ptr_to_lock_record:在輕量級鎖時,指向棧中鎖記錄的指針
  • ptr_to_heavyweight_monitor:在重量級鎖時,指向管程 Monitor 的指針

其中lock參數中不同的標記值,表示的含義如下。

圖片圖片

lock標記位,通常會在使用到synchronized關鍵字的對象上發揮作用。隨著線程之間競爭激烈程度,對象鎖會從無鎖狀態逐漸升級到重量級鎖,其中的變化過程,可以用如下步驟來概括。

1.初期鎖對象剛創建時,還沒有任何線程來競爭,鎖狀態為 01,偏向鎖標識位是0(無線程競爭它),此時程序執行效率最高。

2.當有一個線程來競爭鎖時,先用偏向鎖,表示鎖對象偏愛這個線程,這個線程要執行這個鎖關聯的任何代碼,不需要再做任何檢查和切換,這種競爭不激烈的情況下,效率也非常高。

3.當有兩個線程開始競爭這個鎖對象時,情況會發生變化,鎖會升級為輕量級鎖,兩個線程公平競爭,哪個線程先占有鎖對象并執行代碼,鎖對象的 Mark Word 就執行哪個線程的棧幀中的鎖記錄。輕量級鎖在加鎖過程中,用到了自旋鎖。所謂自旋,就是指當有另外一個線程來競爭鎖時,這個線程會在原地循環等待,而不是把該線程給阻塞,直到那個獲得鎖的線程釋放鎖之后,這個線程就可以馬上獲得鎖,執行效率有所衰減。

4.如果競爭這個鎖對象的線程越來越多,會導致更多的切換和等待,JVM 會把該對象的鎖升級為重量級鎖。這個就是大家常說的同步鎖,此時對象中的 Mark Word 會再次發生變化,會指向一個監視器 (Monitor) 對象,這個監視器對象用集合的形式來登記和管理排隊的線程。Monitor 依賴操作系統的 MutexLock(互斥鎖)來實現線程排隊,線程被阻塞后便進入內核(Linux)調度狀態,這個會導致系統在用戶態與內核態之間來回切換線程,相比其它級別的鎖,此時鎖的性能最差。

關于synchronized關鍵字原理分析,我們會在后續的文章中再次介紹。

2.5、執行init方法

執行 init 方法是對象創建的最后一步,虛擬機會給對象的成員變量設置用戶指定的初始值,并且會執行構造方法等。

2.6、小結

以上就是對象的創建過程,最后我們通過工具來看下對象創建后的大小。

可以添加第三方jol包,使用它來打印對象的內存布局情況。

<dependency>
   <groupId>org.openjdk.jol</groupId>
   <artifactId>jol-core</artifactId>
   <version>0.9</version>
</dependency>

編寫一個測試類。

public class ObjectHeaderTest {

    public static void main(String[] args) {
        System.out.println("=========打印Object對象的大小========");
        ClassLayout layout = ClassLayout.parseInstance(new Object());
        System.out.println(layout.toPrintable());


        System.out.println("========打印數組對象的大小=========");
        ClassLayout layout1 = ClassLayout.parseInstance(new int[]{});
        System.out.println(layout1.toPrintable());


        System.out.println("========打印有成員變量的對象大小=========");
        ClassLayout layout2 = ClassLayout.parseInstance(new ArtisanTest());
        System.out.println(layout2.toPrintable());
    }

    /**
     * ‐XX:+UseCompressedOops 表示開啟壓縮普通對象指針
     * ‐XX:+UseCompressedClassPointers 表示開啟壓縮類指針
     *
     */
    public static class ArtisanTest {

        int id;        //4B
        String name;   //4B
        byte b;        //1B
        Object o;      //4B
    }
}

輸出結果:

=========打印Object對象的大小========
java.lang.Object object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
     12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

========打印數組對象的大小=========
[I object internals:
 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363)
     12     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
     16     0    int [I.<elements>                             N/A
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

========打印有成員變量的對象大小=========
com.example.thread.o4.ObjectHeaderTest$ArtisanTest object internals:
 OFFSET  SIZE               TYPE DESCRIPTION                               VALUE
      0     4                    (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4                    (object header)                           12 f2 00 f8 (00010010 11110010 00000000 11111000) (-134155758)
     12     4                int ArtisanTest.id                            0
     16     1               byte ArtisanTest.b                             0
     17     3                    (alignment/padding gap)                  
     20     4   java.lang.String ArtisanTest.name                          null
     24     4   java.lang.Object ArtisanTest.o                             null
     28     4                    (loss due to the next object alignment)
Instance size: 32 bytes
Space losses: 3 bytes internal + 4 bytes external = 7 bytes total

三、對象的訪問方式

對象創建完之后,剩下的工作就是使用對象。Java 程序主要通過虛擬機棧上的 reference (引用) 數據來操作堆上的具體對象。

對象的訪問方式有虛擬機實現而定,不同的虛擬機實現訪問方式不同,目前主流的訪問方式有:

  • 句柄訪問
  • 直接指針訪問

3.1、句柄訪問

句柄訪問,虛擬機會在 Java 堆中劃分出一塊內存來作為句柄池,reference 中存儲的就是對象的句柄地址,句柄中則包含了類數據的地址和實例數據的地址信息。

使用句柄方式最大的好處就是,reference 中存儲的是穩定的句柄地址,在對象被移動時(垃圾收集時移動對象是非常普遍的行為),只會改變句柄中的實例數據指針,而 reference 不需要被修改。

圖片圖片

3.2、直接指針訪問

直接指針訪問,reference 中直接存儲的就是對象地址,而對象中存儲了所有的實例數據和類數據的地址。

使用直接指針方式,最大的好處就是速度更快,它節省了一次指針定位的時間開銷。

圖片圖片

就 HotSpot 虛擬機而言,它使用的是直接指針訪問方式來定位對象,從其它虛擬機實現來看,使用句柄訪問方式也是十分常見的。

四、對象的內存分配原則

在之前的 JVM 內存結構布局的文章中,我們介紹到了 Java 堆的內存布局,由 年輕代 (Young Generation) 和老年代 (Old Generation) 組成,默認情況下按照1 : 2的比例來分配空間。

其中年輕代又被劃分為三個不同的區域:Eden 區、From Survivor 區、To Survivor 區,默認情況下按照8 : 1 : 1的比例來分配空間。

Java 堆的內存布局,可以用如下圖來概括。

圖片圖片

當創建的對象不再被使用了是需要被回收掉的,以便騰出空間給新的對象使用,這就是對象的垃圾回收,也就是對象的 GC,我們會在后續的文章中再次介紹對象的垃圾回收算法以及垃圾收集器。

本次我們重點介紹下,創建不同大小的對象,在堆空間中發生的內存分配變化,以便后續更好的理解 GC 調優過程。

4.1、對象優先分配在 Eden 區

默認情況下,創建的對象會優先分配在年輕代的 Eden 區,當 Eden 區不夠用的時候,會觸發一次 Minor GC。

什么是 Minor GC 呢?

Minor GC 指的是 JVM 發生在年輕代的垃圾回收動作,效率高、速度快,但是只清除年輕代的垃圾對象。

與之對應的還有 Major GC 和 Full GC,Major GC 指的是 JVM 發生在老年代的垃圾回收動作,Major GC 的速度一般要比 Minor GC 慢 10 倍以上;同時,許多 Major GC 是由 Minor GC 引起的,因此把這個過程也稱之為 Full GC,也就是對整個堆進行垃圾回收。

當 Eden 區滿了以后,會發生 Minor GC,存活下來的對象會被移動到 Survivor 區,如果 Survivor 區裝不下這批對象,此時會直接移動到老年代。

通常年輕代的對象存活時間都很短,在 Minor GC 后,大部分的對象都會被回收掉,但是也不排除個例情況,存活下來的對象的年齡會進行 +1,當年齡達到 15歲時,也會被移動到老年代。

用戶可以通過-XX:MaxTenuringThreshold參數來調整年齡的閥值,默認是 15,最大值也是 15。

4.2、大對象直接進入老年代

所謂大對象,顧名思義就是占用內存比較多的對象,大對象一般可以直接分配到老年代,這是 JVM 的一種優化設計。

用戶可以手動通過-XX:PretenureSizeThreshold參數設置大對象的大小,默認是 0,意味著任何對象都會優先在年輕代的 Eden 區分配內存。

試想一下,假如大對象優先在 Eden 區中分配,給其它的對象預留的空間就會變小,此時很容易觸發 Minor GC,經過多次 GC 之后,大對象可能會繼續存活,最終還是會被轉移到老年代。

與其如此,還不如直接分配到老年代。

4.3、對象動態年齡判斷機制

對象動態年齡判斷,簡單的說就是對 Survivor 區的對象年齡從小到大進行累加,當累加到 X 年齡(某個年齡)時占用空間的總和大于 50%,那么比 X 年齡大的對象都會移動到老年代。

這種機制是 JVM 的一個預測機制,虛擬機并不是完全要求對象年齡必須達到 15 才能移動到老年代。當 survivor 區快要滿了并且存在一批可能會長期存活的對象,那不如提前進入老年代,減少年輕代的壓力。

用戶可以使用-XX:TargetSurvivorRatio參數來設置保留多少空閑空間,默認值是 50。

4.4、逃逸分析

逃逸分析是一項比較前沿的優化技術,它并不是直接優化代碼的手段,而是為其它優化手段提供了分析技術。

什么是逃逸分析呢?

當一個對象在方法里面被定義后,它可能被外部方法所引用,例如作為調用參數傳遞到其他方法中,這種稱為方法逃逸;甚至還有可能被外部線程訪問到,譬如賦值給可以在其他線程中訪問的實例變量,這種稱為線程逃逸。

如果能證明一個對象不會逃移到方法外或者線程之外,換句話說就是別的方法或線程無法通過任何途徑訪問到這個對象,虛擬機可以通過一些途徑為這個變量進行一些不同程度的優化。

比如棧上分配、同步消除、標量替換等優化操作。

4.4.1、棧上分配

在上文我們提及到,對象會優先在堆上分配,垃圾收集器會定期回收堆內存中不再使用的對象,但這塊的內存回收很耗時。

如果確定一個對象不會逃逸出方法之外,讓這個對象在棧上分配,對象所占用的內存空間就可以隨著棧幀出棧而銷毀,這樣垃圾收集器的壓力將會小很多。

4.4.2、同步消除

線程同步本身是一個相對耗時的操作,如果逃逸分析能夠確定一個變量不會逃逸出線程,無法被其他線程訪問,那么這個變量的讀寫肯定就不會有競爭,此時虛擬機會對這個變量,實施的同步措施進行消除,比如去掉同步鎖來運行方法。

4.4.3、標量替換

標量是指一個數據已經無法再分解成更小的數據來表示了,比如 Java 虛擬機中的原始數據類型(int,long 等數值類型以及 reference 類型)等都不能進一步分解,它們可以稱為標量。相對的,如果一個數據可以繼續分解,那它稱為聚合量。

Java 中最典型的聚合量是對象,如果逃逸分析證明一個對象不會被外部訪問,并且這個對象是可分解的,那程序真正執行的時候將可能不創建這個對象,而改為直接創建它的若干個被這個方法使用到的成員變量來代替,拆散后的變量便可以被單獨分析與優化,可以各自分別在棧幀或寄存器上分配空間,原本的對象就無需整體分配空間了。

默認情況下逃逸分析是關閉的,用戶可以使用-XX:+DoEscapeAnalysis參數來手動開啟逃逸分析。

4.5、小結

綜合以上的內容,對象的內存分配流程,可以用如下圖來概括。

圖片圖片

五、小結

本文主要從虛擬機層面,對對象的創建過程,訪問方式以及內存分配時的空間變化進行了一次知識整合和總結,如果有描述不對的地方,歡迎大家留言指出,不勝感激。

六、參考

1.https://zhuanlan.zhihu.com/p/267223891

2.https://zhuanlan.zhihu.com/p/401057707

3.https://www.cnblogs.com/xrq730/p/4827590.html

4.https://www.jianshu.com/p/3d38cba67f8b

6.https://blog.csdn.net/clover_lily/article/details/80095580

7.https://blog.csdn.net/FIRE_TRAY/article/details/51275788

8.https://blog.csdn.net/yb970521/article/details/108015984

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2020-03-08 16:45:58

數據挖掘學習數據量

2009-11-09 12:55:43

WCF事務

2021-04-20 13:59:37

云計算

2022-02-17 09:24:11

TypeScript編程語言javaScrip

2024-01-16 07:46:14

FutureTask接口用法

2024-08-30 08:50:00

2020-06-30 10:45:28

Web開發工具

2024-01-12 07:38:38

AQS原理JUC

2021-02-03 14:31:53

人工智能人臉識別

2024-07-05 09:31:37

2024-08-05 09:05:44

2024-09-13 08:49:45

2017-01-18 15:38:20

語言

2019-07-18 17:08:56

物聯網技術軟件

2024-06-06 08:50:43

2020-07-21 07:42:29

數據庫信息技術

2024-12-06 11:22:27

2024-05-16 11:13:16

Helm工具release

2015-10-23 17:47:32

BaaSPaaS移動中間件

2024-12-18 10:24:59

代理技術JDK動態代理
點贊
收藏

51CTO技術棧公眾號

五月婷婷激情久久| 狠狠色综合色区| 亚洲成人黄色av| 九九九精品视频| 亚洲精品视频自拍| 极品日韩久久| 国产一区二区女内射| 午夜精品久久| 亚洲毛片在线看| 中文字幕久久av| 都市激情久久综合| 久久久久久免费| 亚洲一区中文字幕在线观看| 日韩精品在线不卡| 青青草91久久久久久久久| 日韩欧美亚洲国产精品字幕久久久| 国精产品一区一区三区视频| 国产无套粉嫩白浆在线2022年| 国产精品一区二区三区四区 | 国产在线观看a| 99精品视频在线免费观看| 国产精品久久久久一区二区| 国产一级久久久| 欧美丰满日韩| 亚洲欧美激情一区| 无码成人精品区在线观看| ww久久综合久中文字幕| 亚洲国产视频a| 一区二区三区av在线| 深夜福利视频在线观看| 国产精品原创巨作av| 国产精品入口免费视| 国产区在线观看视频| 自拍偷拍欧美| 最近2019年好看中文字幕视频| 欧美xxxxx精品| 日本伊人久久| 欧美视频在线一区| 国产av天堂无码一区二区三区| 国产黄大片在线观看画质优化| 久久久无码精品亚洲日韩按摩| 国产久一道中文一区| 91精品人妻一区二区三区果冻| 欧美一级二区| **欧美日韩vr在线| 久久久久久蜜桃| 欧美一区二区三区久久精品茉莉花 | 99久久免费国产精精品| 老色鬼精品视频在线观看播放| 26uuu另类亚洲欧美日本老年| 亚洲一区二区91| 欧美片第1页综合| 久久久精品在线| 蜜桃av.com| 欧美日韩中文字幕一区二区三区 | y111111国产精品久久婷婷| 一级日韩一级欧美| 男男视频亚洲欧美| 国产精品欧美久久久| 区一区二在线观看| 久久久蜜桃一区二区人| 热99精品里视频精品| 91国产丝袜播放在线| 伊人久久大香线蕉综合热线| 久久久久这里只有精品| 久久久.www| 亚洲黄色大片| 97色在线播放视频| 久久久久久久久影院| 亚洲欧美日韩在线观看a三区 | 性欧美video另类hd尤物| 欧美日韩亚洲不卡| 亚洲免费av一区| 国产精品成人3p一区二区三区| 538在线一区二区精品国产| 天天av天天操| 福利片一区二区| 日韩经典一区二区三区| 中文字幕高清视频| 精品国产乱码| 久久这里只有精品99| 久久免费播放视频| 日韩香蕉视频| 国产精品高潮在线| 国产乱人乱偷精品视频| 成人一区二区在线观看| 欧美黑人3p| av二区在线| 一区二区三区四区在线免费观看| 精品丰满人妻无套内射| 在线观看精品| 欧美大片在线观看一区| 国产吞精囗交久久久| 久久一区二区三区喷水| 午夜精品一区二区三区视频免费看| 国产精品国产三级国产专区52| 青娱乐精品在线视频| 99九九电视剧免费观看| 免费av在线电影| 亚洲欧美激情在线| 国产乱子伦农村叉叉叉| 青青在线精品| 亚洲国产高清自拍| 国产美女免费无遮挡| 天天射天天综合网| 性色av香蕉一区二区| 最新黄色网址在线观看| 成人一道本在线| 亚洲欧洲久久| 理论片午夜视频在线观看| 欧美片在线播放| 天堂久久久久久| 亚洲免费二区| 国产97在线视频| 亚洲男人天堂久久| 欧美激情一区二区三区蜜桃视频| 日本男女交配视频| 久久天堂影院| 亚洲免费电影一区| 久久久久97国产| 激情五月激情综合网| 国产日韩在线一区二区三区| 久久久久久久久免费视频| 欧美日韩亚洲精品内裤| 欧美xxxx日本和非洲| 视频在线不卡免费观看| 国产999精品久久久| 天天色综合av| 夜夜爽夜夜爽精品视频| 8x8x成人免费视频| 国产乱码精品一区二区三区四区| 高清欧美性猛交| 国产av无码专区亚洲av| 国产精品久久久久一区二区三区| 黑人糟蹋人妻hd中文字幕| 亚洲乱码一区| 久久成人精品一区二区三区| 中文字幕av网站| 国产欧美中文在线| 欧美日韩亚洲一| 美女视频亚洲色图| 久久99久久亚洲国产| 97免费观看视频| 国产精品白丝在线| 国产一伦一伦一伦| 久久精品国产68国产精品亚洲| 日韩av手机在线看| 手机亚洲第一页| 日韩欧美黄色动漫| 久久中文字幕人妻| 母乳一区在线观看| 久久综合九色99| 国产日韩电影| 亚洲人成网站色ww在线| 精品人妻无码一区二区性色| 91亚洲大成网污www| 国产精品网站免费| 午夜欧洲一区| 国产精品99久久久久久人| 欧洲亚洲在线| 欧美性感一区二区三区| 一级片久久久久| 乱一区二区av| 蜜臀av性久久久久蜜臀av| 国产日韩一区二区三免费高清| 日韩亚洲欧美成人| 99国产精品99| 亚洲成人av免费| 国产成人无码一区二区在线观看| 性欧美xxxx大乳国产app| 热re99久久精品国99热蜜月| 国产欧美自拍| 欧美激情精品久久久久久大尺度 | 中文字幕视频网站| 国产精品久久综合| 黄色片免费网址| 99国产精品久久久久久久| 欧美日韩一区二区三区免费| 欧美不卡高清一区二区三区| 久久精品视频在线播放| 精品国产伦一区二区三区| 婷婷亚洲久悠悠色悠在线播放| 中文字幕在线1| 久久国产精品99久久久久久老狼| 日本一二三区视频在线| 国产成人一二片| 国产精品999999| 色女人在线视频| 亚洲美女中文字幕| 国产又爽又黄免费软件| 亚洲成av人片观看| 国产精品成人无码免费| 国产美女一区二区| 国产美女三级视频| 午夜激情久久| 久久精品国产精品青草色艺| 日韩成人精品一区二区三区| 97高清免费视频| 日本精品一区二区三区在线播放| 精品久久久久久久久久久久久久久久久 | 日韩一区二区三区精品视频| 亚洲天堂av片| 亚洲激情一二三区| 日韩欧美黄色网址| 99久久国产综合精品色伊| 可以看污的网站| 亚洲欧美高清| 国产乱淫av片杨贵妃| 四虎成人av| 久久亚洲一区二区| 免费观看亚洲视频大全| 国产精品激情av电影在线观看| 欧美videosex性极品hd| 色噜噜狠狠色综合网图区| 天堂av电影在线观看| 日韩欧美美女一区二区三区| 特级西西444www高清大视频| 天天av天天翘天天综合网色鬼国产| 成人自拍小视频| 久久精品人人爽人人爽| 大尺度做爰床戏呻吟舒畅| 国产一区二区精品久久91| 天天色综合天天色| 免费看亚洲片| www.中文字幕在线| 国产精品sm| 亚洲av首页在线| 婷婷激情综合| 亚洲免费久久| japanese国产精品| 日韩国产欧美一区| 免费毛片在线不卡| 国产一区喷水| 91精品久久久久久综合五月天| 欧美最猛性xxxxx免费| 国精一区二区三区| 一区二区亚洲欧洲国产日韩| 狠狠v欧美ⅴ日韩v亚洲v大胸| 欧美mv日韩mv亚洲| 国产一区二区三区在线观看 | 日韩在线免费视频观看| 免费观看成年在线视频网站| 精品少妇一区二区三区免费观看| 艳妇乳肉豪妇荡乳av无码福利 | 国产日本亚洲| 91精品久久久久久久久青青| 九色91在线| 国内精品小视频| 18视频在线观看网站| 久久久精品欧美| 青青草原av在线| 欧美成人第一页| 老司机午夜在线| 欧美美女15p| 神马午夜伦理不卡 | 久草在线资源福利站| 欧美激情亚洲精品| 欧美xxxx少妇| 欧美精品在线免费观看| 亚洲大胆人体大胆做受1| 久久精品国产亚洲精品| 免费在线观看av| 欧美理论电影在线播放| 天天干在线视频论坛| 欧美精品在线极品| 欧美裸体视频| 欧美最猛性xxxx| 成人日韩精品| 成人羞羞国产免费| 国产亚洲精aa在线看| 亚洲aⅴ男人的天堂在线观看| 国产香蕉久久| 91嫩草在线视频| 国产一区二区av在线| 国产精品视频色| 免费观看在线一区二区三区| 99porn视频在线| 久久精品国产亚洲5555| 日韩精品一区二区三区外面| 蜜臀久久99精品久久一区二区| 欧美一区二区三区四区五区六区| 91九色精品| 好吊色视频988gao在线观看| 国一区二区在线观看| 日韩手机在线观看视频| 麻豆一区二区三区| 中文字幕一区二区在线观看视频| 久久成人麻豆午夜电影| 中国男女全黄大片| 久久亚洲综合色一区二区三区| 中文字幕第4页| 亚洲免费观看在线观看| 日韩视频免费观看高清| 色老汉av一区二区三区| 精品国产黄色片| 亚洲精品久久久一区二区三区| 黄色的视频在线免费观看| 久久天堂电影网| www.超碰在线| 国产精品综合久久久| 欧美aaaaaaaa牛牛影院| 视频一区二区三区在线观看| 亚洲高清影视| 黄色www网站| 日韩国产欧美在线视频| 精品伦一区二区三区| 久久久蜜桃精品| 97精品在线播放| 日韩欧美中文字幕在线观看 | 欧美日韩一区国产| 婷婷伊人综合中文字幕| 最近中文字幕日韩精品| 欧美78videosex性欧美| 国产区精品在线观看| 久9re热视频这里只有精品| 日韩精品一区二区三区色偷偷| 亚洲黄页一区| 久久久久久久久久一区| 91丨九色丨蝌蚪丨老版| 中文字幕av免费在线观看| 色综合久久久久综合99| 性生交生活影碟片| 精品国产一区二区三区久久狼5月| 国产夫妻在线| 国产美女精品视频| 在线观看欧美理论a影院| 女女百合国产免费网站| 欧美亚洲一区二区三区| 中文字幕精品视频在线| 综合在线观看色| 无码人妻久久一区二区三区| 亚洲成年人影院在线| av在线网址观看| 欧美自拍大量在线观看| 日韩aaa久久蜜桃av| 欧美极品少妇无套实战| 亚洲精品123区| 日本少妇xxxx| 一区二区三区中文字幕电影 | 欧美日韩国产在线一区| 99sesese| 国产精品久久久久久久岛一牛影视| 中文字幕超碰在线| 精品国产乱码久久| xxx.xxx欧美| 亚洲free嫩bbb| 欧洲乱码伦视频免费| www.涩涩涩| 国产欧美一区二区精品秋霞影院| 亚洲高清在线看| 国产亚洲人成a一在线v站| 日本不良网站在线观看| 国产综合av一区二区三区| 国产真实久久| 亚洲午夜精品在线观看| 亚洲高清不卡在线观看| 国产永久免费视频| 在线观看欧美成人| 波多野结衣久久精品| 久久亚裔精品欧美| 日韩有码一区二区三区| 麻豆精品免费视频| 欧美小视频在线观看| 国产二区视频在线观看| 国产精品旅馆在线| 日本女优一区| www.激情小说.com| 国产精品久久久久久久第一福利| 亚洲视频久久久| 久久精品国产免费观看| 99蜜月精品久久91| 曰韩不卡视频| 韩国视频一区二区| 国产1区2区3区4区| 欧美v国产在线一区二区三区| 国产伦子伦对白在线播放观看| 国产一区福利视频| 91久久久久| 37p粉嫩大胆色噜噜噜| 亚洲成年人影院| 国产中文字幕在线播放| 国产精品青草久久久久福利99| 亚洲九九视频| 在线精品视频播放| 精品久久久在线观看| 在线中文资源天堂| 51国产成人精品午夜福中文下载| 欧美午夜一区| 免费在线观看污| 91精品国产综合久久蜜臀| 乱馆动漫1~6集在线观看| 日韩精品极品视频在线观看免费| 国产精品综合视频| 国产性xxxx高清| 一夜七次郎国产精品亚洲| 欧美日韩黄色| 男人操女人免费软件| 亚洲美女偷拍久久| 亚洲欧美日韩精品永久在线| 国产精品一二区|