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

深入淺出解析JVM中的Safepoint

開發 前端
Safepoint在一定程度上是可以理解成是為了讓所有用戶線程停頓(Stop The World)而設計的。STW對應用系統來說是一件很可怕的事情,JVM不論是在GC還是在其他的VM操作上都在努力避免STW和減少STW時間。

1、初識Safepoint-GC中的Safepoint

最早接觸JVM中的安全點概念是在讀《深入理解Java虛擬機》那本書垃圾回收器章節的內容時。相信大部分人也一樣,都是通過這樣的方式第一次對安全點有了初步認識。不妨,先復習一下《深入理解Java虛擬機》書中安全點那一章節的內容。

書中是在講解垃圾收集器-垃圾收集算法的章節引入安全點的介紹,為了快速準確地完成GC Roots枚舉,避免為每條指令都生成對應的OopMap造成大量存儲空間的浪費,只在“特定的位置”生成對應的OopMap,這些位置被稱為安全點。然后,書中提到了安全點位置的選擇標準是:是否能讓程序長時間執行;所以會在方法調用、循環跳轉、異常跳轉等處才會產生安全點。

書中還提到了JVM如何在GC時讓用戶線程在最近的安全點處停頓下來:搶先式中斷和主動式中斷。搶先式中斷不需要線程的執行代碼主動去配合,在GC發生時,系統首先把所有用戶線程全部中斷,如果發現有用戶線程中斷的地方不在安全點上,就恢復這條線程執行,讓它一會再重新中斷,直到跑到安全點上。而主動式中斷的思想是當GC需要中斷線程時,不直接對線程操作,僅僅簡單地設置一個標志位,各個線程執行過程時不停地主動去輪詢這個標志,一旦發現中斷標志為真就自己在最近的安全點上主動中斷掛起。現在基本上所有虛擬機實現都采用主動式中斷方式來暫停線程響應GC事件。

總結一下初識安全點學到的知識點:

  • JVM GC時需要讓用戶線程在安全點處停頓下來(Stop The World)
  • JVM會在方法調用、循環跳轉、異常跳轉等處放置安全點
  • JVM通過主動中斷方式到達全局STW:設置一個標志位,各個線程執行過程時不停地主動去輪詢這個標志,一旦發現中斷標志為真就自己在最近的安全點上主動中斷掛起。

以上基本上就是《深入理解Java虛擬機》這本書對JVM安全點的所有介紹了,當時覺得安全點還是很好理解,認為安全點就是在垃圾回收時為了STW而設計的。

后來發現,經過一些線上問題和網上看到有關安全點有趣的示例,發現安全點其實也不簡單,不只有GC才會用到安全點;簡單的代碼如果寫的不當,安全點也會帶來一些莫名其妙的問題;其在JVM內部的實現以及JIT對它的優化,也經常讓人摸不著頭腦。本文嘗試在初識安全點后已知知識點的基礎上,通過一段簡單的示例代碼,多問幾個為什么,來進一步更全面的了解一下安全點。

2、通過一段示例代碼深入剖析Safepoint

2.1  示例代碼

這段示例代碼可直接復制到本地運行,本文所有對示例代碼的運行環境都是jdk 1.8。

public class SafePointTest {


    public static AtomicInteger counter = new AtomicInteger(0);


    public static void main(String[] args) throws Exception{
        long startTime = System.currentTimeMillis();
        Runnable runnable = () -> {
            System.out.println(interval(startTime) + "ms后," + Thread.currentThread().getName() + "子線程開始運行");
            for(int i = 0; i < 100000000; i++) {
                counter.getAndAdd(1);
            }
            System.out.println(interval(startTime) + "ms后," + Thread.currentThread().getName() + "子線程結束運行, counter=" + counter);
        };


        Thread t1 = new Thread(runnable, "zz-t1");
        Thread t2 = new Thread(runnable, "zz-t2");


        t1.start();
        t2.start();


        System.out.println(interval(startTime) + "ms后,主線程開始sleep.");


        Thread.sleep(1000L);


        System.out.println(interval(startTime) + "ms后,主線程結束sleep.");
        System.out.println(interval(startTime) + "ms后,主線程結束,counter:" + counter);
    }


