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

面試必問:說一下 Java 虛擬機的內存布局?

開發 前端
當然它通常是 JVM 模塊的第一個面試問題,所以,接下來我們一起來看它里面包含了哪些內容。

我們通常所說的 Java 虛擬機(JVM)的內存布局,一般是指 Java 虛擬機的運行時數據區(Runtime Data Area),也就是當字節碼被類加載器加載之后的執行區域劃分。當然它通常是 JVM 模塊的第一個面試問題,所以,接下來我們一起來看它里面包含了哪些內容。

官方定義

《Java虛擬機規范》中將 JVM 運行時數據區域劃分為以下 5 部分:

  1. 程序計數器(Program Counter Register)
  2. Java虛擬機棧(Java Virtual Machine Stacks)
  3. 本地方法棧(Native Method Stack)
  4. Java 堆(Java Heap)
  5. 方法區(Methed Area)

如下圖所示:

接下來,我們分別來看每個模塊的作用及詳細介紹。

一、程序計數器

《Java虛擬機規范》中對程序計數器的定義如下:

The Java Virtual Machine can support many threads of execution at once (JLS §17). Each Java Virtual Machine thread has its own pc (program counter) register. At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method (§2.6) for that thread. If that method is not native, the pc register contains the address of the Java Virtual Machine instruction currently being executed. If the method currently being executed by the thread is native, the value of the Java Virtual Machine's pc register is undefined. The Java Virtual Machine's pc register is wide enough to hold a returnAddress or a native pointer on the specific platform.

以上內容翻譯成中文,簡單來說它的含義是:JVM 中可以有多個執行線程,每個線程都有自己的程序計數器,在程序計數器中包含的是正在執行線程的指令地址。

也就是說,程序計數器(Program Counter Register)是線程獨有一塊很小的內存區域,保存當前線程所執行字節碼的位置,包括正在執行的指令、跳轉、分支、循環、異常處理等。

1、作用

我們知道,CPU 核數是比較少的,而任務(線程)是比較多的,所以真實的情況是,CPU 會不停的切換線程以執行所有的程序,當然因為(CPU)切換的速度比較快,所以我們是感知不到的,我們感覺好像所有的程序都是一直在執行,其實從微觀的層面來看,所有的程序都是切換執行的。

那么問題來了,CPU 一直在切換線程執行任務,那 CPU 再次切換到某個線程時,它是怎么知道當前的線程上次知道到哪了?

這就是程序計數器的作用,程序計數器里面保存了當前線程執行的行號,這樣當 CPU 切換到當前線程時,才能接著上次執行的位置,繼續執行

PS:程序計數器中真實記錄的是下一行任務的執行指令。程序計數器也是 JVM 運行時數據區中執行最快的一塊區域。

2、線程共享

程序計數器記錄的是每個線程的執行行號,所以每個線程都擁有自己的程序計數器,所以此區域不是線程共享的,而是線程私有的

3、GC

GC 是 Garbage Collection 的縮寫,譯為垃圾收集。

此區域不存在 GC。

4、OOM

OOM 是 Out of Memory 的縮寫,譯為內存溢出。

此區域不存在 OOM 的問題。

二、Java 虛擬機棧

Java 虛擬機棧(Java Virtual Machine Stack)也叫做 JVM 棧,《Java虛擬機規范》對此區域的說明如下:

Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread. A Java Virtual Machine stack stores frames (§2.6). A Java Virtual Machine stack is analogous to the stack of a conventional language such as C: it holds local variables and partial results, and plays a part in method invocation and return. Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous.

In the First Edition of The Java? Virtual Machine Specification, the Java Virtual Machine stack was known as the Java stack.

This specification permits Java Virtual Machine stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the Java Virtual Machine stacks are of a fixed size, the size of each Java Virtual Machine stack may be chosen independently when that stack is created.

A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of Java Virtual Machine stacks, as well as, in the case of dynamically expanding or contracting Java Virtual Machine stacks, control over the maximum and minimum sizes.

