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

Unsafe 與 ByteBuffer 那些事

開發 開發工具
sun.misc.Unsafe 是 JDK 原生提供的一個工具類,包含了很多在 Java 語言看來很 cool 的操作,例如內存分配與回收、CAS 操作、類實例化、內存屏障等。正如其命名一樣,由于其可以直接操作內存,執行底層系統調用,其提供的操作也是比較危險的。

[[429887]]

本文轉載自微信公眾號「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 的價值。我簡單列舉兩個場景:

序列化框架在使用反射無法創建對象時,可以嘗試使用 Unsafe 創建,作為兜底邏輯。

獲取包級別保護的類,再借助于反射機制,可以魔改一些源碼實現或者調用一些 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.  

總結

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

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

 

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

2013-04-12 09:41:52

MySQL 5.6

2022-06-05 13:51:47

SentinelOpenFeign服務熔斷

2017-12-08 10:20:45

FedoraLinux

2019-07-15 15:37:31

頁面緩存內存

2011-05-19 16:47:50

軟件測試

2012-05-01 08:06:49

手機

2024-02-04 17:03:30

2017-05-15 21:50:54

Linux引號

2011-12-02 10:32:23

Java

2020-09-23 09:07:16

特權賬號管理PAM網絡安全

2014-06-06 16:08:17

初志科技

2011-08-22 16:42:43

SqliteiPad

2015-05-28 14:02:09

JavaJava日志性

2010-07-26 11:02:19

Perl模式匹配

2015-09-14 09:16:17

iOS統計打點

2012-01-02 19:30:22

iPad

2020-07-29 08:14:59

云計算云遷移IT

2009-07-29 10:36:04

北電收購

2011-07-04 15:30:24

Qt 布局 GridLayout

2011-06-30 14:34:17

QT Tablewidge QTableWidg
點贊
收藏

51CTO技術棧公眾號