    private static long interval(Long startTime) {
        return System.currentTimeMillis() - startTime;
    }
}

示例代碼中主線程啟動兩個子線程,然后主線程睡眠1s,通過打印時間來觀察主線程和子線程的執行情況。

按道理來說這里主線程和兩個子線程獨立并發,沒有任何顯性的依賴,主線程的執行是不會受子線程影響的:主線程睡眠結束后會直接結束。但是執行結果卻和期望不一樣。

執行結果如下方動圖展示:

圖片

從執行結果看,主線程在啟動兩個線程后進入睡眠狀態,代碼中指定睡眠時間為1s,但是主線程卻在3s多之后才睡眠結束。是什么導致了主線程睡過頭了呢,從結果來看主線程睡覺結束時間和子線程結束時間是一致的。所以,我們有理由懷疑主線程沒有按時提前結束應該是被兩個子線程阻塞了。

2.2  先給結論

由于VMThread的某些操作需要STW,主線程在sleep結束前進入了JVM全局安全點,然后主線程要等待其他線程全部進入安全點,所以主線程被長時間沒有進入安全點的其他線程給阻塞了。

2.3  驗證結論

添加JVM打印安全點日志參數-XX:+PrintSafepointStatistics后再執行上面的實例代碼,結果如下截圖:

圖片

可以從安全點日志中看到,JVM想要執行no vm operation,這個操作需要線程進入安全點,整個期間有12個線程,正在運行的線程有兩個,需要等待這兩個線程進入安全點,等待耗時2251ms。

加上 -XX:+SafepointTimeout 和-XX:SafepointTimeoutDelay=2000 參數后執行代碼可以進一步看等待哪兩個線程進入安全點。

圖片

果然和猜測的一樣,沒有到達安全點的兩個線程正是示例代碼中定義的zz-t1和zz-t2線程。

2.4  為什么

到這里這個示例的執行結果的原因已經有了結論并且得到了驗證,基本上已經知其然了。但是如果深入思考一下,初識安全點時學到的知識點還不能解釋,所以為了知其所以然,這里提了幾個為什么。

(1)為什么會進入安全點

換句話問,是什么觸發了進入安全點?

由初識安全點得到的基礎知識知道進入安全點需要兩個條件:

  • JVM操作設置了主動中斷標志
  • 運行的代碼中存在安全點

首先想到的是GC觸發JVM設置主動中斷標志,加上 -XX:-PrintGC再執行示例代碼并沒有打印 GC 日志,可以排除掉GC。

既然不是GC,還是再回到安全點日志上尋找線索吧,發現有個vmop(虛擬機操作類型):no vm operation,關于no vm operation,網上有大神通過解析JVM源碼得到了結論,這里不對JVM源碼展開做詳細解讀,直接給結論:

在 JVM 正常運行的時候,如果設置了進入安全點的間隔,就會隔一段時間判斷是否有代碼緩存要清理,如果有,會進入安全點。這個觸發條件不是 VM 操作,所以會將 _vmop_type 設置成-1,輸出日志的時候打印對應的 「no vm operation」,也就是我們看到的安全點日志。

在 VM 操作為空的情況下,只要滿足以下 3 個條件,也是會進入安全點的:

1、VMThread 處于正常運行狀態

2、設置了進入安全點的間隔時間

3、SafepointALot 是否為 true 或者是否需要清理

用 Java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal 2>&1 | grep Safepoint 命令查看 JVM 關于安全點的默認參數:

圖片

發現 GuaranteedSafepointInterval 默認設置成了 1 秒,每隔1s就會嘗試進入安全點。

那么,修改GuaranteedSafepointInterval參數值,看看是否能阻止進入安全點。

GuaranteedSafepointInterval參數是JVM診斷參數,修改這個參數的值,需要配合-XX:+UnlockDiagnosticVMOptions一起使用。

另外不建議在線上對這個參數的值做修改。

  • 關閉定時進入安全點