The following exceptional conditions are associated with Java Virtual Machine stacks:

  • If the computation in a thread requires a larger Java Virtual Machine stack than is permitted, the Java Virtual Machine throws a StackOverflowError.
  • If Java Virtual Machine stacks can be dynamically expanded, and expansion is attempted but insufficient memory can be made available to effect the expansion, or if insufficient memory can be made available to create the initial Java Virtual Machine stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.

以上內容翻譯成中文的含義如下:

Java 虛擬機棧是線程私有的區域,它隨著線程的創建而創建。它里面保存的是局部變量表(基礎數據類型和對象引用地址)和計算過程中的中間結果。Java 虛擬機的內存不需要連續,它只有兩個操作:入棧和出棧。

Java 虛擬機棧要么大小固定,要么根據計算動態的擴展和收縮。程序員可以對 Java 虛擬機棧進行初始值的大小設置和最大值的設置。

Java 虛擬機棧出現的異常有兩種:

  • 當 Java 虛擬機棧大小固定時,如果程序中的棧分配超過了最大虛擬機棧就會出現 StackOverflowError 異常。
  • 如果 Java 虛擬機棧是動態擴展的,那么當內存不足時,就會引發 OutOfMemoryError 的異常。

1、作用

Java 虛擬機棧主要是管 Java 程序運行的,它保存的是方法的局部變量、方法執行中的部分結果,并參與方法的調用和返回。
簡單來說,棧是運行時單位,而堆是存儲單位。也就是說:棧解決的是程序運行的問題,即程序如何執行?或者說如何處理數據。堆解決的是數據存儲的問題,即數據怎么放?放在哪兒。

2、線程共享

Java 虛擬機棧是線程私有的,它的生命周期和線程的生命周期一致。

3、GC

Java 虛擬機棧因為只有入棧和出棧兩個操作,所以它是不涉及垃圾回收的。

4、OOM

此區域雖然沒有 GC,但存在兩種異常:

  • 當 Java 虛擬機棧大小固定時,如果程序中的棧分配超過了最大虛擬機棧就會出現 StackOverflowError 異常。
  • 如果 Java 虛擬機棧是動態擴展的,那么當內存不足時,就會引發 OutOfMemoryError 的異常。

也就是,Java 虛擬機棧是可能存在 OOM 的。

5、常見參數設置

設置 Java 虛擬機棧大小:-Xss<size>。

如設置:-Xss128k,表示設置每個線程的棧大小為 128k,此設置等價于 -XX:ThreadStackSize=128k。

6、常見問題演示

最簡單的錯誤示例就是死循環,方法自己調自己,這樣 Java 虛擬機棧就會只入棧不出棧,當到達 Java 虛擬機棧的最大數之后就會出現 StackOverflowError 異常,如下圖所示:

三、本地方法棧

本地方法棧(Native Method Stacks),《Java 虛擬機規范》對此區域的說明如下:

An implementation of the Java Virtual Machine may use conventional stacks, colloquially called "C stacks," to support native methods (methods written in a language other than the Java programming language). Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine's instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created.

This specification permits native method stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the native method stacks are of a fixed size, the size of each native method stack may be chosen independently when that stack is created.

A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the native method stacks, as well as, in the case of varying-size native method stacks, control over the maximum and minimum method stack sizes.

The following exceptional conditions are associated with native method stacks:

  • If the computation in a thread requires a larger native method stack than is permitted, the Java Virtual Machine throws a StackOverflowError.
  • If native method stacks can be dynamically expanded and native method stack expansion is attempted but insufficient memory can be made available, or if insufficient memory can be made available to create the initial native method stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.

以上內容,挑重點簡單翻譯一下:本地方法棧俗稱“C棧”,它是 Native(本地)方法(用 Java 編程語言以外的語言編寫的方法),此區域和 Java 虛擬機棧類似,這不過諸如 C 語言等使用的棧空間。它也是存在兩種異常:StackOverflowError 和 OutOfMemoryError。

