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

聊聊Unsafe的一些使用技巧

開發 后端
sun.misc.Unsafe 是 JDK 原生提供的一個工具類,包含了很多在 Java 語言看來很 cool 的操作,例如內存分配與回收、CAS 操作、類實例化、內存屏障等。

[[428449]]

本文轉載自微信公眾號「Kirito的技術分享」,作者kiritomoe 。轉載本文請聯系Kirito的技術分享公眾號。

前言

記得初學 Java 那會,剛學完語法基礎,就接觸到了反射這個 Java 提供的特性,盡管在現在看來,這是非常基礎的知識點,但那時候無疑是興奮的,瞬間覺得自己脫離了“Java 初學者”的隊伍。隨著工作經驗的積累,我也逐漸學習到了很多類似的讓我為之而興奮的知識點,Unsafe 的使用技巧無疑便是其中一個。

sun.misc.Unsafe 是 JDK 原生提供的一個工具類,包含了很多在 Java 語言看來很 cool 的操作,例如內存分配與回收、CAS 操作、類實例化、內存屏障等。正如其命名一樣,由于其可以直接操作內存,執行底層系統調用,其提供的操作也是比較危險的。Unsafe 在擴展 Java 語言表達能力、便于在更高層(Java層)代碼里實現原本要在更低層(C層)實現的核心庫功能上起到了很大的作用。

從 JDK9 開始,Java 模塊化設計的限制,使得非標準庫的模塊都無法訪問到 sun.misc.Unsafe。但在 JDK8 中,我們仍然可以直接操作 Unsafe,再不學習,后面可能就沒機會了。

使用 Unsafe