通過 -XX:GuaranteedSafepointInterval = 0 關閉定時進入安全點,看看代碼運行結果是怎么樣的

圖片

由運行結果可以看出,關閉定時進入安全點后,主線程睡眠1s后正常結束,不受其他線程阻塞。從安全點日志看,之前等待進入安全點的兩個線程也沒有了。

  • 調大定時進入安全點間隔時間

由打印的執行結果可以看到子線程運行時間是3s多,如果把進入安全點間隔時間調整為5s,即在子線程結束之后再嘗試進入安全點是不是也能避免等待子線程進入安全點呢?

修改參數-XX:GuaranteedSafepointInterval = 5000 調整安全點間隔時間再次執行結果:

圖片

從執行結果可以看出,調大安全點間隔時間和關閉定時進入安全點的效果是一樣的,也可以避免等待子線程進入安全點的。

(2)主線程是在哪里進入的安全點

從示例代碼在默認JVM參數執行結果看,主線程睡眠時間超過了3s,事實上主線程是在Thread.sleep()方法內部進入安全點。這里對JVM 安全點實現的源碼簡單做一下分析:

Safepoint實現源代碼:Safepoint.cpp

圖片

讀源碼太費勁,看注釋吧,所幸從注釋中也能找到答案。上面截圖的注釋說在程序進入 Safepoint 的時候,Java 線程可能正處于的五種不同的狀態,針對不同的狀態的不同處理機制。假設現在有一個操作觸發了某個 VM 線程所有線程需要進入 SafePoint,如果其他線程現在:

  • 運行字節碼:運行字節碼時,解釋器會看線程是否被標記為 poll armed,如果是,VM 線程調用 SafepointSynchronize::block(JavaThread *thread)進行 block。
  • 運行 native 代碼:當運行 native 代碼時,VM 線程略過這個線程,但是給這個線程設置 poll armed,讓它在執行完 native 代碼之后,它會檢查是否 poll armed,如果還需要停在 SafePoint,則直接 block。
  • 運行 JIT 編譯好的代碼:由于運行的是編譯好的機器碼,直接查看本地 local polling page 是否為臟,如果為臟則需要 block。這個特性是在 Java 10 引入的 JEP 312: Thread-Local Handshakes 之后,才是只用檢查本地 local polling page 是否為臟就可以了。
  • 處于 BLOCK 狀態:在需要所有線程需要進入 SafePoint 的操作完成之前,不許離開 BLOCK 狀態
  • 處于線程切換狀態或者處于 VM 運行狀態:會一直輪詢線程狀態直到線程處于阻塞狀態(線程肯定會變成上面說的那四種狀態,變成哪個都會 block 住)。

再看一下Thread.sleep方法的聲明,就和上面Safepoint.cpp源碼注釋截圖紅框對上了,Thread.sleep正是一個native方法。

圖片

Thread.sleep(0)在RocketMQ中的妙用

圖片

上面這段代碼是RocketMQ的一段代碼,16年最早版本的實現for循環內每循環1000次會調用一次Thread.sleep(0),這貌似是一段無用的代碼,作者真實的目的是為了在這里放置一個安全點,避免for循環運行時間過長導致系統長時間SWT。從代碼的變更記錄看,22年9月份有人對這段代碼換了一種寫法:把for循環變量類型定義成long型,同時注釋掉了循環內部Thread.sleep(0)代碼,為什么可以這樣寫以及為什么要這樣寫這里先按下不表。

(3)子線程為什么無法進入安全點

現在已經知道了主線程為什么進入會進入安全點,以及主線程在哪里進入的安全點,按照已知知識點JVM會在循環跳轉處和方法調用處放置安全點,為什么子線程沒有進入安全點?

可數循環和不可數循環

JVM為了避免安全點過多帶來過重的負擔,對循環有一項優化措施,認為循環次數較少的話,執行時間應該不會太長,所以使用int類型和范圍更小的數據類型作為索引值的循環默認是不會被放置安全點的。這種循環被稱為可數循環,相對應的,使用long或者范圍更大的數據類型作為索引值的循環就被稱為不可數循環,將被放置安全點。