嫩呦国产一区二区三区av| 日本美女高清在线观看免费| 激情综合久久| 日韩精品在线第一页| 日本黄色三级大片| 超碰免费在线| 国产九九视频一区二区三区| 欧美激情女人20p| 中文字幕一区二区三区人妻不卡| 欧美日韩女优| 亚洲欧美日韩国产综合在线| 国产精品入口免费| 久久永久免费视频| 91精品国产调教在线观看| 欧美哺乳videos| 别急慢慢来1978如如2| 午夜影院免费在线| 国产女人18水真多18精品一级做| 亚洲综合最新在线| 久久久久久久久久久影院| 99国产**精品****| 亚洲免费中文字幕| 午夜视频在线免费看| 日本一区二区三区视频在线| 亚洲一卡二卡三卡四卡无卡久久| 久久国产主播精品| 精品人妻一区二区三区含羞草| 亚欧成人精品| 欧美精品久久一区二区| 中文字幕精品亚洲| 精品国产视频| 亚洲精品狠狠操| 少妇献身老头系列| 亚洲一区二区小说| 欧美亚洲尤物久久| 看av免费毛片手机播放| xxxx视频在线| 樱桃国产成人精品视频| 伊人情人网综合| 欧美zozo| 91在线视频播放地址| 热re91久久精品国99热蜜臀| 日本特黄一级片| 久久久国产精品| 亚洲欧美三级伦理| 极品白嫩的小少妇| 欧美特黄色片| 色国产综合视频| 免费一级特黄毛片| 亚洲资源一区| 国产精品视频免费看| 国产一区二区三区黄| 91中文字幕在线播放| 日韩精品91亚洲二区在线观看| 欧美激情视频免费观看| 欧美黑人猛猛猛| 久久国产电影| 亚洲午夜精品久久久久久久久久久久| 久久久久久久久久久久91| 18video性欧美19sex高清| 中文字幕一区二区三区四区不卡| 日韩资源av在线| 亚洲欧美丝袜中文综合| 9i在线看片成人免费| av电影成人| 国产伦理一区二区| 久久99精品久久只有精品| 国产精品久久久久久五月尺| av大片在线免费观看| 国产精品久久久久久久免费软件| 欧美激情在线观看| 欧美一级特黄高清视频| 欧美日韩久久精品| 中文字幕av日韩| 国产成人在线网址| 99久久九九| 美女福利视频一区| 久久久久久久久久久久久久久久久| 亚洲精品成人| 欧美老少做受xxxx高潮| 精品伦精品一区二区三区视频密桃| 日日狠狠久久偷偷综合色| 日韩精品高清在线| 黄色aaa视频| 成人免费av| 久久精品久久久久电影| 国产盗摄x88av| 国自产拍偷拍福利精品免费一| 久久69精品久久久久久久电影好| 婷婷色中文字幕| 伊人精品成人久久综合软件| 国内精品模特av私拍在线观看| 黄色一级片在线免费观看| 欧美视频官网| 欧美日韩国产成人高清视频| 久久9999久久免费精品国产| 国产精品久久久久久模特| 国产va免费精品高清在线| 最近中文字幕在线观看视频| 国内欧美视频一区二区| 国产精品国产精品国产专区蜜臀ah| 欧美特黄一级视频| 久久精品视频在线免费观看| 一本色道婷婷久久欧美| 在线三级电影| 第一福利永久视频精品| 九九热在线免费| 视频一区日韩| 日韩精品免费在线播放| 蜜臀av午夜精品久久| 好看的日韩av电影| 日韩免费在线免费观看| 国产免费一区二区三区最新不卡| 成人性生交大片免费看视频在线 | 美日韩一区二区| 91麻豆国产精品| 人妻少妇精品无码专区久久| 国产欧美日韩另类视频免费观看| 看一级黄色录像| 一个人看的www视频在线免费观看| 欧美日韩一区二区三区视频 | 精品在线一区二区三区| 国产精品久久久久久久天堂第1集| 美丽的姑娘在线观看免费动漫| 亚洲天堂精品在线观看| 69堂免费视频| 日韩三级久久| 国产丝袜一区视频在线观看| 91嫩草丨国产丨精品| 午夜亚洲视频| 国产成人av一区二区三区| av中文字幕一区二区三区| 亚洲成在人线免费| 亚洲天堂av一区二区| 最新国产一区| 久久久久国产精品一区| 国产又黄又粗又长| 久久久亚洲综合| 无码人妻少妇伦在线电影| **国产精品| 国产午夜精品一区理论片飘花 | 国产xxxx视频| 五月天久久777| 国产精品久久久久9999| 神马久久久久| 亚洲一区二区影院| 欧美国产日韩在线视频| 欧美肉体xxxx裸体137大胆| 26uuu日韩精品一区二区| 成人av一区二区三区在线观看 | 小泽玛利亚一区| 亚洲在线电影| 黑人中文字幕一区二区三区| 久久青青色综合| 日韩视频一区二区三区在线播放| 99自拍偷拍视频| 日韩电影网1区2区| 日本在线高清视频一区| 色在线中文字幕| 亚洲国产天堂久久国产91| 久久久久久久黄色| 成人综合在线观看| 男人天堂av片| 极品尤物一区| 韩国美女主播一区| 日批免费在线观看| 亚瑟在线精品视频| 粉嫩av懂色av蜜臀av分享| 亚洲人成久久| 久久99精品久久久久久三级| 欧美大胆a人体大胆做受| 日韩精品一区二| 五月天综合在线| 99精品黄色片免费大全| 欧美日韩二三区| 亚洲自拍都市欧美小说| 91精品国产91| 欧美精品久久久久久久久久丰满| 日本韩国一区二区| 在线观看日本黄色| 激情欧美一区二区三区在线观看| 影音先锋在线亚洲| 精品欧美视频| 久久全球大尺度高清视频| 性一交一乱一精一晶| 精品久久久久久久中文字幕 | 国产精品久久久久久久久免费高清 | 手机在线视频你懂的| 久久久精品区| 久久久久久国产免费| 深夜福利在线看| 欧美三区在线观看| 五月天av网站| 99久久久国产精品| 成人性生生活性生交12| 亚洲视频在线免费| 精品久久精品久久| 97精品国产综合久久久动漫日韩 | 97操在线视频| 欧美freesex黑人又粗又大| 一区二区三区美女xx视频| 国产三级按摩推拿按摩| 欧美日韩国产精品一区| 黄色三级生活片| 国产不卡视频在线观看| 97视频在线免费播放| 国产精品91一区二区三区| 国产成人成网站在线播放青青| 电影天堂国产精品| 欧美成人剧情片在线观看| 人妻va精品va欧美va| 在线观看日韩高清av| 欧美做爰爽爽爽爽爽爽| 2021国产精品久久精品| 污污的网站免费| 一本色道久久| 国产免费xxx| 久久99国内| 国产精品在线看| 樱花草涩涩www在线播放| 久久久精品在线观看| 你懂得网站在线| 欧美一级爆毛片| 国产男人搡女人免费视频| 亚洲综合男人的天堂| 色欲AV无码精品一区二区久久| 国产精品一区二区x88av| 日本在线视频www| 黄色国产精品| 日韩精品久久久免费观看| 久久夜色精品国产噜噜av小说| 国产在线高清精品| 欧美xx视频| 久久久久国产精品www| 黄页视频在线播放| 永久免费毛片在线播放不卡| 蜜桃av噜噜一区二区三区麻豆| 欧美三级视频在线播放| 欧美一区二区三区网站| 亚洲高清一区二区三区| av激情在线观看| 国产精品天天看| 国产成人av一区二区三区不卡| 99免费精品在线观看| 中文字幕无人区二| 国产自产高清不卡| 自拍偷拍21p| 久久香蕉精品| 久久久一本二本三本| 欧美日韩影院| 黄黄视频在线观看| 91九色精品国产一区二区| 色姑娘综合av| 激情五月色综合国产精品| 国产精品一级久久久| 精品视频一二| 91理论片午午论夜理片久久| 亚洲日日夜夜| 91久久久久久久久| 日韩护士脚交太爽了| 国产日韩欧美夫妻视频在线观看 | 久久在线免费| 欧美另类网站| 久久av电影| 欧美亚洲免费高清在线观看| 西瓜成人精品人成网站| 快播亚洲色图| 国产一区二区三区四区| 日韩精品极品视频在线观看免费| 国产探花一区二区| 日韩在线电影一区| 日韩欧美一区二区三区在线视频| 蜜桃视频在线观看成人| 精品伊人久久久| 国产精品一国产精品最新章节| 国产精品极品| 精品国产综合久久| 精品久久影院| 国产91av视频在线观看| 97偷自拍亚洲综合二区| 国产四区在线观看| 欧美精品日韩| 人妻少妇精品无码专区二区| 亚洲一区亚洲| 久久久免费视频网站| 日本伊人色综合网| xxxx在线免费观看| 成人午夜大片免费观看| 在线视频 日韩| 国产日产欧产精品推荐色 | 国产精品1024| 一区二区三区四区毛片| 免播放器亚洲一区| 中文字幕一二三区| 91小视频在线| 蜜桃av免费在线观看| 亚洲天堂a在线| 日韩黄色精品视频| 欧美三区在线视频| www.av导航| 亚洲欧洲自拍偷拍| 国产二区三区在线| 欧美日韩成人免费| 99只有精品| 粉嫩av四季av绯色av第一区| 猛男gaygay欧美视频| 麻豆传媒网站在线观看| 99精品视频免费观看视频| 亚洲三级视频网站| 粉嫩aⅴ一区二区三区四区五区| 成人免费av片| 亚洲欧美日韩精品久久久久| 国产精品久久久久久久妇| 色999日韩国产欧美一区二区| 国产高中女学生第一次| 亚洲欧美中文字幕| 亚洲小说区图片区都市| 国产福利视频一区二区| www国产精品| 在线国产伦理一区| 亚久久调教视频| 国产xxxxhd| 欧美激情一区二区三区四区| 精品亚洲aⅴ无码一区二区三区| 精品久久久久久久中文字幕| 国产一区二区三区黄片| 亚洲国产精品免费| dj大片免费在线观看| 国产精品吊钟奶在线| 久久人人爽人人爽人人片av不| 亚洲欧洲一区二区在线观看| 国产日韩欧美三区| 日韩精品――色哟哟| 最好看的中文字幕久久| 欧美在线视频精品| 亚洲精品一区二区三区不| 欧美性爽视频| 国产欧美中文字幕| 最新亚洲精品| 波多野结衣之无限发射| 国产精品91xxx| 精品少妇一区二区三区密爱| 在线免费观看成人短视频| 欧美 日韩 人妻 高清 中文| 精品中文字幕在线| 精品国产一区二区三区2021| 亚洲精品一区二区三区四区五区| 一区二区国产精品| 国产伦理在线观看| 成人免费在线观看入口| 亚洲av中文无码乱人伦在线视色| 精品国产1区二区| 污污的网站在线免费观看| 91在线网站视频| 天天精品视频| av中文字幕网址| 国产精品国产自产拍高清av| 日韩特级黄色片| 亚洲国产精品久久久久久| 毛片在线网址| 精品视频高清无人区区二区三区| 在线观看视频免费一区二区三区| 国产精品偷伦视频免费观看了| 一区二区三区毛片| 亚洲第一视频在线播放| 欧美黑人一区二区三区| 美女视频免费精品| av动漫在线看| 久久精品网站免费观看| 日本中文字幕在线观看视频| 国产亚洲欧美另类中文| 欧美性www| 91嫩草国产丨精品入口麻豆| 久久99精品久久久久久久久久久久| www.av视频| 亚洲第一中文字幕| 午夜伦理福利在线| 欧美午夜欧美| 蜜臀av一区二区在线免费观看 | 国产免费视频传媒| 国产婷婷色一区二区三区四区| 五月婷婷激情五月| 久久九九国产精品怡红院| 久久伊人影院| 日韩在线观看a| 91麻豆免费观看| 天堂免费在线视频| 欧美劲爆第一页| 少妇精品久久久一区二区| 奇米影音第四色| 成人免费视频在线观看| www.xxx国产| 欧美一级电影久久| 中国av一区| 欧美一级免费在线| 欧美日韩国产色| 视频三区在线| 国产精品一级久久久| 首页国产欧美久久| 国产成人久久久久|