Unsafe 被設計的初衷,并不是希望被一般開發者調用,所以我們不能通過 new 或者工廠方法去實例化 Unsafe 對象,通常可以采用反射的方法獲取到 Unsafe 實例:

  1. public static final Unsafe unsafe = getUnsafe(); 
  2.  
  3. static sun.misc.Unsafe getUnsafe() { 
  4.     try { 
  5.         Field field = Unsafe.class.getDeclaredField("theUnsafe"); 
  6.         field.setAccessible(true); 
  7.         return  (Unsafe) field.get(null); 
  8.     } catch (Exception e) { 
  9.         throw new RuntimeException(e); 
  10.     } 

拿到之后,便可以用這個全局的單例對象去為所欲為了。

功能概覽

圖片來源于網絡,我直接借用過來了。上圖包含了 Unsafe 的眾多功能,還算全面。如果全部介紹,文章篇幅會過長,形式難免會流水賬,我打算結合我的一些項目經驗以及一些比賽經驗,從實踐角度聊聊 Unsafe 的一些使用技巧。

內存分配&存取

Java 其實也可以像 C++ 那樣直接操作內存,借助 Unsafe 就可以。讓我們先來看一個 ByteBuffer 的示例,我們將會開辟一個 16 字節的內存空間,先后寫入并讀取 4 個 int 類型的數據。

  1. public static void testByteBuffer() { 
  2.     ByteBuffer directBuffer = ByteBuffer.allocateDirect(16); 
  3.     directBuffer.putInt(1); 
  4.     directBuffer.putInt(2); 
  5.     directBuffer.putInt(3); 
  6.     directBuffer.putInt(4); 
  7.     directBuffer.flip(); 
  8.     System.out.println(directBuffer.getInt()); 
  9.     System.out.println(directBuffer.getInt()); 
  10.     System.out.println(directBuffer.getInt()); 
  11.     System.out.println(directBuffer.getInt()); 

熟悉 nio 操作的同學對上面的示例應該不會感到陌生,這是很基礎也是很標準的內存使用方式。那換做是 Unsafe 怎么實現同樣的效果的?

  1. public static void testUnsafe0() { 
  2.     Unsafe unsafe = Util.unsafe; 
  3.     long address = unsafe.allocateMemory(16); 
  4.     unsafe.putInt(address, 1); 
  5.     unsafe.putInt(address + 4, 2); 
  6.     unsafe.putInt(address + 8, 3); 
  7.     unsafe.putInt(address + 12, 4); 
  8.  
  9.     System.out.println(unsafe.getInt(address)); 
  10.     System.out.println(unsafe.getInt(address + 4)); 
  11.     System.out.println(unsafe.getInt(address + 8)); 
  12.     System.out.println(unsafe.getInt(address + 12)); 

兩段代碼輸出結果一致:

下面針對使用到的 Unsafe 的 API,逐個介紹:

  1. public native long allocateMemory(long var1); 

這個 native 方法分配的是堆外內存,返回的 long 類型數值,便是內存的首地址,可以作為 Unsafe 其他 API 的入參。你如果見過 DirectByteBuffer 的源碼,會發現其實它內部就是使用 Unsafe 封裝的。說到 DirectByteBuffer,這里額外提一句,ByteBuffer.allocateDirect 分配的堆外內存會受到 -XX:MaxDirectMemorySize 的限制,而 Unsafe 分配的堆外內存則不會受到限制,當然啦,也不會受到 -Xmx 的限制。如果你正在參加什么比賽并且受到了什么啟發,可以把“爺懂了”打在公屏上。

看到另外兩個 API putInt 和 getInt ,你應當會意識到,肯定會有其他字節操作的 API,例如 putByte/putShort/putLong ,當然 put 和 get 也是成對出現的。這一系列 API 里面也有注意點,建議需要成對的使用,否則可能會因為字節序問題,導致解析失敗。可以看下面的例子:

  1. public static void testUnsafe1() { 
  2.     ByteBuffer directBuffer = ByteBuffer.allocateDirect(4); 
  3.     long directBufferAddress = ((DirectBuffer)directBuffer).address(); 
  4.     System.out.println("Unsafe.putInt(1)"); 
  5.     Util.unsafe.putInt(directBufferAddress, 1); 
  6.     System.out.println("Unsafe.getInt() == " + Util.unsafe.getInt(directBufferAddress)); 
  7.     directBuffer.position(0); 
  8.     directBuffer.limit(4); 
  9.     System.out.println("ByteBuffer.getInt() == " + directBuffer.getInt()); 
  10.     directBuffer.position(0); 
  11.     directBuffer.limit(4); 
  12.     System.out.println("ByteBuffer.getInt() reverseBytes == " + Integer.reverseBytes(directBuffer.getInt())); 

輸出如下:

  1. Unsafe.putInt(1) 
  2. Unsafe.getInt() == 1 
  3. ByteBuffer.getInt() == 16777216 
  4. ByteBuffer.getInt() reverseBytes == 1 

可以發現當我們使用 Unsafe 進行 putInt,再使用 ByteBuffer 進行 getInt,結果會不符合預期,需要對結果進行字節序變化之后,才恢復正確。這其實是因為,ByteBuffer 內部判斷了當前操作系統的字節序,對于 int 這種多字節的數據類型,我的測試機器使用大端序存儲,而 Unsafe 默認以小短序存儲導致。如果你拿捏不準,建議配套使用寫入和讀取 API,以避免字節序問題。對字節序不了解的同學可以參考我的另外一篇文章:《“字節序”是個什么鬼》。

內存復制

內存復制在實際應用場景中還是很常見的需求,例如上一篇文章我剛介紹過的,堆內內存寫入磁盤時,需要先復制到堆外內存,再例如我們做內存聚合時,需要緩沖一部分數據,也會涉及到內存復制。你當然也可以通過 ByteBuffer 或者 set/get 去進行操作,但肯定不如 native 方法來的高效。Unsafe 提供了內存拷貝的 native 方法,可以實現堆內到堆內、堆外到堆外、堆外和堆內互相拷貝,總之就是哪兒到哪兒都可以拷貝。

  1. public native void copyMemory(Object src, long offset, Object dst ,long dstOffset, long size); 

對于堆內內存來說,我們可以直接給 src 傳入對象數組的首地址,并且指定 offset 為對應數組類型的偏移量,可以通過 arrayBaseOffset 方法獲取堆內內存存儲對象的偏移量

  1. public native int arrayBaseOffset(Class<?> var1); 

例如獲取 byte[] 的固定偏移量可以這樣操作:unsafe.arrayBaseOffset(byte[].class)

對于堆外內存來說,會更加直觀一點,dst 設為 null,dstOffset 設置為 Unsafe 獲取的內存地址即可。

堆內內存復制到堆外內存的示例代碼:

  1. public static void unsafeCopyMemory()  { 
  2.     ByteBuffer heapBuffer = ByteBuffer.allocate(4); 
  3.     ByteBuffer directBuffer = ByteBuffer.allocateDirect(4); 
  4.     heapBuffer.putInt(1234); 
  5.     long address = ((DirectBuffer)directBuffer).address(); 
  6.  
  7.     Util.unsafe.copyMemory(heapBuffer.array(), 16, null, address, 4); 
  8.  
  9.     directBuffer.position(0); 
  10.     directBuffer.limit(4); 
  11.  
  12.     System.out.println(directBuffer.getInt()); 

在實際應用中,大多數 ByteBuffer 相關的源碼在涉及到內存復制時,都使用了 copyMemory 方法。

非常規實例化對象

在 JDK9 模塊化之前,如果不希望將一些類開放給其他用戶使用,或者避免被隨意實例化(單例模式),通常有兩個常見做法

案例一:私有化構造器

  1. public class PrivateConstructorFoo { 
  2.  
  3.     private PrivateConstructorFoo() { 
  4.         System.out.println("constructor method is invoked"); 
  5.     } 
  6.  
  7.     public void hello() { 
  8.         System.out.println("hello world"); 
  9.     } 
  10.  

如果希望實例化該對象,第一時間想到的可能是反射創建

  1. public static void reflectConstruction() { 
  2.   PrivateConstructorFoo privateConstructorFoo = PrivateConstructorFoo.class.newInstance(); 
  3.   privateConstructorFoo.hello(); 

不出所料,我們獲得了一個異常

  1. java.lang.IllegalAccessException: Class io.openmessaging.Main can not access a member of class moe.cnkirito.PrivateConstructorFoo with modifiers "private" 

稍作調整,調用構造器創建實例

  1. public static void reflectConstruction2() { 
  2.    Constructor<PrivateConstructorFoo> constructor = PrivateConstructorFoo.class.getDeclaredConstructor(); 
  3.    constructor.setAccessible(true); 
  4.    PrivateConstructorFoo privateConstructorFoo = constructor.newInstance(); 
  5.    privateConstructorFoo.hello(); 

it works!輸出如下:

  1. constructor method is invoked 
  2. hello world 

當然,Unsafe 也提供了 allocateInstance 方法

  1. public native Object allocateInstance(Class<?> var1) throws InstantiationException; 

也可以實現實例化,而且更為直觀

  1. public static void allocateInstance() throws InstantiationException { 
  2.     PrivateConstructorFoo privateConstructorFoo = (PrivateConstructorFoo) Util.unsafe.allocateInstance(PrivateConstructorFoo.class); 
  3.     privateConstructorFoo.hello(); 

同樣 works!輸出如下:

  1. hello world 

注意這里有一個細節,allocateInstance 沒有觸發構造方法。

案例二:package level 實例

  1. package moe.cnkirito; 
  2.  
  3. class PackageFoo { 
  4.  
  5.     public void hello() { 
  6.         System.out.println("hello world"); 
  7.     } 
  8.  

注意,這里我定義了一個 package 級別可訪問的對象 PackageFoo,只有 moe.cnkirito 包下的類可以訪問。

我們同樣先嘗試使用反射

  1. package com.bellamm; 
  2.  
  3. public static void reflectConstruction() { 
  4.   Class<?> aClass = Class.forName("moe.cnkirito.PackageFoo"); 
  5.   aClass.newInstance(); 

得到了意料之中的報錯:

  1. java.lang.IllegalAccessException: Class io.openmessaging.Main can not access a member of class moe.cnkirito.PackageFoo with modifiers "" 

再試試 Unsafe 呢?

  1. package com.bellamm; 
  2.  
  3. public static void allocateInstance() throws Exception{ 
  4.     Class<?> fooClass = Class.forName("moe.cnkirito.PackageFoo"); 
  5.     Object foo = Util.unsafe.allocateInstance(fooClass); 
  6.     Method helloMethod = fooClass.getDeclaredMethod("hello"); 
  7.     helloMethod.setAccessible(true); 
  8.     helloMethod.invoke(foo); 

由于在 com.bellamm 包下,我們甚至無法在編譯期定義 PackageFoo 類,只能通過反射機制在運行時,獲取 moe.cnkirito.PackageFoo 的方法,配合 Unsafe 實例化,最終實現調用,成功輸出 hello world。

我們花了這么大的篇幅進行實驗來說明了兩種限制案例,以及 Unsafe 的解決方案,還需要有實際的應用場景佐證 Unsafe#allocateInstance 的價值。我簡單列舉兩個場景:

  1. 序列化框架在使用反射無法創建對象時,可以嘗試使用 Unsafe 創建,作為兜底邏輯。
  2. 獲取包級別保護的類,再借助于反射機制,可以魔改一些源碼實現或者調用一些 native 方法,此法慎用,不建議在生產使用。

示例代碼:動態修改堆外內存限制,覆蓋 JVM 啟動參數:-XX:MaxDirectMemorySize

  1. private void hackMaxDirectMemorySize() { 
  2.      try { 
  3.          Field directMemoryField = VM.class.getDeclaredField("directMemory"); 
  4.          directMemoryField.setAccessible(true); 
  5.          directMemoryField.set(new VM(), 8L * 1024 * 1024 * 1024); 
  6.  
  7.          Object bits = Util.unsafe.allocateInstance(Class.forName("java.nio.Bits")); 
  8.          Field maxMemory = bits.getClass().getDeclaredField("maxMemory"); 
  9.          maxMemory.setAccessible(true); 
  10.          maxMemory.set(bits, 8L * 1024 * 1024 * 1024); 
  11.  
  12.      } catch (Exception e) { 
  13.          throw new RuntimeException(e); 
  14.      } 
  15.  
  16.      System.out.println(VM.maxDirectMemory()); 
  17.  
  18.  } 

總結

先大概介紹這三個 Unsafe 用法吧,已經是我個人認為比較常用的幾個 Unsafe 案例了。

Unsafe 這個東西,會用的人基本都知道不能瞎用;不會用的話,看個熱鬧,知道 Java 有這個機制總比不知道強對吧。當然,本文也介紹了一些實際場景可能必須得用 Unsafe,但更多還是出現在各個底層源碼之中。

 

如果還有讀者想看到更多騷操作的話,歡迎轉發本文,閱讀過 1500,繼續加更一期,一鍵三連,這次一定。

 

責任編輯:武曉燕 來源: Kirito的技術分享
相關推薦

2021-06-08 06:13:16

React開發開發技術

2020-11-25 07:43:07

Java

2011-06-01 16:50:21

JAVA

2013-03-29 13:17:53

XCode調試技巧iOS開發

2012-05-21 10:13:05

XCode調試技巧

2015-08-17 15:53:58

Linux桌面

2011-07-19 18:11:09

iPhone 開發

2009-11-30 13:51:28

VS2003 Acti

2015-11-26 11:33:54

掃描器

2011-07-12 09:47:53

WebService

2011-10-26 20:55:43

ssh 安全

2011-05-23 18:06:24

站內優化SEO

2021-10-26 13:55:53

搞定系統設計

2022-12-02 14:58:27

JavaScript技巧編程

2009-11-26 10:32:57

PHP代碼優化

2020-04-14 09:22:47

bash腳本技巧

2020-04-08 10:21:58

bash腳本語言

2018-05-07 08:22:19

LinuxImageMagick查看圖片

2017-05-10 15:30:30

skynet崩潰程序

2017-09-20 15:07:32

數據庫SQL注入技巧分享
點贊
收藏

51CTO技術棧公眾號

午夜av在线播放| 999免费视频| 日韩一区二区在线| 欧美美女喷水视频| 91午夜在线观看| 国产中文字幕在线| 成人综合婷婷国产精品久久蜜臀| 1769国内精品视频在线播放| 成人免费视频入口| 国产精品网址| 欧美巨大另类极品videosbest| 香港三级日本三级a视频| 欧美男男激情freegay| 老司机免费视频一区二区| 欧美极品美女电影一区| 九九九视频在线观看| youjizz欧美| 欧美日韩极品在线观看一区| 亚洲 欧美 日韩 国产综合 在线| h视频在线免费| av资源站一区| 91免费电影网站| av手机天堂网| 99精品福利视频| 久久999免费视频| 亚洲精品视频网址| 色婷婷狠狠五月综合天色拍 | 久久久久久少妇| 99久久婷婷| 伊人久久精品视频| 国产精品一级黄片| 中文字幕一区二区三区日韩精品| 欧美视频自拍偷拍| aaaaaa亚洲| www成人免费观看| 一区二区三区在线影院| 亚洲一卡二卡三卡| 日本一二三区在线视频| 成年人午夜久久久| 亚洲综合第一页| 一级片视频免费| 日韩主播视频在线| 日本欧美精品在线| 三级黄色在线视频| 亚洲黄色大片| 久久免费精品日本久久中文字幕| 欧美日韩三级在线观看| 91精品一区二区三区综合在线爱| 国产性猛交xxxx免费看久久| 亚洲AV无码片久久精品| 亚洲美女久久| 亚洲男人天堂视频| 免费黄色在线视频| 亚洲永久精品唐人导航网址| 日韩精品在线观看一区| 国产夫妻性爱视频| 牛牛影视一区二区三区免费看| 精品国产制服丝袜高跟| 亚洲一二三四五| 超碰成人在线观看| 亚洲成人aaa| 最近中文字幕无免费| 日韩电影在线观看完整免费观看| 日韩av中文字幕在线免费观看| 精品国产一区在线| 偷拍自拍亚洲色图| 国产午夜精品视频| 免费成人深夜蜜桃视频| 99精品在线| 九九久久综合网站| 日本a在线观看| 亚洲欧美日本日韩| 小泽玛利亚av在线| 国产1区2区3区在线| 国产亚洲1区2区3区| 日本午夜一区二区三区| 日本网站在线免费观看视频| 亚洲欧美韩国综合色| 久久亚洲a v| 在线观看爽视频| 在线视频欧美精品| 91pony九色| 国产欧美啪啪| 国产一区二区精品丝袜| 91免费公开视频| 亚洲激情网址| 国产精品流白浆视频| 91免费视频播放| 成人av网站免费观看| 日韩精品一区二区三区丰满| 黄色国产网站在线播放| 午夜影视日本亚洲欧洲精品| 国产超碰在线播放| 欧美日韩黄网站| 亚洲欧美成人一区二区在线电影| 国产精品69久久久久孕妇欧美| 国产一区二区中文| 国产精品1234| 女人18毛片一区二区三区| 国产午夜亚洲精品不卡| 久久www视频| 唐人社导航福利精品| 日韩欧美中文字幕公布| 日韩精品无码一区二区三区久久久 | 特级黄色片视频| 欧美有码在线| 久久国产色av| 国产黄色免费视频| 波多野结衣亚洲一区| 亚洲一区二区在线看| 白白色在线观看| 91麻豆精品国产91久久久久久久久 | 中文字幕观看视频| av中文字幕不卡| 成人一区二区av| 六九午夜精品视频| 国产小视频国产精品| 狠狠躁夜夜躁人人爽天天高潮| 久久99深爱久久99精品| 免费观看成人在线| 不卡一本毛片| 欧美一级欧美三级在线观看| 美国一级黄色录像| 美女久久一区| 国产伦精品一区二区三毛| 黄a在线观看| 欧美日韩综合色| 女女互磨互喷水高潮les呻吟| 日韩天天综合| 99在线视频播放| 4438x成人网全国最大| 欧美日韩精品二区第二页| 在线观看免费小视频| 久久福利影视| 欧美二区在线| 美女的胸无遮挡在线观看| 精品久久一区二区| 久久久国产精品黄毛片| 国产精品中文字幕一区二区三区| 亚洲激情电影在线| se69色成人网wwwsex| 亚洲无限av看| 国产情侣小视频| 欧美国产日韩一二三区| 久久国产成人精品国产成人亚洲 | 精品久久久久久久人人人人传媒| 欧美性x x x| 国产呦萝稀缺另类资源| 一区二区在线观看网站| 欧美成人三级| 日韩在线观看免费高清完整版| 中文字幕人妻一区二区三区视频| 国产日韩欧美综合一区| 蜜桃免费在线视频| 日韩欧美一区二区三区免费看| 国产精品视频一| 日本中文字幕在线看| 欧美精品v日韩精品v韩国精品v| 国精产品久拍自产在线网站| 精品亚洲成a人| 国产免费xxx| av成人app永久免费| 96精品视频在线| 成人免费在线视频网| 欧美日韩免费一区二区三区视频 | 成年人视频在线看| 欧美日韩一区二区三区在线看| 69夜色精品国产69乱| 国产麻豆精品theporn| 国产精品va在线观看无码| 欧美大片网址| 国产精品久久久久久亚洲影视| 在线激情免费视频| 日韩三级免费观看| www成人在线| 欧美国产日韩一二三区| 亚洲第一成肉网| 亚洲精品黄色| 亚洲一区二区三区精品动漫| 中文在线综合| 国产91精品最新在线播放| 成人在线观看免费| 日韩三级电影网址| 波多野结衣午夜| 亚洲乱码国产乱码精品精98午夜| 中国一级特黄录像播放| 人妖欧美一区二区| 久草视频国产在线| 第九色区aⅴ天堂久久香| 99re在线视频上| 久久r热视频| 欧美日韩成人精品| 国产视频三级在线观看播放| 日韩亚洲欧美综合| 日韩精品一区不卡| 夜夜揉揉日日人人青青一国产精品| 亚洲国产精品成人综合久久久| 免费在线一区观看| 欧美视频在线观看网站| 91精品国产乱码久久久久久久 | 国产精品视频网站| а√在线中文在线新版 | 超碰97国产精品人人cao| 中文字幕亚洲一区在线观看| 天天干天天做天天操| 在线电影国产精品| 中文字幕一区二区人妻视频| 亚洲精品国产无天堂网2021| 男人的天堂av网| av资源网一区| 国产艳妇疯狂做爰视频| 久久福利资源站| 国产女女做受ⅹxx高潮| 午夜日韩电影| 一区二区三区免费看| 国产成人精品999在线观看| 国产福利久久精品| 伊人久久精品| 国产精品免费久久久| 678在线观看视频| 蜜臀久久99精品久久久久久宅男| av中文在线| 亚洲人成人99网站| 天天爽夜夜爽夜夜爽| 欧美成人三级在线| 99热这里只有精品9| 欧美日韩日日摸| 中文字幕激情视频| 日本高清无吗v一区| 二区视频在线观看| 天天影视色香欲综合网老头| 久久久久成人网站| 亚洲综合色噜噜狠狠| 精品人妻伦九区久久aaa片| 中日韩免费视频中文字幕| 泷泽萝拉在线播放| 久久久亚洲精品一区二区三区| bl动漫在线观看| 99久久久久久| 黄色片视频免费观看| av影院午夜一区| 在线免费播放av| 91天堂素人约啪| 亚洲欧美视频在线播放| 91首页免费视频| 国产精品久久不卡| 国产亚洲制服色| 老头老太做爰xxx视频| 国产日韩精品一区二区浪潮av| 无码人妻精品一区二区中文| 国产视频在线观看一区二区三区| 精品国产成人亚洲午夜福利| 日本一区二区成人在线| 一级性生活免费视频| 亚洲日本在线观看| 免费又黄又爽又色的视频| 午夜视频一区二区| 国产精品久久久久久久久久久久久久久久久| 欧美日韩国产色视频| 中文字幕免费高清网站| 欧美视频自拍偷拍| www日本高清| 亚洲精品美女在线观看| 久久这里精品| 日韩在线欧美在线国产在线| 成人影院在线看| 韩国三级电影久久久久久| 在线视频超级| 国产精品午夜视频| 精品视频在线观看网站| 国产区一区二区| av亚洲免费| wwwjizzjizzcom| 亚洲日韩成人| 性生生活大片免费看视频| 国产很黄免费观看久久| 午夜一区二区三区免费| 中文字幕不卡在线播放| 久草视频在线资源站| 欧美日韩免费网站| 国产理论视频在线观看| 亚洲精品不卡在线| 18视频免费网址在线观看| 欧美激情一区二区三区在线视频观看| 成人教育av| 亚洲已满18点击进入在线看片| 欧美变态挠脚心| 大桥未久一区二区| 久久国产日韩| 国产成人av免费观看| 久久久天堂av| 男女做暖暖视频| 色婷婷综合视频在线观看| 国产绿帽刺激高潮对白| 亚洲人成毛片在线播放| 性欧美猛交videos| 国产精品av在线播放| 网站一区二区| 亚洲国产婷婷香蕉久久久久久99| 亚洲国产专区校园欧美| 成人不卡免费视频| 国产三级精品三级在线专区| 青青草原在线免费观看视频| 欧美视频自拍偷拍| 色综合久久网女同蕾丝边| 欧美巨大黑人极品精男| av成人在线观看| 久久精品人成| 欧美日韩午夜| 99九九99九九九99九他书对| 国产日产亚洲精品系列| 国产精品第一页在线观看| 欧美电影在线免费观看| 波多野结衣一区二区| 91精品国产91久久久久久吃药| 国产日韩欧美中文在线| 午夜精品一区二区三区在线观看| 日韩图片一区| 欧美极品jizzhd欧美仙踪林| 亚洲天堂精品在线观看| 欧美三级网站在线观看| 亚洲精品视频免费在线观看| h片精品在线观看| 99视频在线免费观看| 欧美黄色免费| 成年人性生活视频| 亚洲视频免费在线观看| 91精东传媒理伦片在线观看| 国产一区二区黄| 免费观看成人性生生活片| 美国av一区二区三区| 国产精品久久久久久久免费软件| 成人欧美精品一区二区| 亚洲黄色录像片| 亚洲高清视频网站| 欧美高清视频在线| 视频一区日韩| 国产精品久久久久久久久电影网| 国产一区999| 久久久久久久久毛片| 日韩久久久久久| 好久没做在线观看| 国产精品一级久久久| 国产在线日韩| 亚洲色偷偷色噜噜狠狠99网 | 一级一级黄色片| 一区二区国产精品视频| www.成人在线视频| 亚洲视频小说| 狠狠色丁香九九婷婷综合五月| 一级免费黄色录像| 91精品国产麻豆国产自产在线 | 你懂的成人av| 国产chinesehd精品露脸| 亚洲一区在线观看免费| 日韩中文字幕免费观看| 992tv成人免费视频| 亚洲三级精品| 婷婷激情四射五月天| 亚洲欧洲色图综合| 精品国产伦一区二区三| 韩日精品中文字幕| 久久不见久久见中文字幕免费 | 国产精品三级一区二区| 成人国产免费视频| 91午夜精品亚洲一区二区三区| 国产午夜精品视频免费不卡69堂| 深夜福利亚洲| 欧妇女乱妇女乱视频| 91毛片在线观看| 91精品国自产| 久久久人成影片一区二区三区观看| 琪琪久久久久日韩精品| 男女污污的视频| 亚洲精品videosex极品| 同心难改在线观看| 国产精品爽爽爽| 国产在线欧美| 中文字幕第24页| 日韩你懂的在线观看| 欧美片第1页| 久久国产精品免费观看| 99re66热这里只有精品3直播 | 日韩经典第一页| 欧美视频免费看| 欧美视频在线观看网站| 国产精品久久久久久久岛一牛影视| 亚洲国产www| 国产精品久久久久久av| 国产精品地址| avhd101老司机| 亚洲电影中文字幕| 国产精品久久久久久吹潮| 日韩成人午夜影院| 国产欧美日韩在线视频| 亚洲欧美另类日韩| 国产日韩精品在线观看| 国产欧美91| 男的操女的网站| 亚洲午夜精品久久久久久久久久久久 |