PS:因為此區域是非 Java 語言實現和使用的,所以本文就不做過多的贅述,總之,記得一句話:此區域和 Java 虛擬機棧類似,不過是給 C/C++ 語言使用的。

四、堆

堆(Heap)《Java 虛擬機規范》對此區域的說明如下:

The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated.

The heap is created on virtual machine start-up. Heap storage for objects is reclaimed by an automatic storage management system (known as a garbage collector); objects are never explicitly deallocated. The Java Virtual Machine assumes no particular type of automatic storage management system, and the storage management technique may be chosen according to the implementor's system requirements. The heap may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger heap becomes unnecessary. The memory for the heap does not need to be contiguous.

A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the heap, as well as, if the heap can be dynamically expanded or contracted, control over the maximum and minimum heap size.

The following exceptional condition is associated with the heap:

  • If a computation requires more heap than can be made available by the automatic storage management system, the Java Virtual Machine throws an OutOfMemoryError.

以上內容,挑重點簡單翻譯一下:

堆是線程共享的,程序中所有類實例和數組的內存都存儲在此區域,它在 Java 虛擬機啟動時就會創建。對象不會被顯式釋放,只會在垃圾收集時釋放。堆的大小可以是固定的,也可以動態擴展或收縮。堆的內存在物理層面不需要是連續的。

程序員可以對堆進行初始大小控制,或者設置最大、最小堆的容量。

堆可能會出現 OutOfMemoryError 異常。

1、作用

堆是 Java 虛擬機的主要存儲單位,Java 中所有的對象和數組都是保存在此區域的。

2、線程共享

堆是線程共享的,堆上的對象可能被多個線程同時訪問。

3、GC

堆是 JVM 最大的一塊區域,也是垃圾回收器進行垃圾回收最頻繁的一塊區域。

4、OOM

當堆空間不足時,會發生 OutOfMemoryError 異常。

5、常見參數設置

  • -Xms<size>:設置初始 Java 堆大小,比如:-Xms10m,表示設置堆的初始大小為 10MB。
  • -Xmx<size>:設置最大 Java 堆大小,比如:-Xmx10m,表示設置堆的最大空間為 10MB。

6、常見問題演示

接下來,我們來演示一下堆空間 OOM 的問題,我們先使用“-Xmx50m”的參數來設置一下 Idea,它表示將程序運行的最大內存設置為 50m,如果程序的運行超過這個值就會出現內存溢出的問題,設置方法如下:

設置后的最終效果這樣的:

PS:因為我使用的 Idea 是社區版,所以可能和你的界面不一樣,你只需要點擊“Edit Configurations...”找到“VM options”選項,設置上“-Xmx50m”參數就可以了。

配置完 Idea 之后,接下來我們來實現一下業務代碼。在代碼中我們會創建一個大對象,這個對象中會有一個 10m 大的數組,然后我們將這個大對象存儲在 ThreadLocal 中,再使用線程池執行大于 5 次添加任務,因為設置了最大運行內存是 50m,所以理想的情況是執行 5 次添加操作之后,就會出現內存溢出的問題,實現代碼如下:

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadLocalOOMExample {

/**
* 定義一個 10m 大的類
*/
static class MyTask {
// 創建一個 10m 的數組(單位轉換是 1M -> 1024KB -> 1024*1024B)
private byte[] bytes = new byte[10 * 1024 * 1024];
}

// 定義 ThreadLocal
private static ThreadLocal<MyTask> taskThreadLocal = new ThreadLocal<>();

// 主測試代碼
public static void main(String[] args) throws InterruptedException {
// 創建線程池
ThreadPoolExecutor threadPoolExecutor =
new ThreadPoolExecutor(5, 5, 60,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(100));
// 執行 10 次調用
for (int i = 0; i < 10; i++) {
// 執行任務
executeTask(threadPoolExecutor);
Thread.sleep(1000);
}
}

/**
* 線程池執行任務
* @param threadPoolExecutor 線程池
*/
private static void executeTask(ThreadPoolExecutor threadPoolExecutor) {
// 執行任務
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println("創建對象");
// 創建對象(10M)
MyTask myTask = new MyTask();
// 存儲 ThreadLocal
taskThreadLocal.set(myTask);
// 將對象設置為 null,表示此對象不在使用了
myTask = null;
}
});
}
}

