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

淺談 Java 虛擬機內存區

開發 后端
我們在編寫程序時,經常會遇到 OOM(out of Memory)以及內存泄漏等問題。為了避免出現這些問題,我們首先必須對 JVM 的內存劃分有個具體的認識。JVM 將內存主要劃分為:方法區、虛擬機棧、本地方法棧、堆、程序計數器。

 [[317959]]

Java 虛擬機運行時數據區

運行時數據區劃分

 

 

 

 

運行時數據區包括

  • 方法區(Method Area)
  • 虛擬機棧(VM Stack)
  • 本地方法棧(Native Method Stack)
  • 堆(Heap)
  • 程序計算器(Program Counter Register)
  • 直接內存(Direct Memory)

一、方法區(Method Area)

方法區的概念

方法區又叫靜態區,存放的是已加載的類的基本信息、常量、靜態變量等。它是各個線程共享區域。

比方說我們在寫 Java 代碼時,每個線程度可以訪問同一個類的靜態變量對象。由于使用反射機制的原因,虛擬機很難推測哪那個類信息不再使用,因此這塊區域的回收很難。

靜態塊和非靜態塊有什么區別?

  • 類(Class)和對象(Object)的區別與聯系?
  • 為什么靜態塊中不能使用 this、super 關鍵字?
  • 為什么 java 的靜態方法可以直接用類名調用?

方法區的特點

  • 線程間共享區域

方法區的異常

對這塊區域主要是針對常量池回收,值得注意的是 JDK1.7 已經把常量池轉移到堆里面了。同樣,當方法區無法滿足內存分配需求時,會拋出 OutOfMemoryError。制造方法區內存溢出,注意,必須在 JDK1.6及之前版本才會導致方法區溢出,原因后面解釋,執行之前,可以把虛擬機的參數 -XXpermSize 和 -XX:MaxPermSize 限制方法區大小。

代碼清單如下:

 

  1. public static void printOOM() { 
  2.  List<String> list = new ArrayList<String>(); 
  3.  int i = 0; 
  4.  while (true) { 
  5.  list.add(String.valueOf(i).intern()); 
  6.  } 

輸出異常結果:

 

  1. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
  2.  at java.util.Arrays.copyOf(Arrays.java:2245) 
  3.  at java.util.Arrays.copyOf(Arrays.java:2219) 
  4.  at java.util.ArrayList.grow(ArrayList.java:242) 
  5.  at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216) 
  6.  at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208) 
  7.  at java.util.ArrayList.add(ArrayList.java:440) 
  8.  at com.vprisk.knowledgeshare.MethodAreExample.main(MethodAreExample.java:15) 
  9.  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
  10.  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
  11.  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
  12.  at java.lang.reflect.Method.invoke(Method.java:606) 
  13.  at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

關于 String 的 intern() 函數intern() 的作用:

如果當前的字符串在常量池中不存在,則放入到常量池中。