在示例代碼中,子線程的循環索引值數據類型是int,也就是可數循環,所以JVM沒有在循環跳轉處放置安全點。

把循環索引值數據類型改成long型,循環成為不可數循環,就能夠成功在循環跳轉處放置安全點,避免子線程長時間無法進入安全點阻塞主線程。

圖片

圖片

從上面的執行結果可以看到,把循環索引值數據類型改成long型,主線程在睡眠1s之后立即結束了睡眠,并沒有等待子線程的執行。

到這里,也就知道為什么上面貼的RocketMQ大那段代碼,把循環索引值數據類型改成long型可以替換循環內部Thread.Sleep(0)達到放置安全點的目的了。

其實,還可以通過-XX:+UseCountedLoopSafepoints參數關閉JVM 對可數循環放置安全點的優化。下面的執行結果可以看出,添加了-XX:+UseCountedLoopSafepoints參數后,也能讓運行結果到達預期。

圖片

還有一個疑惑

圖片

仔細看實例代碼,發現子線程循環體內調用了AtomicInteger類的getAndAdd方法,再深入看jdk getAndAdd方法的實現,發現底層是調用了sun.misc.Unsafe#getIntVolatile 這個方法和Thread.sleep方法一樣,也是一個native方法,為什么這里沒有進入像Thread.sleep方法一樣進入安全點?

是的,好可怕,確實被優化了,被 JIT給優化了。為了驗證是被JIT優化了,可以用

-Djava.compiler=NONE關閉JIT然后看一下運行結果。

圖片

從運行結果看,關閉了JIT優化后,主線程確實在睡眠1s后立即結束了,不過子線程運行的時間比JIT優化開啟時多了不少。所以,JIT還是能夠帶來一定的性能優化的,有時也會帶來一些奇怪的現象。

3、更全面的安全點定義

區別于初識安全點的時候局限于GC中的安全點概念,這里給安全點一個比較全面的定義:

Safepoint 可以理解成是在代碼執行過程中的一些特殊位置,當線程執行到這些位置的時候,線程可以暫停。在 SafePoint 保存了其他位置沒有的一些當前線程的運行信息,供其他線程讀取。這些信息包括:線程上下文的任何信息,例如對象或者非對象的內部指針等等。我們一般這么理解 SafePoint,就是線程只有運行到了 SafePoint 的位置,他的一切狀態信息,才是確定的,也只有這個時候,才知道這個線程用了哪些內存,沒有用哪些;并且,只有線程處于 SafePoint 位置,這時候對 JVM的堆棧信息進行修改,例如回收某一部分不用的內存,線程才會感知到,之后繼續運行,每個線程都有一份自己的內存使用快照,這時候其他線程對于內存使用的修改,線程就不知道了,只有再進行到 SafePoint 的時候,才會感知。

4、什么時候會進入Safepoint

當VM Thread需要做vm  操作時會讓線程進入安全點,vm操作類型有很多,可以參考VM_OP_ENUM源碼 vmOperations.hpp。下面是幾種經常發生的進入Safepoint的情形:

(1)GC:由于需要每個線程的對象使用信息,以及回收一些對象,釋放某些堆內存或者直接內存,所以需要 進入Safepoint來 Stop the world;

(2)定時進入 SafePoint:每經過-XX:GuaranteedSafepointInterval 配置的時間,都會讓所有線程進入 Safepoint,一旦所有線程都進入,立刻從 Safepoint 恢復。這個定時主要是為了一些沒必要立刻 Stop the world 的任務執行,可以設置-XX:GuaranteedSafepointInterval=0關閉這個定時。

(3)由于 jstack,jmap 和 jstat 等命令,會導致 Stop the world:這種命令都需要采集堆棧信息,所以需要所有線程進入 Safepoint 并暫停。