以上程序的執行結果如下:

從上述圖片可看出,當程序執行到第 5 次添加對象時就出現內存溢出的問題了,這是因為設置了最大的運行內存是 50m,每次循環會占用 10m 的內存,加上程序啟動會占用一定的內存,因此在執行到第 5 次添加任務時,就會出現內存溢出的問題。

五、方法區

方法區(Method Area)《Java 虛擬機規范》對此區域的說明如下:

The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§2.9) used in class and instance initialization and interface initialization.

The method area is created on virtual machine start-up. Although the method area is logically part of the heap, simple implementations may choose not to either garbage collect or compact it. This specification does not mandate the location of the method area or the policies used to manage compiled code. The method area may be of a fixed size or may be expanded as required by the computation and may be contracted if a larger method area becomes unnecessary. The memory for the method area does not need to be contiguous.

A Java Virtual Machine implementation may provide the programmer or the user control over the initial size of the method area, as well as, in the case of a varying-size method area, control over the maximum and minimum method area size.

The following exceptional condition is associated with the method area:

  • If memory in the method area cannot be made available to satisfy an allocation request, the Java Virtual Machine throws an OutOfMemoryError.

以上內容,挑重點簡單翻譯一下:

方法區是線程共享的,方法區類似于傳統語言的編譯代碼的存儲區,或者類似于操作系統進程中的“文本”段。它存儲每個類的結構,如運行時常量池、字段和方法數據,以及方法和構造函數的代碼。

方法區域是在 Java 虛擬機啟動時創建的,盡管方法區域在邏輯上是堆的一部分,但簡單的實現可能選擇不進行垃圾收集或壓縮。方法區域可以是固定的大小,也可以動態擴展。方法區的(物理)內存不需要連續。

Java 虛擬機實現可以為程序員或用戶提供對方法區域初始大小的控制,以及在可變大小的方法區域的情況下,對最大和最小方法區域大小的控制。

如果方法區中的內存無法滿足分配請求,Java 虛擬機將拋出一個 OutOfMemoryError。

1、作用

用于存儲每個類的結構,包括運行時常量池、靜態變量、字段和方法數據

2、HotSpot 方法區實現

HotSpot 虛擬機是 Sun JDK 和 Open JDK 中自帶的虛擬機,也是目前使用范圍最廣的 Java 虛擬機。作為官方 Java 虛擬機的化身,目前所講的所有知識,幾乎都是針對此虛擬機的,所以我們要看 HotSpot 虛擬機對《Java 虛擬機規范》中方法區的實現。

?對于 HotSpot 虛擬機來說,不同的 JDK 方法區的實現是不同的,在 JDK 1.7 之前,HotSpot 技術團隊使用的是永久代來實現方法區的,但這種實現有一個致命的問題,這樣設計更容易造成內存溢出。因為永久代有 -XX:MaxPermSize(方法區分配的最大內存)的上限,即使不設置也會有默認的大小。例如,32 位操作系統中的 4GB 內存限制等,并且這樣設計導致了部分的方法在不同類型的 Java 虛擬機下的表現也不同,比如 String::intern() 方法。所以在 JDK 1.7 時 HotSpot 虛擬機已經把原本放在永久代的字符串常量池和靜態變量等移出了方法區,并且在 JDK 1.8 中完全廢棄了永久代的概念。

JDK 1.8 之后,HotSpot 虛擬機開始使用元空間(Meta Space)來實現方法區了。?

3、線程共享

方法區是線程共享的。

4、GC

《Java 虛擬機規范》中規定方法區可以沒有 GC(垃圾回收),但 HotSpot 中對此區域實現了 GC 操作。

5、OOM