上面的代碼不斷將字符串添加到常量池,最終肯定會導致內存不足,拋出方法區的 OOM。解釋一下,為什么必須將上面的代碼在 JDK1.6 之前運行。我們前面提到 JDK1.7 后,把常量池放入到堆空間中,這導致 intern() 函數的功能不同,代碼清單如下:

 

  1. public static void testInternMethod(){ 
  2.  String str1 =new StringBuilder("hua").append("chao").toString(); 
  3.  System.out.println(str1.intern()==str1); 
  4.  String str2=new StringBuilder("ja").append("va").toString(); 
  5.  System.out.println(str2.intern()==str2); 

在場景 jdk6,輸出結果:

 

  1. false , false 

在場景 jdk7,輸出結果:

 

  1. true , false 

為什么了?

原因是在 JDK 1.6 中,intern() 方法會把首次遇到的字符串實例復制到常量池中,返回的也是常量池中的字符串的引用,而 StringBuilder 創建的字符串實例是在堆上面,所以必然不是同一個引用,返回false。在 JDK 1.7 中,intern 方法不再復制實例,常量池中只保存首次出現的實例的引用,因此intern() 返回的引用和由 StringBuilder 創建的字符串實例是同一個。為什么對 str2 比較返回的是 false呢?這是因為,JVM 中內部在加載類的時候,就已經有”java”這個字符串,不符合“首次出現”的原則,因此返回 false。

方法區的作用

方法區存放的是類信息、常量、靜態變量等,是各個線程共享區域。

方法區的運用

通過過設置虛擬機的參數-XXpermSize 以及 -XX:MaxPermSize 限制方法區大小。

二、虛擬機棧(VM Stack)

虛擬機棧的概念

Java 方法執行的內存模型:

每個方法被執行的時候都會同時創建一個棧幀 (StackFrame)用于存儲局部變量表、操作棧、動態鏈接、方法出口等信息。每一個方法被調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程

局部變量表

局部變量表存放了編譯器克制的各種基本數據類型(boolean、byte、char、short、int、float、long、double)、對象引用(Object reference)和字節碼指令地址(returnAddress 類型)。

操作棧

操作數棧也常被稱為操作棧,它是一個后入先出(Last In First Out, LIFO)棧。同局部變量表一樣,操作數棧的最大深度也在編譯的時候被寫入到 Code 屬性的max_stacks 數據項之中。操作數棧的每一個元素可以是任意的 Java 數據類型,包括 long 和 double。32 位數據類型所占的棧容量為 1,64 位數據類型所占的棧容量為 2。在方法執行的任何時候,操作數棧的深度都不會超過在 max_stacks 數據項中設定的最大值。

當一個方法剛剛開始執行的時候,這個方法的操作數棧是空的,在方法的執行過程中,會有各種字節碼指令向操作數棧中寫入和提取內容,也就是入棧出棧操作。例如,在做算術運算的時候是通過操作數棧來進行的,又或者在調用其他方法的時候是通過操作數棧來進行參數傳遞的。

舉個例子,整數加法的字節碼指令 iadd 在運行的時候要求操作數棧中最接近棧頂的兩個元素已經存入了兩個int型的數值,當執行這個指令時,會將這兩個int值和并相加,然后將相加的結果入棧。

操作數棧中元素的數據類型必須與字節碼指令的序列嚴格匹配,在編譯程序代碼的時候,編譯器要嚴格保證這一點,在類校驗階段的數據流分析中還要再次驗證這一點。再以上面的 iadd 指令為例,這個指令用于整型數加法,它在執行時,最接近棧頂的兩個元素的數據類型必須為int 型,不能出現一個 long 和一個float 使用 iadd 命令相加的情況。

動態鏈接

每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支持方法調用過程中的動態連接。我們知道 Class 文件的常量池有存有大量的符號引用,字節碼中的方法調用指令就以常量池中指向方法的符號引用為參數。這些符號引用一部分會在類加載階段或第一次使用的時候轉化為直接引用,這種轉化稱為靜態解析。另外一部分將在每一次的運行期間轉化為直接引用,這部分稱為動態連接。

虛擬機棧的特點

  • 線程私有
  • 生命周期與線程相同

虛擬機棧的異常

一種是 StackOverflowError

當前線程如果請求的棧深度大于虛擬機所允許的深度時,則會拋出該異常。例如,將一個函數反復遞歸自己,最終會出現棧溢出錯誤(StackOverflowError)。

代碼清單如下:

 

  1. public class StackOverflowErrorDemo { 
  2.  public static void main(String []args){ 
  3.  printStackOverflowError(); 
  4.  } 
  5.  public static void printStackOverflowError(){ 
  6.  printStackOverflowError(); 
  7.  } 

輸出異常結果:

 

  1. Exception in thread "main" java.lang.StackOverflowError 
  2. stack length:9482 
  3.  at com.itech.jvm.demo.StackOverflowErrorDemo.printStackOverflowError(StackOverflowErrorDemo.java:22) 
  4.  at com.itech.jvm.demo.StackOverflowErrorDemo.printStackOverflowError(StackOverflowErrorDemo.java:22) 
  5.  at com.itech.jvm.demo.StackOverflowErrorDemo.printStackOverflowError(StackOverflowErrorDemo.java:22) 
  6.  at com.itech.jvm.demo.StackOverflowErrorDemo.printStackOverflowError(StackOverflowErrorDemo.java:22) 
  7.  at com.itech.jvm.demo.StackOverflowErrorDemo.printStackOverflowError(StackOverflowErrorDemo.java:22) 
  8.  at com.itech.jvm.demo.StackOverflowErrorDemo.printStackOverflowError(StackOverflowErrorDemo.java:22) 
  9.  at com.itech.jvm.demo.StackOverflowErrorDemo.printStackOverflowError(StackOverflowErrorDemo.java:22) 
  10.  at com.itech.jvm.demo.StackOverflowErrorDemo.printStackOverflowError(StackOverflowErrorDemo.java:22) 
  11.  at com.itech.jvm.demo.StackOverflowErrorDemo.printStackOverflowError(StackOverflowErrorDemo.java:22) 

需要說明的是,在單個線程環境下,無論是棧幀太大,還是虛擬機棧容量太小,當內存無法分配時,虛擬機都會拋出 StackOverflowError 異常。

一種是 OOM 異常

當虛擬機棧支持動態擴展時,如果無法申請到足夠多的內存時就會拋出 OOM 異常。

代碼清單如下:

 

  1. public class VMOOMDemo { 
  2.  public static void main(String[] args) throws Throwable { 
  3.  VMOOMDemo demo = new VMOOMDemo(); 
  4.  demo.printVMOOM(); 
  5.  } 
  6.  public void printVMOOM() { 
  7.  while (true) { 
  8.  new Thread() { 
  9.  public void run() { 
  10.  while (true) { 
  11.  } 
  12.  } 
  13.  }.start(); 
  14.  } 
  15.  } 

這個例子慎用...

本例通過不斷地建立線程的方式產生內存溢出異常。但是,這樣產生的內存溢出異常與棧空間是否足夠大并不存在任何聯系,或者準確地說,在這種情況下,給每個線程的棧分配的內存越大,反而越容易產生內存溢出異常。其原因是操作系統分配給每個進程的內存是有限制的,如 32 位的Windows 限制為 2 GB。。

虛擬機棧的作用

用于存儲局部變量、操作棧、動態鏈接、方法出口

虛擬機棧的運用

對于 32 位的 jvm,默認大小為 256 kb, 而 64 位的 jvm, 默認大小為 512 kb, 可以通過 -Xss 設置虛擬機棧的最大值。不過如果設置過大,會影響到可創建的線程數量。

三、本地方法棧(Native Method Stack)

本地方法棧的概念

本地方法棧與虛擬機棧所發揮的作用很相似,他們的區別在于虛擬機棧為執行Java代碼方法服務,而本地方法棧是為 Native 方法服務。與虛擬機棧一樣,本地方法棧也會拋出 StackOverflowError 和 OutOfMemoryError 異常。

本地方法棧的特點

  • 線程私有
  • 為 Native 方法服務

本地方法棧的異常

與虛擬機棧一樣,本地方法棧也會拋出 StackOverflowError 和 OutOfMemoryError 異常。

本地方法棧的作用

  • 與 java 環境外交互

有時 java 應用需要與 java 外面的環境交互。這是本地方法存在的主要原因,你可以想想 java 需要與一些底層系統如操作系統或某些硬件交換信息時的情況。

本地方法正是這樣一種交流機制:它為我們提供了一個非常簡潔的接口,而且我們無需去了解 java 應用之外的繁瑣的細節。

  • 與操作系統交互

JVM 支持著 java 語言本身和運行時庫,它是 java 程序賴以生存的平臺,它由一個解釋器(解釋字節碼)和一些連接到本地代碼的庫組成。然而不管怎樣,它畢竟不是一個完整的系統,它經常依賴于一些底層(underneath 在下面的)系統的支持。這些底層系統常常是強大的操作系統。通過使用本地方法,我們得以用 java 實現了 jre 的與底層系統的交互,甚至 JVM 的一些部分就是用 C 寫的,還有,如果我們要使用一些 java 語言本身沒有提供封裝的操作系統的特性時,我們也需要使用本地方法。

Sun's Java Sun 的解釋器是用 C 實現的,這使得它能像一些普通的 C 一樣與外部交互。jre 大部分是用java 實現的,它也通過一些本地方法與外界交互。例如:類 java.lang.Thread

的 setPriority() 方法是用 java 實現的,但是它實現調用的是該類里的本地方法setPriority0()。這個本地方法是用 C 實現的,并被植入 JVM 內部,在 Windows 95 的平臺上,這個本地方法最終將調用 Win32 SetPriority() API。這是一個本地方法的具體實現由JVM直接提供,更多的情況是本地方法由外部的動態鏈接庫(external dynamic link library)提供,然后被 JVM 調用。

四、Java 堆(Heap)

Java 堆的概念

Java 堆可以說是虛擬機中最大一塊內存了。它是所有線程所共享的內存區域,幾乎所有的實例對象都是在這塊區域中存放。當然,隨著JIT編譯器的發展,所有對象在堆上分配漸漸變得不那么“絕對”了。

Java 堆是垃圾收集器管理的主要區域。由于現在的收集器基本上采用的都是分代收集算法,所有 Java 堆可以細分為:新生代和老年代。在細致分就是把新生代分為:

  • Eden 空間
  • From Survivor
  • To Survivor

根據 Java 虛擬機規范的規定:

Java 堆可以處于物理上不連續的內存空間中,只要邏輯上是連續的即可,就像我們的磁盤空間一樣。在實現時,既可以實現成固定大小的,也可以是可擴展的,不過當前主流的虛擬機都是按照可擴展來實現的。

Java 堆的特點

  • 線程間共享區域,在虛擬機啟動時創建
  • 是虛擬機中最大的一塊內存,幾乎所有的實例對象都是在這塊區域中存放

Java 堆的異常

當堆無法再擴展時,會拋出 OutOfMemoryError 異常。

Java 堆的作用

唯一目的就是存放對象實例,幾乎所有的對象實例都在 java 堆中分配內存

Java 堆的運用

通過 -Xmx 和 -Xms 控制

五、程序計算器(Program Counter Register)

程序計算器的概念

類似于 PC 寄存器,程序計數器是線程私有的區域,每個線程都有自己的程序計算器。可以把它看成是當前線程所執行的字節碼的行號指示器。

程序計算器的特點

  • 線程私有
  • 占用的內存空間小
  • 此內存區域是唯一一個在Java虛擬機規范中沒有規定任何OOM(OutOfMemoryError)情況的區域

程序計算器的異常

此內存區域是唯一一個在 Java 虛擬機規范中沒有規定任何 OOM(OutOfMemoryError)情況的區域

程序計算器的作用

  • 信號指示器:多線程間切換時,需恢復每一個線程的當前執行位置,通過程序計數器中的值尋找要執行的指令的字節碼
  • 如果線程在執行 Java 方法,計數器記錄的是正在執行的虛擬機字節碼指令地址;如果執行的是 Native 方法,計數器的值為空(Undefined)。

程序計算器的運用

通過 -Xmx 和 -Xms 控制

六、直接內存(Direct Memory)

什么是直接內存與非直接內存?

根據官方文檔的描述:

A byte buffer is either direct or non-direct. Given a direct byte buffer, the Java virtual machine will make a best effort to perform native I/O operations directly upon it. That is, it will attempt to avoid copying the buffer's content to (or from) an intermediate buffer before (or after) each invocation of one of the underlying operating system's native I/O operations.

byte byffer 可以是兩種類型,一種是基于直接內存(也就是非堆內存);另一種是非直接內存(也就是堆內存)。

直接內存(Direct Memory)既不屬于虛擬機運行時數據區的一部分,也不屬于 Java虛擬機規范中定義的內存區域,但是這部分內存卻被頻繁地使用,而且還可能導致OutOfMemoryError 異常出現。

對于直接內存來說,JVM 將會在 IO 操作上具有更高的性能,因為它直接作用于本地系統的 IO 操作。而堆內存如果要作 IO 操作,會先復制到直接內存,再利用本地 IO 處理。

從數據流的角度,非直接內存的作用鏈:

本地IO-->直接內存-->非直接內存-->直接內存-->本地IO

而直接內存的作用鏈:

本地IO-->直接內存-->本地IO

很明顯,在做 IO 處理時,比如網絡發送大量數據時,直接內存會具有更高的效率。

A direct byte buffer may be created by invoking the allocateDirect factory method of this class. The buffers returned by this method typically have somewhat higher allocation and deallocation costs than non-direct buffers. The contents of direct buffers may reside outside of the normal garbage-collected heap, and so their impact upon the memory footprint(內存占用) of an application might not be obvious. It is therefore recommended that direct buffers be allocated primarily for large, long-lived buffers that are subject to the underlying system's native I/O operations. In general it is best to allocate direct buffers only when they yield a measureable gain in program performance.

但是由于直接內存使用allocateDirect 創建,它比申請普通的堆內存需要耗費更高的性能。不過它不會占用應用的堆內存。所以,當你有大量數據要緩存時,并且它的生命周期又比較長,那么使用直接內存是個不錯的選擇。但如果該選擇不能帶來顯著的性能提升,推薦使用堆內存。

在 JDK1.4 的 NIO 中,ByteBuffer 有個方法是:

 

  1. public static ByteBuffer allocateDirect(int capacity) { 
  2.  return new DirectByteBuffer(capacity); 
  3. DirectByteBuffer(int cap) { 
  4.  ...... 
  5.  protected static final Unsafe unsafe = Bits.unsafe(); 
  6.  unsafe.allocateMemory(size); 
  7.  ...... 
  8. public final class Unsafe { 
  9.  ...... 
  10.  public native long allocateMemory(long var1); 
  11.  ...... 

另外直接內受限于本機總內存(包括 RAM 及 SWAP 區或者分頁文件)的大小及處理器尋址空間的限制。

服務器管理員配置虛擬機參數時,一般會根據實際內存設置 -Xmx 等參數信息,但經常會忽略掉直接內存,使得各個內存區域的總和大于物理內存限制(包括物理上的和操作系統級的限制),從而導致動態擴展時出現 OutOfMemoryError 異常。

直接內存的特點

  • 不受 Java 堆大小的限制
  • 既不是虛擬機運行時數據區的一部分,也不是 Java 虛擬機規范中定義的內存區域,不會占用應用的內存
  • IO 操作上具有更高的性能,因為它直接作用于本地系統的 IO 操作
  • 它比申請普通的堆內存需要耗費更高的性能。

直接內存的異常

動態擴展時出現 OutOfMemoryError 異常

直接內存的作用

基于通道(Channel)與緩沖區(Buffer)的 I/O 方式,它可以使用 Native 函數庫直接分配堆外內存,然后通過一個存儲在 Java 堆里面的 DirectByteBuffer 對象作為這塊內存的引用進行操作。這樣能在一些場景中顯著提高性能,因為避免了在 Java 堆和Native 堆中來回復制數據。

直接內存的運用

 

  1. XX:MaxDirectMemorySize=10M 

直接內存的使用場景

例如在 IO 處理時,比如網絡發送大量數據時,直接內存會具有更高的效率。

責任編輯:華軒 來源: 架構薈萃
相關推薦

2019-04-09 15:56:46

虛擬機內存區Java

2009-10-09 09:42:07

虛擬機內存

2010-05-31 16:53:21

Java

2019-11-20 15:02:45

Java虛擬機內存

2011-05-26 15:41:25

java虛擬機

2009-06-18 13:51:07

Java虛擬機

2010-09-17 15:47:14

TOMCATJVM

2018-03-28 14:58:42

虛擬機內核系統

2024-04-03 13:49:00

Java虛擬機方法區

2011-12-28 13:38:00

JavaJVM

2018-11-22 12:07:37

Java虛擬機結構

2009-06-17 15:39:00

本機內存硬件限制虛擬內存

2009-06-04 16:27:39

Java虛擬機JVMGC

2021-04-14 18:58:01

虛擬機 Java內存

2020-07-08 07:50:50

OOM虛擬機Java

2009-06-17 15:46:36

Java運行時本機內存

2010-05-14 11:38:24

虛擬機備份

2024-03-20 10:48:09

Java 8內存管理

2011-06-28 15:37:34

Qt 內存

2024-03-13 08:03:02

點贊
收藏

51CTO技術棧公眾號

午夜先锋成人动漫在线| 欧美xxxx黑人又粗又长| 久久99在线观看| 欧美高清电影在线看| avtt香蕉久久| 91精品国产经典在线观看| 一区二区三区在线观看国产| 久久久综合亚洲91久久98| 一级黄色a毛片| 国产精品普通话对白| 色婷婷综合成人| 国产一级伦理片| 欧美黄页免费| 欧美视频不卡中文| 成人黄色片免费| 自拍视频在线| 91丨porny丨国产| 亚洲精品欧美极品| 色婷婷久久综合中文久久蜜桃av| 国内精品美女在线观看| 自拍亚洲一区欧美另类| 亚洲av无码一区二区三区观看| 日日夜夜亚洲精品| 91精品91久久久中77777| 男女激情免费视频| 成人影院www在线观看| 久久久久久免费| 国产日韩二区| 亚洲AV无码成人片在线观看| 免费观看日韩电影| 日韩av男人的天堂| 成人午夜视频精品一区| 午夜久久黄色| 不卡av在线网站| 国产又粗又猛又爽又黄的视频小说 | 成人18夜夜网深夜福利网| 欧美日韩成人在线一区| 国产天堂在线播放| 亚洲欧美电影| 欧美日韩激情小视频| 野外做受又硬又粗又大视频√| 蜜桃视频在线观看www社区| 久久久久久9999| 欧美精品人人做人人爱视频| 亚洲乱色熟女一区二区三区| 久久成人免费网| 91精品久久久久久久久不口人| 久久精品视频2| 久久青草久久| 国产成人一区二区在线| 青草视频在线观看免费| 国产日本精品| 浅井舞香一区二区| 国产真人无遮挡作爱免费视频| 久久xxxx精品视频| 奇米四色中文综合久久| 成年人视频在线免费看| 亚洲综合社区| 国产精品久久久久久久av电影| 高潮毛片又色又爽免费| 青青草国产成人av片免费| 国产精品免费网站| 国产一区二区三区视频免费观看| 国产尤物一区二区在线| 亚洲va男人天堂| 亚洲精品一区二区三区不卡| 不卡视频在线观看| 欧美中文娱乐网| 69av亚洲| 亚洲国产精品影院| 又粗又黑又大的吊av| 久久精品女人天堂av免费观看| 色欧美乱欧美15图片| 亚洲 欧美 另类人妖| 99国内精品久久久久| 欧美mv日韩mv国产| 爱爱免费小视频| 国产精品成人av| 久久久久久一区二区三区 | 免费看a在线观看| 亚洲激情网站免费观看| 日本www在线视频| 蜜桃视频成人m3u8| 欧美一区二区三区免费| 特级西西人体4444xxxx| 大胆日韩av| 久久久久久av| 青青艹在线观看| 国产成人午夜视频| 日韩欧美亚洲在线| 国产蜜臀一区二区打屁股调教| 黑人巨大精品欧美一区二区一视频| 国产一级特黄a大片免费| 亚洲一区电影| 伊是香蕉大人久久| 日本免费在线播放| 蜜臀av亚洲一区中文字幕| 国产高清自拍一区| 成年人视频免费在线观看| 一区二区成人在线观看| 青青草av网站| 好吊妞视频这里有精品| 中文字幕日韩有码| 全部毛片永久免费看| 精彩视频一区二区三区| 久久精品日产第一区二区三区 | 国产精品理伦片| www.国产在线播放| 日本精品久久| 亚洲欧美三级伦理| 国产一级大片在线观看| 美女国产一区二区| 欧美日韩电影一区二区| bestiality新另类大全| 欧美亚一区二区| 男男做爰猛烈叫床爽爽小说 | 亚洲精品国产九九九| 国产香蕉97碰碰久久人人| 久久精品国产亚洲av香蕉| 免费观看成人鲁鲁鲁鲁鲁视频| 精品久久久久久乱码天堂| 国产91在线视频蝌蚪| 欧美在线播放高清精品| 国产福利短视频| 激情久久久久| 99久久99久久精品国产片| 成人jjav| 在线区一区二视频| 中文字幕在线看高清电影| 欧美久色视频| 91在线色戒在线| 91高清在线视频| 91激情在线视频| 国产精品九九九九九| 99成人在线| 精品91免费| www.综合| 日韩福利在线播放| 99热只有这里有精品| 9i在线看片成人免费| 嫩草影院中文字幕| 日韩精品一级| 欧美激情免费看| 99久久久国产精品无码免费| 亚洲欧洲在线观看av| 男人的天堂日韩| 久久狠狠久久| 欧美性受xxxx白人性爽| 欧美色图另类| 色国产综合视频| 日本一区二区视频在线播放| 日本在线不卡视频| 午夜精品美女久久久久av福利| 秋霞国产精品| 自拍偷拍免费精品| 97超碰人人模人人人爽人人爱| 国产精品少妇自拍| 国产免费中文字幕| 午夜欧美精品| 国产精品免费在线播放| 少妇在线看www| 亚洲欧美一区二区三区四区| 日韩精品久久久久久免费| 久久久亚洲高清| 婷婷激情四射五月天| 97精品视频| 亚洲一区二区三区四区在线播放| 在线观看中文| 亚洲美女av网站| 中文字幕网址在线| 亚洲精品久久久久久国产精华液| 一级黄色片毛片| 亚洲欧美日韩在线观看a三区| 欧美尤物一区| **日韩最新| 97在线视频观看| 成人影视在线播放| 欧美一区二区三区在线| 日韩成人av毛片| 国产欧美一区二区精品性色| 久久久久久久久久一区| 国自产拍偷拍福利精品免费一 | 国产日韩精品在线观看| 18视频在线观看网站| 国产丝袜高跟一区| 国产精品系列视频| 福利一区福利二区微拍刺激| 国产亚洲精品精品精品| 国产高清成人在线| 99热成人精品热久久66| 久久精品青草| 蜜桃传媒视频麻豆第一区免费观看 | 神马久久久久久久久久久| 国产一区二区久久| www.爱色av.com| 先锋资源久久| 欧美成人蜜桃| 亚洲国产aⅴ精品一区二区| 26uuu另类亚洲欧美日本一| 蜜芽在线免费观看| 亚洲欧美精品在线| 亚洲精品视频专区| 欧美日韩在线三级| 国产情侣自拍av| 一区二区三区四区国产精品| 伊人网在线视频观看| 国产毛片精品一区| 无码精品国产一区二区三区免费| 欧美国产先锋| 中文字幕一区二区三区有限公司| 天堂俺去俺来也www久久婷婷| 亚洲aⅴ男人的天堂在线观看| 欧美成人h版| 欧美精品久久久久久久久| 日韩精品毛片| 亚洲视频网站在线观看| 老熟妇高潮一区二区高清视频| 欧美日本在线视频| 欧美国产一级片| 欧美日韩国产精品一区二区三区四区 | 少妇人妻一区二区| 欧美一区二区三区小说| 波多野结衣一区二区三区在线| 亚洲国产精品久久一线不卡| 亚洲怡红院在线观看| 国产欧美视频在线观看| 色婷婷精品久久二区二区密| 国产福利视频一区二区三区| 伊人国产在线视频| 日日摸夜夜添夜夜添国产精品| 欧美精品卡一卡二| 欧美高清不卡| 日本天堂免费a| 久久久久免费av| 国产高潮呻吟久久久| 欧美高清视频手机在在线| 日韩欧美精品久久| 国内精品久久久久久久影视简单 | 精品人伦一区二区三区蜜桃网站| 免费一级片视频| 亚洲自拍与偷拍| 欧美精品一区二区蜜桃| 一区二区三区鲁丝不卡| 欧洲第一无人区观看| 日韩理论片一区二区| 超碰人人干人人| 国产精品乱码一区二区三区软件 | 国产精品一二三在线| 精品国模一区二区三区| 国产精品18久久久久久麻辣| av有声小说一区二区三区| 国产精品草莓在线免费观看| 日本欧美一区| 成人美女av在线直播| 国产一区二区三区| 国产精品xxxx| 欧美五码在线| 日本成人黄色免费看| 日韩激情图片| 中文字幕在线乱| 国产精品hd| 国产九九九九九| 日韩中文字幕91| 五月天开心婷婷| 成人精品免费视频| 精品无码在线视频| 国产欧美日韩在线| 51精品免费网站| 午夜精品在线视频一区| 无码人妻一区二区三区线| 欧美体内she精视频| 97在线公开视频| 精品美女在线观看| 久草在线网址| 久久久精品中文字幕| 日本h片在线| 日本免费久久高清视频| 六九午夜精品视频| 亚洲aⅴ日韩av电影在线观看| 国产一级成人av| 日韩免费av一区二区三区| 亚洲国产老妈| 91免费视频网站在线观看| 看片的网站亚洲| 国产一卡二卡三卡四卡| 欧美国产日韩精品免费观看| 欧美激情精品久久久久久免费| 亚洲成人中文在线| 国产精品成人久久久| 日韩免费一区二区| 国产黄在线观看| 久久久久久国产免费| 日韩大片欧美大片| 波多野结衣成人在线| 伊人久久大香线蕉av不卡| 色爽爽爽爽爽爽爽爽| 亚洲尤物在线| 91热视频在线观看| 久久久久99精品一区| 青草草在线视频| 欧美最猛黑人xxxxx猛交| 超碰在线人人干| 国产亚洲a∨片在线观看| 五月花成人网| 国产精品第二页| 久久亚州av| 黑人巨大国产9丨视频| 日韩国产欧美在线视频| 亚洲天堂av网站| 亚洲色图在线播放| 中文字幕+乱码+中文| 日韩av综合网| 欧美aaa免费| 成人激情春色网| 日韩1区在线| 不要播放器的av网站| 不卡av在线免费观看| 日韩女优一区二区| 欧美日韩的一区二区| 久草在线免费福利资源| 81精品国产乱码久久久久久| 日韩一二三区| 看全色黄大色大片| 毛片av中文字幕一区二区| av男人的天堂av| 欧美性极品少妇精品网站| 欧美 日韩 国产 成人 在线 91| 久久亚洲成人精品| 欧美综合影院| 午夜精品福利一区二区| 日韩国产精品久久久久久亚洲| 成年人网站免费看| 欧美性猛交xxxx| 完全免费av在线播放| 在线视频观看91| 中文字幕一区在线观看视频| 国产裸体美女永久免费无遮挡| 亚洲精品永久免费| 性爽视频在线| 噜噜噜噜噜久久久久久91| 亚洲免费观看| 国产麻豆天美果冻无码视频| 午夜成人免费视频| 亚洲欧美一区二区三| 国产+成+人+亚洲欧洲| 巨人精品**| 欧美亚洲另类色图| 久久精品欧美日韩| 中文字幕 自拍偷拍| 中文字幕亚洲综合久久筱田步美| 日韩精品第一| 自拍亚洲欧美老师丝袜| 国产精品白丝jk白祙喷水网站| 朝桐光av在线| 精品久久久网站| www.综合| 日韩欧美在线电影| 精东粉嫩av免费一区二区三区| 日韩欧美123区| 欧美sm极限捆绑bd| 蜜臀久久精品| 色就是色欧美| 韩国三级在线一区| 国产在线综合网| 日韩激情在线视频| 播放一区二区| 中文字幕在线中文字幕日亚韩一区| 国产精品一区二区三区网站| 青青操国产视频| 日韩电影视频免费| 成人午夜sm精品久久久久久久| 日韩 欧美 自拍| aaa国产一区| 精品国产青草久久久久96| 欧美成人小视频| 欧美久久香蕉| jizz18女人| 亚洲成av人片一区二区| 蜜桃免费在线| 91免费版黄色| 日韩和欧美的一区| 久操视频免费在线观看| 亚洲九九九在线观看| 亚洲精品大片| 一区二区传媒有限公司| 中文字幕亚洲精品在线观看| 丰满人妻一区二区三区四区53| 欧美最顶级丰满的aⅴ艳星| 久久综合国产| 99久久人妻无码中文字幕系列| 欧美性生活大片视频| 免费在线播放电影| 日韩免费三级| a在线欧美一区| 一级淫片免费看| 2019中文字幕在线免费观看| 天天射—综合中文网| aaaaa级少妇高潮大片免费看| 制服视频三区第一页精品| 韩国美女久久|