(4)偏向鎖取消:鎖大部分情況是沒有競爭的(某個同步塊大多數情況都不會出現多線程同時競爭鎖),所以可以通過偏向來提高性能。即在無競爭時,之前獲得鎖的線程再次獲得鎖時,會判斷是否偏向鎖指向我,那么該線程將不用再次獲得鎖,直接就可以進入同步塊。但是高并發的情況下,偏向鎖會經常失效,導致需要取消偏向鎖,取消偏向鎖的時候,需要 Stop the world,因為要獲取每個線程使用鎖的狀態以及運行狀態。

(5)Java Instrument 導致的 Agent 加載以及類的重定義:由于涉及到類重定義,需要修改棧上和這個類相關的信息,所以需要 Stop the world

(6)Java Code Cache相關:當發生 JIT 編譯優化或者去優化,需要 OSR 或者 Bailout 或者清理代碼緩存的時候,由于需要讀取線程執行的方法以及改變線程執行的方法,所以需要 Stop the world

5、避免Safepoint副作用

Safepoint在一定程度上是可以理解成是為了讓所有用戶線程停頓(Stop The World)而設計的。STW對應用系統來說是一件很可怕的事情,JVM不論是在GC還是在其他的VM操作上都在努力避免STW和減少STW時間。

安全點最主要的副作用就是可能導致STW時間過長,應該極力避免這點副作用。

對第一個進入安全點的線程來說,STW是從它進入安全點開始的,如果有某個線程一直無法進入安全點就會導致進入安全點的時間一直處于等待狀態,進而導致STW的時間過長。所以,應避免線程執行過長無法進入安全點的情況。

可數循環體內執行時間過長以及JIT優化導致無法進入安全點的問題是最常見的無法進入安全點的情況。在寫大循環的時候可以把循環索引值數據類型定義成long。

在高并發應用中,偏向鎖并不能帶來性能提升,反而因為偏向鎖取消帶來了很多沒必要的某些線程進入安全點 。所以建議關閉:-XX:-UseBiasedLocking。

jstack,jmap 和 jstat 等命令,也會導致進入安全點。所以,生產環境應該關閉Thead dump的開關,避免dump時間過長導致應用STW時間過長。

參考文獻:

[1] 《深入理解java虛擬機》

[2]http://psy-lob-saw.blogspot.com/2015/12/safepoints.html

[3]https://xie.infoq.cn/article/a80542aca7ad53efaaab1a27a

[4]https://zhuanlan.zhihu.com/p/161710652

責任編輯:武曉燕 來源: 得物技術
相關推薦

2021-10-05 20:29:55

JVM垃圾回收器

2021-03-16 08:54:35

AQSAbstractQueJava

2011-07-04 10:39:57

Web

2019-10-10 16:25:02

JVM數據多線程

2023-01-06 12:50:46

ChatGPT

2022-03-23 18:58:11

ZookeeperZAB 協議

2019-11-11 14:51:19

Java數據結構Properties

2009-11-30 16:46:29

學習Linux

2022-12-02 09:13:28

SeataAT模式

2021-07-20 15:20:02

FlatBuffers阿里云Java

2017-07-02 18:04:53

塊加密算法AES算法

2019-01-07 15:29:07

HadoopYarn架構調度器

2012-05-21 10:06:26

FrameworkCocoa

2022-09-26 09:01:15

語言數據JavaScript

2023-05-18 08:54:22

OkHttp源碼解析

2014-07-24 09:08:07

大數據平臺架構

2019-11-21 09:16:14

OpenStack安全組MAC

2010-01-27 16:13:43

2023-03-20 09:48:23

ReactJSX

2009-12-25 15:49:43

Linux rescu
點贊
收藏

51CTO技術棧公眾號