方法區是存在 OOM 情況的,比如在 JDK 1.8 中,如果元空間設置空間過小,而類信息產生的過多就會產生 OOM,如下示例所示:

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

/**
* 方法區 OOM 演示(JDK 1.8+)
* 設置 -XX:MaxMetaspaceSize=10m 元空間最大內存為 10MB。
*/
public class MethodAreaOOMExample {
public static void main(String[] args) {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MethodAreaOOMExample.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object object, Method method,
Object[] args,
MethodProxy methodProxy) throws Throwable {
return methodProxy.invokeSuper(object, args);
}
});
enhancer.create();
}
}
}

以上程序的執行結果如下圖所示:

以上代碼是通過 CGLIB 不斷的產生動態代理類將方法區填滿,從而就導致 OOM 的問題。

PS:在使用 CGLIB 之前,需要現在當前項目中導入 CGLIB 才可以正常使用。

6、常用參數設置

永久代(HotSpot 虛擬機,JDK 1.7 之前設置有效):

  • -XX:PermSize=100m:設置永久代初始值為 100MB。
  • -XX:MaxPermSize=100m:設置永久代最大值為 100MB。

元空間(HotSpot 虛擬機,JDK 1.8 之后設置有效):

  • -XX:MetaspaceSize=100m:設置元空間初始大小為 100MB。
  • -XX:MaxMetaspaceSize=100m:設置元空間最大容量為 100MB,默認不設置,則沒有限制。
  • -XX:CompressedClassSpaceSize=100m:設置 Class Metaspace 的大小為 100MB,默認值為 1G。

直接內存(HotSpot 虛擬機,JDK 1.8 之后設置有效):

-XX:MaxDirectMemorySize=100m:指定直接內存的最大容量為 100MB。

總結

《Java虛擬機規范》中將 JVM 運行時數據區域劃分為以下 5 部分:

  1. 程序計數器(Program Counter Register);
  2. Java 虛擬機棧(Java Virtual Machine Stacks);
  3. 本地方法棧(Native Method Stack);
  4. Java 堆(Java Heap);
  5. 方法區(Methed Area)。

其中線程私有的區域是:程序計數器、Java 虛擬機棧、本地方法棧;而線程共享的是:Java 堆和方法區。

而除了程序計數器,其他區域都是可以會出現 OOM 的。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-02-06 07:01:51

2023-02-02 07:06:10

2022-06-07 12:03:33

Java內存模型

2023-02-09 08:48:47

Java虛擬機

2023-06-07 08:08:43

JVM內存模型

2021-07-28 10:08:19

類加載代碼塊面試

2023-09-12 14:56:13

MyBatis緩存機制

2022-06-29 11:01:05

MySQL事務隔離級別

2022-09-27 21:14:54

Spring事務傳播機制

2022-06-06 15:33:20

線程Java釋放鎖

2023-02-18 13:34:14

Nacos健康檢查機制

2023-11-01 07:25:54

Kafka消息傳遞系統

2023-03-06 08:27:33

Redis數據類型

2025-03-10 07:05:07

2018-02-24 12:54:51

Java虛擬機面試

2021-05-17 07:11:50

虛擬機面試內存

2020-07-28 08:59:22

JavahreadLocal面試

2022-02-16 14:20:46

HashTableHashMap線程安全

2024-02-21 16:42:00

2022-09-05 07:06:59

BeanSpring
點贊
收藏

51CTO技術棧公眾號

日韩欧美精品一区| 亚洲xxx在线| 欧美r级电影| 精品欧美一区二区三区精品久久| 美女扒开大腿让男人桶| 亚洲 欧美 精品| 麻豆极品一区二区三区| 欧美激情免费视频| 谁有免费的黄色网址| 2019中文亚洲字幕| 精品久久久久久中文字幕| 亚洲午夜精品一区二区| 日韩中文字幕影院| 麻豆中文一区二区| 久久久亚洲网站| 日韩一区二区三区四区视频| 国语一区二区三区| 欧美视频中文字幕| 成人免费观看cn| 三区四区电影在线观看| 成人国产精品免费观看视频| 国产精品电影久久久久电影网| 欧美性猛交xxxxx少妇| 亚洲va久久| 欧美成人激情免费网| 亚州精品一二三区| 免费在线一级片| 亚洲黄页在线观看| 日韩亚洲欧美成人一区| 精品久久久久久中文字幕2017| 日韩免费影院| 17c精品麻豆一区二区免费| 久久久久久国产精品mv| www.中文字幕| 精品一区中文字幕| 国产xxx69麻豆国语对白| 国产亚洲精品久久777777| 久久婷婷蜜乳一本欲蜜臀| 亚洲美女视频网| 特大黑人巨人吊xxxx| www.豆豆成人网.com| 91精品国产色综合久久| 超碰在线播放91| 四虎4545www国产精品| 欧美日韩国产精品| 日本一道在线观看| 老司机在线视频二区| 日本一区二区三级电影在线观看 | 亚洲日本在线观看视频| 午夜免费久久看| 一卡二卡三卡视频| 久久一卡二卡| 亚洲电影一区二区三区| 国产成人永久免费视频| 青草视频在线免费直播| 亚洲激情第一区| 日韩免费在线观看av| 国产美女一区视频| 香蕉加勒比综合久久| 国产中文字幕二区| 人成在线免费网站| 日韩欧美在线观看| 国产性生交xxxxx免费| 姬川优奈av一区二区在线电影| 色婷婷综合久久久中文一区二区| 久久久久久久久久久久久久国产| 日韩av福利| 日本久久电影网| 日本人视频jizz页码69| 日韩国产大片| 日韩欧美国产1| av网页在线观看| 国产va免费精品观看精品视频| 亚洲天天在线日亚洲洲精| 一级特黄曰皮片视频| 偷拍欧美精品| 久久久免费观看视频| 日本特级黄色片| 免费高清不卡av| 5566中文字幕一区二区| 免费看av毛片| 久久久精品蜜桃| 一区二区三区视频在线播放| 国产一线二线在线观看| 色综合 综合色| 日韩高清第一页| 成人爽a毛片免费啪啪红桃视频| 亚洲精品电影网站| 女人黄色一级片| 欧美激情亚洲| 国产激情视频一区| 久久精品人人| 日韩电影网站| 欧美性猛交xxxx免费看| 毛葺葺老太做受视频| 久久伊人国产| 亚洲精品一区二区三区四区高清 | 国产精品成人网站| 美女日韩在线中文字幕| 成人www视频在线观看| 男人天堂一区二区| 国产精品免费免费| 岛国大片在线播放| 精品久久在线| 日韩hd视频在线观看| 四虎永久免费地址| 在线视频亚洲| 亚洲综合中文字幕68页| 免费在线国产| 亚洲自拍偷拍九九九| 美女黄色片视频| 精品精品精品| 操91在线视频| 国产精品sm调教免费专区| 处破女av一区二区| 青少年xxxxx性开放hg| 在线视频cao| 精品999久久久| 亚洲波多野结衣| 日本午夜精品视频在线观看 | 国产亚洲第一伦理第一区| 欧美xxxx做受欧美| 亚洲熟妇av乱码在线观看| 91在线观看免费视频| 波多野结衣av一区二区全免费观看| 国产成人a视频高清在线观看| 精品国产免费视频| 欧美成欧美va| 国产美女一区二区三区| 先锋影音欧美| 欧美色999| 日韩精品欧美国产精品忘忧草 | 黄页视频在线播放| 欧美性感一类影片在线播放| 亚洲欧美色图视频| 黄色成人91| 亚洲sss综合天堂久久| 最新电影电视剧在线观看免费观看| 欧美午夜片在线免费观看| 亚洲熟女一区二区| 亚洲精品1234| 国产日韩欧美亚洲一区| 麻豆av在线播放| 日韩精品一区在线| 欧美日韩免费做爰视频| 国产毛片一区二区| 亚洲免费视频播放| 96视频在线观看欧美| 日韩中文字幕精品| 一级黄色大片免费观看| 国产精品视频一二| 一本色道久久亚洲综合精品蜜桃| 国产一区二区三区四区五区传媒| 热久久这里只有精品| 你懂的在线视频| 91福利精品第一导航| 人妻av无码一区二区三区 | 可以看污的网站| 久久在线视频免费观看| 国产美女久久精品香蕉69| 在线播放麻豆| 日韩午夜电影在线观看| 久久高清免费视频| 91麻豆精品在线观看| 茄子视频成人免费观看| 精品美女久久| 国产在线不卡精品| 在线你懂的视频| 亚洲丁香婷深爱综合| 久久久国产高清| 国产调教视频一区| 天天综合网久久| 欧美区日韩区| 久久艳妇乳肉豪妇荡乳av| 小黄鸭精品aⅴ导航网站入口| 中文字幕亚洲欧美| 精品久久久无码中文字幕| 亚洲成av人片观看| 日本成人免费视频| 国产伦精品一区二区三区免费| 久久综合久久久久| 久久不见久久见免费视频7| 国产精品亚洲欧美导航| 色屁屁www国产馆在线观看| 日韩av在线直播| 91亚洲精品国偷拍自产在线观看| 一区二区三区在线视频播放| 欧美 变态 另类 人妖| 美美哒免费高清在线观看视频一区二区| 久久视频免费在线| 日韩av黄色在线| 国产日韩欧美黄色| а√天堂中文资源在线bt| 综合av色偷偷网| 特黄视频在线观看| 欧美日韩精品久久久| 国产在线视频二区| 中文字幕第一区第二区| 91插插插影院| 亚洲国产免费| 成年人黄色在线观看| 久久99国产精品久久99大师| 成人免费视频a| 亚洲天堂资源| 欧美激情网友自拍| aaa在线免费观看| 精品亚洲va在线va天堂资源站| 亚洲性在线观看| 日韩欧美一区二区在线| 欧美人与禽zozzo禽性配| 国产校园另类小说区| 亚洲少妇一区二区三区| 久久国产免费看| www黄色在线| 亚洲毛片播放| www.国产在线播放| 亚洲h色精品| 亚洲草草视频| 在线观看欧美理论a影院| 国产精品久久国产精品| 日韩精品第二页| 国产成人综合精品在线| 阿v视频在线观看| 欧美成人在线网站| 黄网站免费在线观看| 一区二区在线免费视频| 深夜福利免费在线观看| 亚洲二区在线播放视频| 99久久久久成人国产免费| 欧美亚洲国产一区二区三区| 国产成人无码一区二区在线播放| 亚洲夂夂婷婷色拍ww47| 在线免费日韩av| 亚洲日韩欧美一区二区在线| 国产精品免费在线视频| 国产人久久人人人人爽| 国产ts在线播放| 91日韩精品一区| 加勒比精品视频| 99精品欧美一区二区三区综合在线| 农村末发育av片一区二区 | 91黄色免费观看| 国产成人无码av| 一本色道久久综合精品竹菊| 国产香蕉视频在线| 亚洲国产日韩精品| 日本在线免费观看| 精品久久久久国产| av资源免费观看| 色综合久久中文字幕| 日本免费在线观看视频| 日韩欧美在线免费观看| 中文字幕亚洲乱码熟女1区2区| 日本高清不卡视频| 少妇久久久久久久| 欧美日韩一二三| 国产模特av私拍大尺度| 欧美一区二区三区的| www.四虎在线观看| 亚洲第一区中文99精品| 无码精品人妻一区二区三区影院 | 午夜视频在线| 久久精品国产亚洲精品2020| а√天堂官网中文在线| 久久91亚洲精品中文字幕奶水| www555久久| 国产69久久精品成人看| 在线看欧美视频| 成人国产精品日本在线| 日韩一级淫片| 久久国产精品-国产精品| 国产影视精品一区二区三区| 亚洲成人18| 欧美人成在线| 中国丰满人妻videoshd| 青青草97国产精品免费观看 | 97在线视频一区| 韩国成人在线| 粉嫩av一区二区三区免费观看| 欧美人妖视频| 亚洲欧洲日韩精品| 欧美91大片| 春日野结衣av| 精品亚洲国内自在自线福利| 无码人妻精品一区二区三| 久久久噜噜噜久噜久久综合| 午夜激情视频在线播放| 亚洲一区二区三区中文字幕| 黄色av一级片| 日韩一级片网址| 国家队第一季免费高清在线观看| 日韩视频免费在线| 色戒汤唯在线观看| 国产一区红桃视频| 日韩欧美影院| 可以免费看的黄色网址| 亚洲免费一区二区| www激情五月| 欧美激情一区二区三区四区| 国产午夜久久久| 欧美日韩久久久久久| 视频一区二区免费| www高清在线视频日韩欧美| 久久久男人天堂| 成人免费福利视频| 蜜桃精品wwwmitaows| 久青草视频在线播放| 美女视频一区二区| 国产精品毛片一区二区| 亚洲国产毛片aaaaa无费看| 一区二区视频免费| 国产婷婷97碰碰久久人人蜜臀| 四虎影院观看视频在线观看| 国产欧美日韩高清| 中文字幕伦av一区二区邻居| 人妻互换免费中文字幕| 蜜桃在线一区二区三区| 亚洲AV无码国产成人久久| 97人人精品| 亚洲一区二区三区免费观看| 亚洲精品1234| 久久久久亚洲av无码麻豆| 久久久九九九九| 欧美精品二区三区| 欧美变态tickling挠脚心| 日本免费在线观看| 国产成人精品日本亚洲| 国产福利一区二区精品秒拍| 一区二区在线观看网站| 日日欢夜夜爽一区| 美国黄色一级毛片| 亚洲h动漫在线| 亚洲欧美黄色片| 欧美人成在线视频| 亚洲伦理网站| 一区二区三区四区| 狠狠色综合色综合网络| 在线观看亚洲大片短视频| 色老汉一区二区三区| 神马亚洲视频| 欧美一级电影久久| 欧美电影免费网站| 免费在线a视频| 99re这里只有精品首页| 日本熟妇乱子伦xxxx| 久久综合亚洲色hezyo国产| 在线免费不卡视频| 第一区免费在线观看| 久久久亚洲综合| 久久青青草原亚洲av无码麻豆| 精品国产一区二区在线观看| 色呦呦在线观看视频| 99影视tv| 在线欧美福利| www.555国产精品免费| 亚洲一区二区三区精品在线| 亚洲成人第一区| 久久免费少妇高潮久久精品99| 国产精品玖玖玖在线资源| 欧美日韩dvd| 成人久久久精品乱码一区二区三区| 精品一区二区三区四| 亚洲黄色片网站| 成人短视频app| 日韩欧美手机在线| 免费成人在线观看| 天天鲁一鲁摸一摸爽一爽| 日韩女优毛片在线| 男人久久天堂| 日韩高清国产一区在线观看| 免费人成网站在线观看欧美高清| 日韩av网站在线播放| 日韩欧美黄色影院| a级片在线免费观看| 欧美一区二区三区在线播放| 美女精品自拍一二三四| www.5588.com毛片| 精品久久久三级丝袜| 中文日产幕无线码一区二区| 天天综合狠狠精品| 国产成人免费网站| 日本一级黄色大片| 在线观看日韩欧美| 日韩成人在线看| 热久久精品国产| 亚洲精品一卡二卡| 亚洲 欧美 自拍偷拍| 国产美女91呻吟求| 在线 亚洲欧美在线综合一区| 91视频免费观看网站| 8v天堂国产在线一区二区| 91高清视频在线观看| 亚洲巨乳在线观看| 成人性视频免费网站| 最近免费中文字幕大全免费版视频| 久久精品电影一区二区| 天海翼亚洲一区二区三区| 在线看免费毛片| 日韩欧美999| 在线观看wwwxxxx|