www.香蕉视频| 中文字幕无人区二| av资源网站在线观看| 校园激情久久| 一本色道久久88综合日韩精品| 自慰无码一区二区三区| 免费国产在线观看| 久久99国产精品成人| 欧美大片在线看免费观看| 日本在线不卡一区二区| 丝袜美腿一区| 亚洲嫩草精品久久| 蜜桃麻豆www久久国产精品| 这里只有精品9| 一区在线视频| 中文字幕精品久久久久| 亚洲成人福利视频| 婷婷六月国产精品久久不卡| ...中文天堂在线一区| 国产一区二区三区色淫影院| 一级久久久久久久| 亚洲国产高清一区二区三区| 最新国产精品拍自在线播放| 国产视频久久久久久| 亚洲一区av| 色天天综合色天天久久| 最新av网址在线观看| 黄色片在线播放| 国产成人精品免费| 国产日韩欧美中文| 中文字幕亚洲高清| 欧美一区成人| 国产亚洲欧洲高清| 加勒比精品视频| 精品一区二区三区在线观看视频| 在线视频一区二区三| 国产精品50p| 欧美黄色视屏| 亚洲三级在线免费观看| 日韩精品久久一区| 少妇喷水在线观看| 国产aⅴ综合色| 成人国产精品免费视频| 香蕉影院在线观看| 亚洲精品日韩久久| 欧美日韩国产123| 26uuu成人网| 国产精品视频一区二区三区四蜜臂| 日韩女优视频免费观看| 99九九精品视频| 成人精品高清在线视频| 色哟哟国产精品| 成人在线免费观看av| 国产极品人妖在线观看| 亚洲老妇xxxxxx| a级黄色片网站| 日本激情视频在线观看| 国产拍欧美日韩视频二区| 噜噜噜噜噜久久久久久91| 五月激情婷婷综合| 99re热这里只有精品视频| 成人av男人的天堂| 亚洲爆乳无码一区二区三区| 国产精品1024| http;//www.99re视频| 国产成人精品a视频| 国产精品综合在线视频| 国产精品偷伦一区二区| 国产亚洲欧美在线精品| 久色成人在线| 国产精品视频不卡| 国产91国语对白在线| 日韩高清在线一区| 国产精品亚洲欧美导航| 国产精品嫩草影院精东| 国产高清成人在线| 国产 高清 精品 在线 a| 黄色aaa毛片| 91在线看国产| 日韩一本精品| 黄色免费在线看| 亚洲精品老司机| 国产精品又粗又长| 电影一区二区三| 欧美中文字幕一区二区三区亚洲| 午夜国产一区二区三区| 亚洲狼人在线| 精品国产乱码久久久久久图片 | 性网站在线观看| 亚洲午夜免费电影| 凹凸日日摸日日碰夜夜爽1| 91大神在线观看线路一区| 在线综合+亚洲+欧美中文字幕| 91网址在线观看精品| 麻豆成人入口| 在线精品91av| 久久久久久久久久99| 亚洲少妇一区| 国产日韩欧美在线| 欧美一级性视频| 久久久精品tv| 欧美做暖暖视频| 伊人久久av| 欧美一区二区三区公司| 99久久人妻无码中文字幕系列| 欧美最新另类人妖| 欧美激情在线一区| 特级西西444www大胆免费看| 国产福利不卡视频| 日本婷婷久久久久久久久一区二区 | 日韩一级片网站| 国产麻豆xxxvideo实拍| 91一区在线| 69国产精品成人在线播放| 91麻豆成人精品国产| 97国产一区二区| 久久国产精品免费观看| 欧美精品总汇| 亚洲第一区中文99精品| 亚洲精品久久久久久国| 亚洲欧美日韩视频二区| 爱情岛论坛亚洲入口| 国产精品视频一区二区久久| 亚洲国产一区视频| 午夜精品免费看| 久久最新网址| 97国产真实伦对白精彩视频8| 一区二区三区黄| 久久久久国产成人精品亚洲午夜| 草草草视频在线观看| 国产美女久久| 亚洲欧美一区二区精品久久久 | 欧美日韩在线视频首页| 一级网站在线观看| 日韩在线综合| 国产精品第100页| 天堂v视频永久在线播放| 一区二区三区四区五区视频在线观看 | 欧美一区二区三区另类| 国产精品精品久久久| 欧美精品久久久久久久久久丰满| 一区二区三区小说| 欧美又黄又嫩大片a级| 加勒比久久综合| 欧美做爰性生交视频| 少妇一区二区三区四区| 亚洲综合一区二区三区| 国产探花在线观看视频| 水蜜桃久久夜色精品一区| 国产精品福利网站| 高清日韩av电影| 日本韩国欧美三级| 亚洲理论片在线观看| 男女av一区三区二区色多| 九色综合日本| 欧美黑人粗大| 亚洲人成电影网站| 天天干天天色综合| 久久精品欧美一区二区三区不卡| 99精品在线免费视频| 日韩超碰人人爽人人做人人添| 97在线视频国产| 亚洲av片在线观看| 精品国产乱码久久久久久虫虫漫画 | 精品一区二区三区久久久| 视频在线99re| 国产精品99久久久久久董美香 | 欧美群妇大交群的观看方式| 日本高清黄色片| 久久国产精品无码网站| 伊人天天久久大香线蕉av色| 91国产一区| 欧美久久久精品| 黄频网站在线观看| 日韩欧美精品中文字幕| 成人无码av片在线观看| 麻豆国产一区二区| 免费成人深夜夜行网站视频| 日韩精品成人| 91精品国产免费久久久久久| 女人偷人在线视频| 欧美日韩一本到| 国产精品老熟女一区二区| 国产.欧美.日韩| 青青草原av在线播放| 日本电影一区二区| 999国内精品视频在线| 国产欧洲在线| 在线午夜精品自拍| 国产视频手机在线| 精品久久香蕉国产线看观看亚洲| 欧美偷拍一区二区三区| 极品美女销魂一区二区三区 | 国产一区二区三区奇米久涩| 国精产品一区一区三区四川| 不卡av电影在线观看| 五月婷婷六月丁香| 欧美午夜理伦三级在线观看| 国产盗摄x88av| 久久亚洲综合色一区二区三区| 超碰超碰在线观看| 在线观看的日韩av| 亚洲国产激情一区二区三区| 亚洲国产中文在线二区三区免| 热久久这里只有精品| 免费av在线| 日韩激情第一页| 国产精品一区二区免费视频| 精品欧美激情精品一区| 97精品在线播放| 91丝袜国产在线播放| 精品亚洲视频在线| 国产偷自视频区视频一区二区| 日日噜噜噜夜夜爽爽| 色婷婷狠狠五月综合天色拍| 亚洲a中文字幕| 3d性欧美动漫精品xxxx软件| 久久久噜噜噜久噜久久| 亚洲1卡2卡3卡4卡乱码精品| 日韩国产精品视频| 国产激情视频在线播放| 欧洲激情一区二区| 五月婷婷开心网| 一级女性全黄久久生活片免费| 国产馆在线观看| 91丨porny丨蝌蚪视频| 2025中文字幕| 久久se这里有精品| 蜜臀视频一区二区三区| 国产一级久久| 国产www免费| 中文字幕乱码亚洲无线精品一区| 日韩欧美精品一区二区| 天天久久夜夜| 国产一区二区三区免费不卡| xxxxxhd亚洲人hd| 亚洲一区二区少妇| 色综合一区二区日本韩国亚洲| 欧洲亚洲在线视频| 极品美鲍一区| 国外成人在线视频| 欧美人与牲禽动交com| 久久久极品av| 精品176二区| 日韩中文字幕在线免费观看| a√在线中文网新版址在线| 亚洲欧洲av一区二区| 青青草视频在线免费观看| 亚洲国产精品va| 婷婷开心激情网| 亚洲黄色成人网| 午夜国产在线观看| 亚洲精品成人久久电影| 无码h黄肉3d动漫在线观看| 亚洲精品一线二线三线无人区| www.亚洲黄色| 亚洲成人av片在线观看| 丰满人妻一区二区三区免费视频 | 欧美在线a视频| 国产一区二区毛片| 国产无套精品一区二区三区| 成人激情免费电影网址| yjizz视频| www国产成人| av电影在线不卡| 国产精品乱码一区二区三区软件| 污污视频网站在线免费观看| 中文字幕一区二区三区色视频| 日本一级片免费| 一区二区三区在线视频免费| 日韩少妇高潮抽搐| 色婷婷激情综合| 又骚又黄的视频| 欧美一区日本一区韩国一区| www.av网站| 日韩精品在线观看一区| 久草在线青青草| 日韩在线播放一区| 2021国产在线| 97香蕉超级碰碰久久免费软件| 在线看片福利| 国产精品色午夜在线观看| 免费观看亚洲视频大全| 国产亚洲福利社区| 欧洲杯半决赛直播| 久久www视频| 久久综合中文| 少妇高潮一69aⅹ| 91麻豆精东视频| 91狠狠综合久久久| 亚洲国产色一区| 无码无套少妇毛多18pxxxx| 欧美猛男gaygay网站| 亚洲国产一二三区| 亚洲欧美一区二区精品久久久| 成人午夜在线影视| 7777免费精品视频| 亚洲一区导航| 久久青青草原| 综合久久精品| 日本一极黄色片| 粉嫩av一区二区三区| 性猛交娇小69hd| 亚洲国产成人高清精品| 中文字字幕在线观看| 欧美成人一区二区三区| 国产香蕉视频在线看| 色综合视频网站| 全球最大av网站久久| 国产精品久久7| 欧美成免费一区二区视频| 99热亚洲精品| 国产综合色精品一区二区三区| 国产精品探花一区二区在线观看| 综合久久综合久久| 亚洲精品怡红院| 日韩久久99| 91久久精品www人人做人人爽| 蜜桃视频欧美| 全黄性性激高免费视频| 久久精品国产99久久6| 亚洲蜜桃精久久久久久久久久久久| 成人免费在线播放视频| 无码人妻av一区二区三区波多野| 欧美变态口味重另类| 日本免费在线视频| 国产精品吹潮在线观看| 夜夜躁狠狠躁日日躁2021日韩| 色婷婷777777仙踪林| 美腿丝袜亚洲一区| 一级片手机在线观看| 五月婷婷久久丁香| 亚洲第九十九页| 另类天堂视频在线观看| 亚洲青青一区| 亚洲精品永久www嫩草| 性色一区二区三区| 真人bbbbbbbbb毛片| 亚洲成a人v欧美综合天堂下载| 国产男男gay体育生白袜| 中文字幕欧美日韩在线| 自拍偷自拍亚洲精品被多人伦好爽 | 成人黄色在线视频| 麻豆chinese极品少妇| 91精品国产色综合久久ai换脸| 日本在线观看网站| 国产精自产拍久久久久久| 欧美一级淫片| 亚洲xxxx2d动漫1| 亚洲国产精品99久久久久久久久| 欧美国产成人精品一区二区三区| 亚洲精品按摩视频| 不卡一二三区| 欧洲亚洲一区二区| 视频一区视频二区中文字幕| 亚洲av综合一区二区| 欧美午夜美女看片| 精品乱码一区二区三四区视频| 日本久久久久久久久久久| 亚洲精品国产动漫| 日韩av播放器| 国产日产欧产精品推荐色| 中文在线观看av| 在线国产精品播放| 亚洲图片小说区| 亚洲爆乳无码精品aaa片蜜桃| 国产xxx精品视频大全| 国产一级片播放| 亚洲激情视频网站| 久久电影tv| 亚洲日本精品| 国产精品2024| 午夜毛片在线观看| 亚洲天堂久久av| 日韩黄色三级| 亚洲色欲久久久综合网东京热| www..com久久爱| 成人h动漫精品一区二区下载| 中文字幕久精品免费视频| www.欧美视频| 国产96在线 | 亚洲| 久久综合精品国产一区二区三区| 乱子伦一区二区三区| 精品久久国产精品| 成人性生交大片免费看96| 日韩av资源在线| 国产精品国产精品国产专区不片| 精品国产va久久久久久久| 性欧美暴力猛交69hd| 精品av一区二区| 中文字幕在线观看91| 色婷婷精品大视频在线蜜桃视频| 麻豆免费在线视频| 黄色91av| 美女视频黄免费的久久| 国产一级片视频| 中文字幕日韩视频| 国产精品色呦| 艹b视频在线观看| 亚洲成av人片观看|