日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JVM学习(八):虚拟机栈(字节码程度深入剖析)

發(fā)布時間:2024/1/18 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM学习(八):虚拟机栈(字节码程度深入剖析) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

一、概述?

1.1 基于棧結(jié)構(gòu)的虛擬機?

1.2 棧和堆

二、虛擬機棧(Java Virtual Machine Stack)詳述

2.1 虛擬機棧介紹?

2.2 虛擬機棧作用

2.3 虛擬機棧特點?

三、棧中常見的異常?

3.1?StackOverflowError異常

3.2?OutOfMemoryError異常

四、棧的運行原理

4.1 棧的存儲單位?

4.2 棧的運行原理?

五、棧幀的內(nèi)部結(jié)構(gòu)?

六、局部變量表(Local Variable Table)

6.1?局部變量表?

6.1.1 介紹?

6.1.2 實戰(zhàn)

6.2 變量槽slot?

6.2.1?slot的介紹?

6.2.2?slot的測試?

6.2.3?slot的重復利用

6.2.4?類變量和局部變量的區(qū)別?

七、操作數(shù)棧(Operand Stack)

7.1 介紹?

7.2 原理?

7.3 字節(jié)碼層面逐步分析

7.4 對方法返回值的處理

7.5 字節(jié)碼中對int類型的理解

7.6 棧頂緩存技術(shù)(TOS,Top-of-Stack Cashing)

八、動態(tài)鏈接(Dynamic Linking,指向運行時常量池的方法引用)?

8.1 介紹?

8.2 演示?

8.3 常量池的作用

九、方法的調(diào)用

9.1 早期綁定與晚期綁定?

9.2 虛方法和非虛方法

9.2.1 概念?

9.2.2 字節(jié)碼指令介紹

9.2.3 普通調(diào)用指令演示

9.2.4 invokedynamic指令介紹

9.2.5 invokedynamic指令演示?

9.3 方法重寫的本質(zhì)

9.4 虛方法表

9.4.1 虛方法表介紹?

9.4.2 虛方法表示例?

十、方法返回地址(Return Address)

10.1? 方法返回地址介紹

10.2 方法的退出

10.2.1 正常完成出口?

10.2.2 異常完成出口

10.2.3 方法退出的本質(zhì)

十一、一些附加信息?

十二、棧相關(guān)的面試題?


一、概述?

1.1 基于棧結(jié)構(gòu)的虛擬機?

????????由于跨平臺性的設(shè)計,Java的指令都是根據(jù)棧來設(shè)計的。不同平臺CPU架構(gòu)不同,所以不能設(shè)計為基于寄存器的。

? ? ? ? 基于棧設(shè)計的優(yōu)點是跨平臺,指令集小,編譯器容易實現(xiàn);缺點是性能下降,實現(xiàn)同樣的功能需要更多的指令。?

?1.2 棧和堆

????????有不少Java開發(fā)人員一提到Java內(nèi)存結(jié)構(gòu),就會非常粗粒度地將JVM中的內(nèi)存區(qū)理解為僅存Java堆(heap) 和 Java棧(stack),這是不正確的。

????????棧是運行時的單位,而堆是存儲的單位。

????????即:棧解決程序的運行問題,即程序如何執(zhí)行,或者說如何處理數(shù)據(jù)。堆解決的是數(shù)據(jù)存儲的問題,即數(shù)據(jù)怎么放、放在哪兒。

二、虛擬機棧(Java Virtual Machine Stack)詳述

2.1 虛擬機棧介紹?

????????Java虛擬機棧(Java virtual Machine stack)早期也叫Java棧。每個線程在創(chuàng)建時都會創(chuàng)建一個虛擬機棧,其內(nèi)部保存一個個的棧幀( Stack Frame) ,對應(yīng)著一次次的Java方法調(diào)用。

? ? ??JVM直接對Java棧的操作只有兩個:

  • 每個方法執(zhí)行,伴隨著入棧
  • 結(jié)束后出棧
  • ??

    ? ? ? ? 一個棧幀對應(yīng)著一個方法。?

    2.2 虛擬機棧作用

    ????????主管Java程序的運行,它保存方法的局部變量、部分結(jié)果,并參與方法的調(diào)用和返回。

    2.3 虛擬機棧特點?

    • 線程私有
    • 生命周期和線程一致
    • 棧是一種快速有效的分配存儲方式,訪問速度僅次于程序計數(shù)器
    • 對于棧來說存在OOM問題,不存在垃圾回收問題

    三、棧中常見的異常?

    ????????Java虛擬機規(guī)范允許Java棧的大小是動態(tài)的或者是固定不變的。

    3.1?StackOverflowError異常

    ????????如果采用固定大小的Java虛擬機棧,那每一個線程的Java虛擬機棧容量可以在線程創(chuàng)建的時候獨立選定。如果線程請求分配的棧容量超過Java虛擬機棧允許的最大容量,Java虛擬機將會拋出一個StackOverflowError異常。我們可以使用參數(shù)-Xss選項來設(shè)置線程的最大棧空間,棧的大小直接決定了函數(shù)調(diào)用的最大可達深度。

    ? ? ? ? 最常見的就是遞歸調(diào)用了:

    public class StackErrorTest {public static void main(String[] args) {main(args);} }

    ? ? ? ? 我們設(shè)置一個遞增的變量,看看能調(diào)用多少次:

    public class StackErrorTest {private static int count = 1;public static void main(String[] args) {System.out.println(count);count++;main(args);}}

    ? ? ? ? 設(shè)置一下 -Xss 參數(shù):

    3.2?OutOfMemoryError異常

    ????????如果Java虛擬機棧可以動態(tài)擴展,并且在嘗試擴展的時候無法中請到足夠的內(nèi)存,或者在創(chuàng)建新的線程時沒有足夠的內(nèi)存去創(chuàng)建對應(yīng)的虛擬機棧,那Java虛擬機將會拋出一個OutOfMemoryError異常。?

    四、棧的運行原理

    4.1 棧的存儲單位?

    ????????每個線程都有自己的棧,棧中的數(shù)據(jù)都是以棧幀(Stack Frame)的格式存在。在這個線程上正在執(zhí)行的每個方法都各自對應(yīng)一個棧幀(Stack Frame),棧幀是一個內(nèi)存區(qū)塊,是一個數(shù)據(jù)集,維系著方法執(zhí)行過程中的各種數(shù)據(jù)信息。

    4.2 棧的運行原理?

    ????????JVM直接對Java棧的操作只有兩個,就是對棧幀的壓棧和出棧,遵循先進后出原則。

    ????????在一條活動線程中,一個時間點上,只會有一個活動的棧幀。即只有當前正在執(zhí)行的方法的棧幀(棧頂棧幀)是有效的,這個棧幀被稱為當前棧幀( current Frame),與當前棧幀相對應(yīng)的方法就是當前方法(Current Method),定義這個方法的類就是當前類(Current Class)。

    ??

    ????????執(zhí)行引擎運行的所有字節(jié)碼指令只針對當前棧幀進行操作。

    ????????如果在該方法中調(diào)用了其他方法,對應(yīng)的新的棧幀會被創(chuàng)建出來,放在棧的頂端,成為新的當前幀。

    ????????不同線程中所包含的棧幀是不允許存在相互引用的,即不可能在一個棧幀之中引用另外一個線程的棧幀。

    ????????如果當前方法調(diào)用了其他方法,方法返回之際,當前棧幀會傳回此方法的執(zhí)行結(jié)果給前一個棧幀,接著,虛擬機會丟棄當前棧幀,使得前一個棧幀重新成為當前棧幀。

    ????????Java方法有兩種返回函數(shù)的方式,一種是正常的函數(shù)返回,使用return指令;另外一種是拋出異常。不管使用哪種方式,都會導致棧幀被彈出。

    五、棧幀的內(nèi)部結(jié)構(gòu)?

    ????????每個棧幀中存儲著:

    • 局部變量表(Local variables)
    • 操作數(shù)棧(operand stack) (或表達式棧)
    • 動態(tài)鏈接(Dynamic Linking)(或指向運行時常量池的方法引用)
    • 方法返回地址(Return Address)(或方法正常退出或者異常退出的定義)
    • 一些附加信息

    ?

    六、局部變量表(Local Variable Table)

    6.1?局部變量表?

    6.1.1 介紹?

    ????????局部變量表也被稱之為局部變量數(shù)組或本地變量表,定義為一個數(shù)字數(shù)組,主要用于存儲方法參數(shù)和定義在方法體內(nèi)的局部變量,這些數(shù)據(jù)類型包括各類基本數(shù)據(jù)類型、對象引用(reference),以及returnAddress類型。

    ????????由于局部變量表是建立在線程的棧上,是線程的私有數(shù)據(jù),因此不存在數(shù)據(jù)安全問題

    ????????局部變量表所需的容量大小是在編譯期確定下來的,并保存在方法的Code屬性的maximum local variables數(shù)據(jù)項中。在方法運行期間是不會改變局部變量表的大小的。?

    ????????方法嵌套調(diào)用的次數(shù)由棧的大小決定。一般來說,棧越大,方法嵌套調(diào)用次數(shù)越多。對一個函數(shù)而言,它的參數(shù)和局部變量越多,使得局部變量表膨脹,它的棧幀就越大,以滿足方法調(diào)用所需傳遞的信息增大的需求。進而函數(shù)調(diào)用就會占用更多的棧空間,導致其嵌套調(diào)用次數(shù)就會減少。

    ????????局部變量表中的變量只在當前方法調(diào)用中有效。在方法執(zhí)行時,虛擬機通過使用局部變量表完成參數(shù)值到參數(shù)變量列表的傳遞過程。當方法調(diào)用結(jié)束后,隨著方法棧幀的銷毀,局部變量表也會隨之銷毀。

    ????????在棧幀中,與性能調(diào)優(yōu)關(guān)系最為密切的部分就是局部變量表。在方法執(zhí)行時,康擬機使用局部變量表完成方法的傳遞。局部變量表中的變量也是重要的垃圾回收根節(jié)點,只要被局部變量表中直接或間接引用的對象都不會被回收。?

    6.1.2 實戰(zhàn)

    ? ? ? ? 咱們利用?jclasslib Bytecode Viewer 插件來看看局部變量表長什么樣。先編寫一段代碼:

    public class StackTest {public static void main(String[] args) {StackTest test = new StackTest();test.methodA();}public void methodA() {int i = 10;int j = 20;methodB();}public void methodB(){int k = 30;int m = 40;} }

    ? ? ? ? ?可以看到main方法中有兩個變量:args和test,按照他們聲明的先后順序,依次占據(jù)表中的序號(index)0和1;起始PC(start PC)是變量在字節(jié)碼指令中開始的行號;長度(length)是在字節(jié)碼指令中占據(jù)的長度。

    6.2 變量槽slot?

    6.2.1?slot的介紹?

    ? ? ? ? 局部變量表最基本的存儲單元是slot(變量槽),參數(shù)值的存放總是在局部變量數(shù)組的index0開始,到數(shù)組長度-1的索引結(jié)束

    ????????局部變量表中存放編譯期可知的各種基本數(shù)據(jù)類型(8種),引用類型(reference),returnAddress類型的變量

    ????????在局部變量表里,32位以內(nèi)的類型只占用一個slot (包括returnAddress類型),64位的類型(long和double)占用兩個slot。byte , short , char在存儲前被轉(zhuǎn)換為int;boolean也被轉(zhuǎn)換為int,0 表示false ,非0表示true;long和double 則占據(jù)兩個slot。

    ????????JVM會為局部變量表中的每一個slot都分配一個訪問索引,通過這個索引即可成功訪問到局部變量表中指定的局部變量值。當一個實例方法被調(diào)用的時候,它的方法參數(shù)和方法體內(nèi)部定義的局部變量將會按照順序被復制到局部變量表中的每一個slot上。如果需要訪問局部變量表中一個64bit的局部變量(比如:訪問long或double類型變量)值時,只需要使用前一個索引即可。

    ????????如果當前幀是由構(gòu)造方法或者實例方法創(chuàng)建的,那么該對象引用this將會存放在index為0的slot處,其余的參數(shù)按照參數(shù)表順序繼續(xù)排列。

    6.2.2?slot的測試?

    ? ? ? ? 下面我們把前面的介紹一一測試。

    public class LocalVariablesTest {private int count = 0;public static void main(String[] args) {LocalVariablesTest test = new LocalVariablesTest();int num = 10;test.test1();}/*** 用于解釋為什么靜態(tài)方法不能用this調(diào)用*/public static void testStatic(){LocalVariablesTest test = new LocalVariablesTest();Date date = new Date();int count = 10;System.out.println(count);//因為this變量不存在于當前方法的局部變量表中!! // System.out.println(this.count);}public LocalVariablesTest(){this.count = 1;}/*** 用于展示this變量存放在index為0的位置*/public void test1() {Date date = new Date();String name1 = "atguigu.com";test2(date, name1);System.out.println(date + name1);}/*** 用于展示double類型變量占兩個slot* @param dateP* @param name2* @return*/public String test2(Date dateP, String name2) {dateP = null;name2 = "songhongkang";double weight = 130.5;//占據(jù)兩個slotchar gender = '男';return dateP + name2;}/*** 用于展示全局變量*/public void test3() {this.count++;} }

    ? ? ? ? ?test1的局部變量表:

    ? ? ? ? ?test2的局部變量表:

    ????????test3的局部變量表:

    6.2.3?slot的重復利用

    • 介紹?

    ????????棧幀中的局部變量表中的槽位是可以重用的。如果一個局部變量過了其作用域,那么在其作用域之后申明的新的局部變量就很有可能會復用過期局部變量的槽位,從而達到節(jié)省資源的目的

    • 演示

    ? ? ? ? 我們看下面的代碼,代碼里有三個變量,再加上不是靜態(tài)方法,還有this變量,應(yīng)該一共是4個變量。但是我們看看局部變量表:?

    public void test4() {int a = 0;{int b = 0;b = a + 1;}//變量c使用之前已經(jīng)銷毀的變量b占據(jù)的slot的位置int c = a + 1;}

    ? ? ? ? ?發(fā)現(xiàn)只有三個序號。從起始位置可以看出,c占了b的位置。這說明,b一出大括號就離開了自己的作用域,被銷毀了,新定義的c重復利用的b之前的位置。

    6.2.4?類變量和局部變量的區(qū)別?

    ? ? ? ? ?參考我的文章:面試常問:Java中實例變量和局部變量的區(qū)別

    七、操作數(shù)棧(Operand Stack)

    7.1 介紹?

    ????????每一個獨立的棧幀中除了包含局部變量表以外,還包含一個后進先出的操作數(shù)棧(Operand Stack),也可以稱之為表達式棧(Ezpression Stack) 。

    ? ? ? ? 我們都知道,棧可以用數(shù)組或鏈表實現(xiàn)。操作數(shù)棧是用數(shù)組實現(xiàn)的。 但是操作數(shù)棧并非采用訪問索引的方式來進行數(shù)據(jù)訪問的(因為是棧),而是只能通過標準的入棧(push)和出棧(pop)操作來完成一次數(shù)據(jù)訪問。

    ????????棧中的任何一個元素都是可以任意的Java數(shù)據(jù)類型。32bit的類型占用一個棧單位深度,64bit的類型占用兩個棧單位深度。? ? ? ?

    7.2 原理?

    ????????操作數(shù)棧主要用于保存計算過程的中間結(jié)果,同時作為計算過程中變量臨時的存儲空間。?

    ????????操作數(shù)棧在方法執(zhí)行過程中,根據(jù)字節(jié)碼指令往棧中寫入數(shù)據(jù)或從棧中提取數(shù)據(jù),即入棧(push)/出棧(pop)。一些字節(jié)碼指令將值壓入操作數(shù)棧;其余的字節(jié)碼指令將操作數(shù)取出棧,使用它們后再把結(jié)果壓入棧(比如:執(zhí)行復制、交換、求和等操作)。例如:

    ?

    ????????操作數(shù)棧就是JVM執(zhí)行引擎的一個工作區(qū),當一個方法剛開始執(zhí)行的時候,一個新的棧幀也會隨之被創(chuàng)建出來,這個方法的操作數(shù)棧是空的。每一個操作數(shù)棧都會擁有一個明確的棧深度用于存儲數(shù)值,其所需的最大深度(數(shù)組長度)在編譯期就定義好了,保存在方法的code屬性中,為max_stack的值。

    ????????如果被調(diào)用的方法帶有返回值的話,其返回值將會被壓入當前棧幀的操作數(shù)棧中,并更新PC寄存器(程序計數(shù)器)中下一條需要執(zhí)行的字節(jié)碼指令。

    ????????操作數(shù)棧中元素的數(shù)據(jù)類型必須與字節(jié)碼指令的序列嚴格匹配,這由編譯器在編譯器期間進行驗證,同時在類加載過程中的類檢驗階段的數(shù)據(jù)流分析階段要再次驗證。

    ????????另外,我們說Java虛擬機的解釋引擎是基于棧的執(zhí)行引擎,其中的棧指的就是操作數(shù)棧。

    7.3 字節(jié)碼層面逐步分析

    ? ? ? ? 首先編寫一段簡單的代碼,然后來分析每一行字節(jié)碼中,程序計數(shù)器、局部變量表、操作數(shù)棧都做了什么。?

    public class OperandStackTest {public void testAddOperation() {//byte、short、char、boolean:都以int型來保存byte i = 15;int j = 8;int k = i + j;} }

    ? ? ? ? 可以使用反編譯命令查看字節(jié)碼 javap -v xxx.java,也可以直接使用jclasslib工具或插件查看字節(jié)碼:

    ??

    ? ? ? ? 首先看第一行,0 bipush 15。程序計數(shù)器中保存指令地址0,局部變量表中開辟三個變量的內(nèi)存空間;bipush中,bi表示將byte類型轉(zhuǎn)換為int類型,push表示操作數(shù)棧中將15入棧。

    ?

    ? ? ? ? 再看第二行,2 istore_1。程序計數(shù)器保存指令地址2;istore_1中,i表示棧頂是int類型,store表示要操作數(shù)棧彈出15,保存到局部變量表中,1表示保存到索引1位置(因為索引0位置保存的是this)。

    ?

    ? ? ? ? 3 bipush 8。程序計數(shù)器中保存指令地址3,操作數(shù)棧中將8入棧。

    ?

    ? ? ? ? 5 istore_2。程序計數(shù)器保存指令地址5,操作數(shù)棧彈出8,保存到局部變量表的索引2位置;

    ?

    ? ? ? ? ?6 iload_1 和 7 iload_2。表示將局部變量表中索引1位置和索引2位置的取出,壓入操作數(shù)棧中。

    ?

    ?

    ? ? ? ? iadd。操作數(shù)棧中彈出8和15,由執(zhí)行引擎將字節(jié)碼翻譯為機器指令,交由CPU完成加法運算,運算結(jié)果壓入操作數(shù)棧中?

    ?

    ????????istore_3?。操作數(shù)棧彈出23,保存到局部變量表中索引為3的位置

    ??

    ? ? ? ? ?return。方法沒有返回值,return結(jié)束。

    7.4 對方法返回值的處理

    ? ? ? ? 前面的介紹中提到:如果被調(diào)用的方法帶有返回值的話,其返回值將會被壓入當前棧幀的操作數(shù)棧中,我們一起來驗證一下:

    ? ? ? ? 在下面這段代碼中,getSum方法是有返回值的。?

    public class OperandStackTest {public int getSum(){int m = 10;int n = 20;int k = m + n;return k;}public void testGetSum(){//獲取上一個棧楨返回的結(jié)果,并保存在操作數(shù)棧中int i = getSum();int j = 10;} }

    ? ? ? ? 先看getSum()的字節(jié)碼。主要是注意最后的ireturn,說明返回類型是一個int類型,將其保存在操作數(shù)棧中。

    ?

    ? ? ? ? 再看看testGetSum()的字節(jié)碼。?一上來就做了aload_0的操作,load就是從操作數(shù)棧中加載數(shù)據(jù)。

    ?

    7.5 字節(jié)碼中對int類型的理解

    ????????需要注意的一個點是,虛擬機會將int類型變量理解為不同的類型:

    ? ? ? ? 例如這里有一段代碼:

    public class OperandStackTest {public void testAddOperation() {int m = 8;} }

    ? ? ? ? bipush表示先將8理解為是一個byte類型,再轉(zhuǎn)換為int類型

    ?

    ? ? ? ? 如果是800:?

    public class OperandStackTest {public void testAddOperation() {int m = 800;} }

    ? ? ? ? ?字節(jié)碼為sipush,說明理解為一個short類型,再轉(zhuǎn)換為int類型。

    ??

    ? ? ? ? 跟直接定義為short產(chǎn)生的字節(jié)碼是一樣的:

    public class OperandStackTest {public void testAddOperation() {short m = 800;} }

    7.6 棧頂緩存技術(shù)(TOS,Top-of-Stack Cashing)

    ????????我們知道,基于棧式架構(gòu)的虛擬機所使用的零地址指令比基于寄存器架構(gòu)的更加緊湊,但完成一項操作的時候必然需要使用更多的入棧和出棧指令,這同時也就意味著將需要更多的指令分派(instruction dispatch)次數(shù)和內(nèi)存讀/寫次數(shù)。

    ????????由于操作數(shù)是存儲在內(nèi)存中的,因此頻繁地執(zhí)行內(nèi)存讀/寫操作必然會影響執(zhí)行速度。為了解決這個問題,HotSpot JVM的設(shè)計者們提出了棧頂緩存(Tos,Top-of-stack Cashing)技術(shù),將棧頂元素全部緩存在物理CPU的寄存器中,以此降低對內(nèi)存的讀/寫次數(shù),提升執(zhí)行引擎的執(zhí)行效率。?

    八、動態(tài)鏈接(Dynamic Linking,指向運行時常量池的方法引用)?

    8.1 介紹?

    ????????每一個棧幀內(nèi)部都包含一個指向運行時常量池中該棧幀所屬方法的引用。包含這個引用的目的就是為了支持當前方法的代碼能夠?qū)崿F(xiàn)動態(tài)鏈接( Dynamic Linking)。比如: invokedynamic指令。

    ????????在Java源文件被編譯到字節(jié)碼文件中時,所有的變量和方法引用都作為符號引用(Symbolic Reference)保存在class文件的常量池里。比如:描述一個方法調(diào)用了另外的其他方法時,就是通過常量池中指向方法的符號引用來表示的,那么動態(tài)鏈接的作用就是將這些符號引用轉(zhuǎn)換為調(diào)用方法的直接引用。?

    ? ? ? ? 動態(tài)鏈接 也叫做 指向運行時常量池的方法引用。下圖中藍色的部分即是棧幀,橙色部分就是動態(tài)鏈接。

    8.2 演示?

    ? ? ? ? 看看運行時常量池。首先準備一段Java代碼:

    public class DynamicLinkingTest {int num = 10;public void methodA(){System.out.println("methodA()....");}public void methodB(){System.out.println("methodB()....");methodA();num++;} }

    ? ? ? ? ?使用命令 javap -v .\DynamicLinkingTest.class 反編譯DynamicLinkingTest.class文件,找到常量池。左邊為符號引用,右邊為真實引用。

    ? ? ? ? 動態(tài)鏈接其實就是把類加載的時候需要使用到的一些信息作為符號加載出來,在方法中具體要引用誰,再在使用的時候指明

    8.3 常量池的作用

    ????????常量池的作用就是提供一些符號和常量,便于指令的識別。

    九、方法的調(diào)用

    9.1 早期綁定與晚期綁定?

    ????????在JVM中,將符號引用轉(zhuǎn)換為調(diào)用方法的直接引用與方法的綁定機制相關(guān)。

    • 靜態(tài)鏈接:當一個字節(jié)碼文件被裝載進JVM內(nèi)部時,如果被調(diào)用的目標方法在編譯期可知,且運行期保持不變時。這種情況下將調(diào)用方法的符號引用轉(zhuǎn)換為直接引用的過程稱之為靜態(tài)鏈接。
    • 動態(tài)鏈接:如果被調(diào)用的方法在編譯期無法被確定下來,也就是說,只能夠在程序運行期將調(diào)用方法的符號引用轉(zhuǎn)換為直接引用,由于這種引用轉(zhuǎn)換過程具備動態(tài)性,因此也就被稱之為動態(tài)鏈接。

    ????????對應(yīng)的方法的綁定機制為:早期綁定(Early Binding)和晚期綁定(Late Binding)。綁定是一個字段、方法或者類在符號引用被替換為直接引用的過程,這僅僅發(fā)生一次。

    • 早期綁定:早期綁定就是指被調(diào)用的目標方法如果在編譯期可知,且運行期保持不變時即可將這個方法與所屬的類型進行綁定,這樣一來,由于明確了被調(diào)用的目標方法究竟是哪一個,也就可以使用靜態(tài)鏈接的方式將符號引用轉(zhuǎn)換為直接引用。
    • 晚期綁定:如果被調(diào)用的方法在編譯期無法被確定下來,只能夠在程序運行期根據(jù)實際的類型綁定相關(guān)的方法,這種綁定方式也就被稱之為晚期綁定。

    ? ? ? ? 下面的例子就可以解釋早期綁定和晚期綁定

    class Animal{public void eat(){System.out.println("動物進食");} } interface Huntable{void hunt(); } class Dog extends Animal implements Huntable{@Overridepublic void eat() {System.out.println("狗吃骨頭");}@Overridepublic void hunt() {System.out.println("捕食耗子,多管閑事");} }class Cat extends Animal implements Huntable{public Cat(){super();//表現(xiàn)為:早期綁定}public Cat(String name){this();//表現(xiàn)為:早期綁定}@Overridepublic void eat() {super.eat();//表現(xiàn)為:早期綁定System.out.println("貓吃魚");}@Overridepublic void hunt() {System.out.println("捕食耗子,天經(jīng)地義");} } public class AnimalTest {//只有知道傳入的animal是什么,才能知道結(jié)果是什么public void showAnimal(Animal animal){animal.eat();//表現(xiàn)為:晚期綁定}public void showHunt(Huntable h){h.hunt();//表現(xiàn)為:晚期綁定} }

    ????????隨著高級語言的橫空出世,像Java一樣的基于面向?qū)ο蟮木幊陶Z言越來越多,盡管這類編程語言在語法風格上存在一定的差別,但是它們彼此之間始終保持著一個共性:那就是都支持封裝、繼承和多態(tài)等面向?qū)ο筇匦浴?strong>既然這一類的編程語言具備多態(tài)特性,那么自然也就具備早期綁定和晚期綁定兩種綁定方式。

    ????????Java中任何一個普通的方法其實都具備虛函數(shù)的特征,它們相當于C++語言中的虛函數(shù)(C++中則需要使用關(guān)鍵字virtual來顯式定義)。如果在Java程序中不希望某個方法擁有虛函數(shù)的特征時,則可以使用關(guān)鍵字final來標記這個方法。

    9.2 虛方法和非虛方法

    9.2.1 概念?

    ????????非虛方法:如果方法在編譯期就確定了具體的調(diào)用版本,這個版本在運行時是不可變的,這樣的方法稱為非虛方法。靜態(tài)方法、私有方法、final方法、實例構(gòu)造器、父類方法都是非虛方法。

    ????????其他方法稱為虛方法。

    ????????虛擬機中提供了以下幾條方法調(diào)用指令:

    9.2.2 字節(jié)碼指令介紹

    • 普通調(diào)用指令:
  • invokestatic:調(diào)用靜態(tài)方法,解析階段確定唯一方法版本
  • invokespecial:調(diào)用<init>方法、私有及父類方法,解析階段確定唯一方法版本
  • invokevirtual:調(diào)用所有虛方法
  • invokeinterface:調(diào)用接口方法
    • 動態(tài)調(diào)用指令:
  • invokedynamic:動態(tài)解析出需要調(diào)用的方法,然后執(zhí)行
  • ????????前四條指令固化在虛擬機內(nèi)部,方法的調(diào)用執(zhí)行不可人為千預,而invokedynamic指令則支持由用戶確定方法版本。其中invokestatic指令和invokespecial指令(藍色字體)調(diào)用的方法稱為非虛方法,其余的( final修飾的除外)稱為虛方法。

    9.2.3 普通調(diào)用指令演示

    class Father {public Father() {System.out.println("father的構(gòu)造器");}public static void showStatic(String str) {System.out.println("father " + str);}public final void showFinal() {System.out.println("father show final");}public void showCommon() {System.out.println("father 普通方法");} }public class Son extends Father {public Son() {//invokespecialsuper();}public Son(int age) {//invokespecialthis();}//不是重寫的父類的靜態(tài)方法,因為靜態(tài)方法不能被重寫!public static void showStatic(String str) {System.out.println("son " + str);}private void showPrivate(String str) {System.out.println("son private" + str);}public void show() {//invokestaticshowStatic("atguigu.com");//invokestaticsuper.showStatic("good!");//invokespecialshowPrivate("hello!");//invokespecialsuper.showCommon();//invokevirtual 因為此方法聲明有final,不能被子類重寫,所以也認為此方法是非虛方法。showFinal();//虛方法如下://invokevirtualshowCommon();info();MethodInterface in = null;//invokeinterfacein.methodA();}public void info(){}public void display(Father f){f.showCommon();}public static void main(String[] args) {Son so = new Son();so.show();} }interface MethodInterface{void methodA(); }

    ? ? ? ? 運行結(jié)果:

    father的構(gòu)造器 son atguigu.com father good! son privatehello! father 普通方法 father show final father 普通方法 Exception in thread "main" java.lang.NullPointerExceptionat com.atguigu.java2.Son.show(Son.java:64)at com.atguigu.java2.Son.main(Son.java:77)

    ? ? ? ? 字節(jié)碼:

    9.2.4 invokedynamic指令介紹

    ????????JVM字節(jié)碼指令集一直比較穩(wěn)定,一直到Java7中才增加了一個 invokedynamic指令,這是Java為了實現(xiàn) “動態(tài)類型語言” 支持而做的一種改進。

    ????????但是在Java7中并沒有提供直接生成invokedynamic指令的方法,需要借助ASM這種底層字節(jié)碼工具來產(chǎn)生invokedynamic指令。直到Java8 Lambda表達式的出現(xiàn),invokedynamic才在Java中才有了直接的生成方式。

    ????????Java7中增加的動態(tài)語言類型支持的本質(zhì)是對Java虛擬機規(guī)范的修改,而不是對Java語言規(guī)則的修改,這一塊相對來講比較復雜,增加了虛擬機中的方法調(diào)用,最直接的受益者就是運行在Java平臺的動態(tài)語言的編譯器。

    ? ? ? ? 什么是動態(tài)類型語言??

    ????????動態(tài)類型語言和靜態(tài)類型語言兩者的區(qū)別就在于對類型的檢查是在編譯期還是在運行期,滿足前者就是靜態(tài)類型語言,反之是動態(tài)類型語言。

    ????????說的再直白一點就是,靜態(tài)類型語言是判斷變量自身的類型信息;動態(tài)類型語言是判斷變量值的類型信息,變量沒有類型信息,變量值才有類型信息,這是動態(tài)語言的一個重要特征。?

    ? ? ? ? Java本質(zhì)上還是靜態(tài)類型語言,雖然他在一定程度上支持動態(tài)類型。

    9.2.5 invokedynamic指令演示?

    ? ? ? ? 在Java8中使用lambda表達式,JVM就會使用invokedynamic指令。

    @FunctionalInterface interface Func {public boolean func(String str); }public class Lambda {public void lambda(Func func) {return;}public static void main(String[] args) {Lambda lambda = new Lambda();Func func = s -> {return true;};lambda.lambda(func);lambda.lambda(s -> {return true;});} }

    ?

    ?9.3 方法重寫的本質(zhì)

    ? ? ? ? Java語言中方法重寫的原理:

  • 找到操作數(shù)棧頂?shù)牡谝粋€元素所執(zhí)行的對象的實際類型,記作c
  • 如果在類型c中找到與常量中的描述符合簡單名稱都相符的方法,則進行訪問權(quán)限校驗,如果通過則返回這個方法的直接引用,查找過程結(jié)束;如果不通過,則返回java.lang.IllegalAccessError異常
  • 如果沒有找到相符的方法,按照繼承關(guān)系從下往上依次對c的各個父類進行第⒉步的搜索和驗證過程
  • 如果始終沒有找到合適的方法,說明繼承的是接口,則拋出 java.lang.AbstractMethodError 異常
  • ? ? ? ? IllegalAccessError介紹:

    ????????程序試圖訪問或修改一個屬性或調(diào)用一個方法,而這個屬性或方法沒有權(quán)限訪問,一般會引起編譯器異常。這個錯誤如果發(fā)生在運行時,就說明一個類發(fā)生了不兼容的改變。

    9.4 虛方法表

    9.4.1 虛方法表介紹?

    ????????在面向?qū)ο蟮木幊讨?#xff0c;會很頻繁的使用到動態(tài)分派,如果在每次動態(tài)分派的過程中都要重新在類的方法元數(shù)據(jù)中搜索合適的目標的話就可能影響到執(zhí)行效率。因此,為了提高性能,JVM在類的方法區(qū)建立一個虛方法表(virtual method table)(非虛方法不會出現(xiàn)在表中),使用索引表來代替查找。

    ????????每個類中都有一個虛方法表,表中存放著各個方法的實際入口。

    ????????那么虛方法表什么時候被創(chuàng)建?虛方法表會在類加載的鏈接階段被創(chuàng)建并開始初始化,類的變量初始值準備完成之后,JVM會把該類的方法表也初始化完畢。對類加載的各個階段的介紹在我的這篇文章中:JVM學習(六):類加載子系統(tǒng)_玉面大蛟龍的博客-CSDN博客

    9.4.2 虛方法表示例?

    ? ? ? ? 我們來具體看看虛方法表起什么作用。如圖,Son類繼承Father類,Father類繼承自O(shè)bject類。Son中的虛方法(藍色背景的方法)由于虛方法表的存在,會直接指向祖先類,而非虛方法仍指向本身。?

    十、方法返回地址(Return Address)

    10.1? 方法返回地址介紹

    ? ? ? ? 方法返回地址 存放調(diào)用該方法的PC寄存器的值。

    ????????一個方法的結(jié)束,有兩種方式:

    • 正常執(zhí)行完成
    • 出現(xiàn)未處理的異常,非正常退出

    ????????無論通過哪種方式退出,在方法退出后都返回到該方法被調(diào)用的位置。方法正常退出時,調(diào)用者的pc計數(shù)器的值作為返回地址,即調(diào)用該方法的指令的下一條指令的地址。而通過異常退出的,返回地址是要通過異常表來確定,棧幀中一般不會保存這部分信息。 因此方法返回地址主要針對的是正常執(zhí)行完成的方法。

    10.2 方法的退出

    ????????當一個方法開始執(zhí)行后,只有兩種方式可以退出這個方法:

    10.2.1 正常完成出口?

    ????????執(zhí)行引擎遇到任意一個方法返回的字節(jié)碼指令(return),會有返回值傳遞給上層的方法調(diào)用者,簡稱正常完成出口

    ????????一個方法在正常調(diào)用完成之后究竟需要使用哪一個返回指令還需要根據(jù)方法返回值的實際數(shù)據(jù)類型而定。在字節(jié)碼指令中,返回指令包含ireturn(當返回值是boolean、byte、char.short和int類型時使用)、lreturn、 freturn、dreturn以及areturn,另外還有一個return指令供聲明為void的方法、實例初始化方法、類和接口的初始化方法使用。

    ? ? ? ? 我們來看看這些返回指令:

    public class ReturnAddressTest {//ireturnpublic boolean methodBoolean() {return false;}//ireturnpublic byte methodByte() {return 0;}//ireturnpublic short methodShort() {return 0;}//ireturnpublic char methodChar() {return 'a';}//ireturnpublic int methodInt() {return 0;}//lreturnpublic long methodLong() {return 0L;}//freturnpublic float methodFloat() {return 0.0f;}//dreturnpublic double methodDouble() {return 0.0;}//areturnpublic String methodString() {return null;}//areturnpublic Date methodDate() {return null;}//returnpublic void methodVoid() {}//returnstatic {int i = 10;} }

    ? ? ? ? 圖就不全截了,放一張意思意思。?

    ?

    10.2.2 異常完成出口

    ????????在方法執(zhí)行的過程中遇到了異常(Exception),并且這個異常沒有在方法內(nèi)進行處理,也就是只要在本方法的異常表中沒有搜索到匹配的異常處理器,就會導致方法退出。簡稱異常完成出口

    ????????方法執(zhí)行過程中拋出異常時的異常處理,存儲在一個異常處理表中,方便在發(fā)生異常的時候找到處理異常的代碼。

    ? ? ? ? 下面我們來看看異常表長什么樣,先加一段可能出現(xiàn)異常的代碼:

    public void method2() {try {method1();} catch (IOException e) {e.printStackTrace();}}public void method1() throws IOException {FileReader fis = new FileReader("atguigu.txt");char[] cBuffer = new char[1024];int len;while ((len = fis.read(cBuffer)) != -1) {String str = new String(cBuffer, 0, len);System.out.println(str);}fis.close();}

    ? ? ? ? ?反編譯查看:?

    ??

    ? ? ? ? ?也可以使用jclasslib工具查看異常處理表:

    10.2.3 方法退出的本質(zhì)

    ????????本質(zhì)上,方法的退出就是當前棧幀出棧的過程。此時,需要恢復上層方法的局部變量表、操作數(shù)棧、將返回值壓入調(diào)用者棧幀的操作數(shù)棧、設(shè)置PC寄存器值等,讓調(diào)用者方法繼續(xù)執(zhí)行下去。正常完成出口和異常完成出口的區(qū)別在于:通過異常完成出口退出的不會給他的上層調(diào)用者產(chǎn)生任何的返回值

    十一、一些附加信息?

    ????????棧幀中還允許攜帶與Java虛擬機實現(xiàn)相關(guān)的一些附加信息。例如,對程序調(diào)試提供支持的信息。?

    ? ? ? ? 這個不一定都有,在一些介紹棧幀的資料當中甚至省略了這部分。

    十二、棧相關(guān)的面試題?

    • 舉例棧溢出的情況? (StackOverflowError)

    ? ? ? ? 遞歸調(diào)用死循環(huán)

    • 調(diào)整棧大小,就能保證不出現(xiàn)溢出嗎?

    ????????不能。遞歸調(diào)用死循環(huán)給多大內(nèi)存都沒用。

    • 分配的棧內(nèi)存越大越好嗎?

    ? ? ? ? 不是。會擠占其他內(nèi)存結(jié)構(gòu)的空間。

    • 垃圾回收是否會涉及到虛擬機棧?

    ? ? ? ? 不會。棧有OOM問題,但不會發(fā)生GC

    • 方法中定義的局部變量是否線程安全?

    ????????具體問題具體分析。咱們使用線程不安全的StringBuilder類來討論這個問題:

    public class StringBuilderTest {int num = 10;//s1的聲明方式是線程安全的,因為只有一個線程會操作s1public static void method1(){StringBuilder s1 = new StringBuilder();s1.append("a");s1.append("b");//...}//sBuilder的操作過程:是線程不安全的,因為有可能會有多個線程同時調(diào)用method2public static void method2(StringBuilder sBuilder){sBuilder.append("a");sBuilder.append("b");//...}//s1的操作:是線程不安全的,因為s1被返回出去之后,可能會有好幾個線程同時來操作它public static StringBuilder method3(){StringBuilder s1 = new StringBuilder();s1.append("a");s1.append("b");return s1;}//s1的操作:是線程安全的,因為toString方法的底層是再new一個String,String是不可變的public static String method4(){StringBuilder s1 = new StringBuilder();s1.append("a");s1.append("b");return s1.toString();}public static void main(String[] args) {StringBuilder s = new StringBuilder();new Thread(() -> {s.append("a");s.append("b");}).start();method2(s);}}

    總結(jié)

    以上是生活随笔為你收集整理的JVM学习(八):虚拟机栈(字节码程度深入剖析)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    国产婷婷视频在线 | 在线看片视频 | 久久国产精品免费看 | av在线免费在线 | 992tv人人网tv亚洲精品 | 在线观看av黄色 | 中文字幕资源网在线观看 | 中文字幕在线资源 | 中文资源在线播放 | 玖玖视频网 | 一级做a爱片性色毛片www | 天堂资源在线观看视频 | 在线免费观看涩涩 | 亚洲一区二区精品视频 | 天天综合网 天天 | 欧美成人91 | av888.com | 国产精品美女久久久久久久久 | 精品国产1区2区 | 久草在线费播放视频 | 中文字幕在线观看网站 | 美女露久久 | 国产裸体视频网站 | 国产中文字幕国产 | 黄色a三级 | www.天天成人国产电影 | 久久电影色 | 久久久www成人免费毛片麻豆 | 一级大片在线观看 | 免费手机黄色网址 | 美女国产精品 | 成人91免费视频 | 婷婷精品国产一区二区三区日韩 | 五月开心激情网 | 狠狠狠狠狠狠操 | 人人澡人摸人人添学生av | 久草精品在线播放 | 狠狠干免费 | 91精品久久久久久久99蜜桃 | 婷色| 97香蕉超级碰碰久久免费软件 | 日本特黄一级片 | 国产va精品免费观看 | 国产一区二区在线精品 | 97福利社 | 午夜视频在线观看一区二区三区 | 久久激情五月婷婷 | 麻豆国产精品视频 | 亚洲第一成网站 | 久久久亚洲影院 | 粉嫩aⅴ一区二区三区 | 亚洲精品国偷拍自产在线观看 | 亚洲va天堂va欧美ⅴa在线 | 日韩精品一区二区三区电影 | 久久精品国产久精国产 | 综合在线观看 | 91在线观看高清 | 久久成人精品视频 | 午夜久久福利视频 | www.黄色片网站 | 成人国产电影在线观看 | 国产一级片毛片 | 婷婷福利影院 | 九九久久久久久久久激情 | 国产美女精品在线 | 亚洲午夜精品久久久久久久久久久久 | 国产精品久久久久婷婷二区次 | 国产婷婷精品av在线 | 久久久精品欧美 | 天堂av官网| 视频一区二区在线 | 久久不卡国产精品一区二区 | 久久精品视频一 | 黄网站www | 国产福利91精品一区二区三区 | 操操操天天操 | 青草草在线 | 天堂素人在线 | 99久久影院 | 中文字幕久久久精品 | 在线观看视频一区二区三区 | 99这里只有 | 日韩有码在线观看视频 | 国产精品欧美日韩在线观看 | 色网站在线看 | 国产精品嫩草影视久久久 | 麻豆国产精品va在线观看不卡 | 91超碰免费在线 | 亚洲午夜不卡 | 黄色小说网站在线 | 四虎影视精品成人 | 精品福利视频在线观看 | 夜夜躁狠狠躁日日躁视频黑人 | 一区二区三区福利 | 国产99免费| 日韩av一区二区在线 | 这里有精品在线视频 | 国产淫片 | 欧美一区日韩精品 | 欧美日韩一区二区三区不卡 | 久久久久久久影视 | 狠狠干婷婷色 | 日本深夜福利视频 | 香蕉精品视频在线观看 | 在线观看韩日电影免费 | 伊人伊成久久人综合网小说 | 亚洲美女视频在线观看 | 在线观看播放av | 国产精品第一页在线观看 | 最近中文字幕免费 | 97视频入口免费观看 | 在线激情电影 | 国产网红在线观看 | 国产午夜三级一区二区三桃花影视 | 亚洲精品视频二区 | 特级a老妇做爰全过程 | 色午夜影院 | 久久99国产精品久久 | 91免费在线视频 | 一区二区三区在线免费观看 | 五月天国产| 黄色片视频免费 | 亚洲欧美在线视频免费 | 高清日韩一区二区 | 欧美性黄网官网 | 免费视频久久久久久久 | 国产丝袜制服在线 | 国产在线观看地址 | 黄色大片入口 | 欧美99精品| 国产精品久久久久久久久久久久午 | 韩国三级一区 | 国产手机在线播放 | 在线视频a | 奇米网444| 久久视频网址 | 狠狠色综合欧美激情 | 成人av资源网 | av 一区二区三区四区 | 狠狠干综合 | 日韩欧美在线高清 | 国产福利91精品一区二区三区 | 人人插人人舔 | 亚洲成年片 | 五月婷婷网站 | 日韩欧美综合在线视频 | 精品欧美一区二区在线观看 | 中文在线最新版天堂 | 欧美黑人xxxx猛性大交 | 国产在线视频一区二区三区 | 精品免费观看 | 免费观看成年人视频 | 日韩精品一区二区三区水蜜桃 | 国产高清成人在线 | 有码中文在线 | 一区二区视频欧美 | 亚洲视频 中文字幕 | 日韩有码中文字幕在线 | 99精品国产福利在线观看免费 | 97在线视频网站 | 欧美一区二区三区在线观看 | 日本久久久精品视频 | 国产精品热 | 亚洲影院国产 | 国产日韩一区在线 | 亚洲开心激情 | 国产高清福利在线 | 狠狠五月婷婷 | 欧美日韩高清 | 久久国产精品色婷婷 | 国产精品美女久久久久久久 | 久久久久9999亚洲精品 | 亚洲激情在线观看 | 欧美专区日韩专区 | 国产一区二区三区免费在线 | 五月天网页 | 国产一区免费在线观看 | 欧美日韩xxxxx | 亚洲桃花综合 | 日韩精品欧美专区 | 在线观看黄av | 天天天在线综合网 | 色综合天天综合在线视频 | 激情婷婷丁香 | 婷五月天激情 | www.成人sex| 亚洲天堂网视频在线观看 | 欧美精彩视频在线观看 | 国产在线v | 2022国产精品视频 | 嫩嫩影院理论片 | www.com黄色 | 日韩色高清 | 丁香花在线视频观看免费 | 99 国产精品 | www.色五月.com| 成人黄性视频 | 久久综合综合久久综合 | 精品一区二区三区在线播放 | 成人黄色视 | 婷婷六月丁| 91高清完整版在线观看 | 欧美日韩在线视频观看 | 国产精品久久久久久久久婷婷 | 久久久久久欧美二区电影网 | 亚洲综合欧美精品电影 | 国产一区二区高清不卡 | 国产特级毛片aaaaaa毛片 | 天天做日日做天天爽视频免费 | 521色香蕉网站在线观看 | 四虎在线免费 | 亚洲一区二区三区精品在线观看 | 香蕉在线观看 | av综合在线观看 | 国产成人精品免费在线观看 | 精品欧美一区二区在线观看 | 国产亚洲欧美在线视频 | 免费韩国av| 午夜av免费观看 | 日韩免费在线观看视频 | 精品在线观看免费 | 少妇bbw撒尿 | 中文字幕久久久精品 | 国产视频亚洲视频 | 伊人狠狠色丁香婷婷综合 | www.一区二区三区 | 日本在线观看视频一区 | 亚洲综合在线一区二区三区 | 91成人免费在线视频 | 中国精品少妇 | 欧美大jb| 国产亚洲成人精品 | 国产精品久久久久影院 | 久久夜视频 | 精品国产伦一区二区三区观看体验 | 久操免费视频 | 免费成人在线视频网站 | 97在线视频免费播放 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 国产999免费视频 | 激情五月激情综合网 | 国产精品一区二区久久精品爱微奶 | 在线高清av | 国产在线一线 | 久久天堂亚洲 | 免费三级av | 欧美aaa一级| 国产伦理久久精品久久久久_ | 在线观看欧美成人 | 日韩黄色免费 | 国产精品美女视频网站 | 亚洲 欧洲 国产 精品 | 国产中文字幕在线播放 | 狠狠干.com | 国产精品国产三级国产aⅴ无密码 | 国产在线色视频 | 亚洲三级在线 | 国产一级片视频 | 国产精品24小时在线观看 | 国产精品久久久久久久久久妇女 | 久久国产精品视频观看 | 91热视频 | 成人久久 | 久久精品毛片基地 | 国产成人精品久久久 | 99热这里有精品 | av先锋影音少妇 | 婷婷六月综合亚洲 | 免费看片亚洲 | 96久久欧美麻豆网站 | 黄色在线网站噜噜噜 | 久久久视频在线 | 色视频在线观看 | 日日干干夜夜 | 又黄又爽又色无遮挡免费 | 超碰人人草人人 | 免费在线观看视频一区 | 欧美精品久久久久久久免费 | 亚洲精品男人天堂 | www五月婷婷 | 天天综合成人网 | 久久久国产精品人人片99精片欧美一 | 久久毛片网 | 日韩网站在线播放 | 亚洲综合激情小说 | 欧美一级电影在线观看 | 欧美网站黄色 | 国产小视频免费在线观看 | 国内精品久久久久影院一蜜桃 | 69久久夜色精品国产69 | 91人人爽人人爽人人精88v | 久久久久久久久电影 | 97超碰精品| 欧美日本在线视频 | 免费观看日韩 | 欧美另类调教 | 国产一级大片免费看 | 五月开心激情网 | 国产高清日韩欧美 | 色永久免费视频 | 麻豆传媒在线视频 | 国产女做a爱免费视频 | 成年人在线观看网站 | 99国产精品一区 | 日韩免费三区 | 久久狠狠一本精品综合网 | 日日躁夜夜躁xxxxaaaa | 激情综合站 | 欧美另类调教 | 操高跟美女 | 韩国在线一区二区 | 国产又粗又猛又黄又爽 | 日韩免费电影一区二区三区 | 国产色网站 | 国产精品毛片一区二区 | 91在线看黄| 色婷婷免费视频 | 中文字幕影片免费在线观看 | 久久99精品国产麻豆宅宅 | 六月丁香在线观看 | 97色综合| 黄色av影视| 国产999精品久久久久久 | 日韩午夜在线 | 二区三区在线 | 精品一区二区三区在线播放 | 精品一区中文字幕 | 一区二区三区四区五区六区 | 国产专区视频在线观看 | 日本精品在线 | 中文字幕成人一区 | 麻豆免费视频观看 | 精品99视频 | 精品国产乱码久久 | 狠狠操影视 | 精品毛片久久久久久 | 中文字幕久久精品亚洲乱码 | 日本精品视频免费 | 欧美成人xxx | 亚洲精品ww | 日躁夜躁狠狠躁2001 | 国产亚洲视频在线免费观看 | 亚洲日韩欧美一区二区在线 | 91香蕉久久| 最近日本中文字幕a | 黄av在线 | 久草在线| 免费看成人 | 国产私拍在线 | 精品国产乱码久久久久久1区2匹 | 久久小视频 | 日韩在线播放视频 | 8x成人免费视频 | 精品网站999www | 日本久热 | 国产精品麻豆欧美日韩ww | www视频在线播放 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 久久av免费电影 | 极品久久久久 | 狠狠操狠狠干2017 | 一区精品久久 | 久久久久久久久久久久亚洲 | 色婷婷精品大在线视频 | 久久国产精品99国产精 | 精品久久久999 | 91麻豆免费版 | 91九色蝌蚪视频在线 | 综合五月婷婷 | 99久久电影| 午夜精品久久久久久久99无限制 | 欧美精品一区二区性色 | 久久综合狠狠综合久久综合88 | 国产精品视屏 | 四虎在线免费观看 | 日韩av在线免费播放 | 中文字幕亚洲综合久久五月天色无吗'' | 国产一级在线播放 | 黄色影院在线观看 | 在线观看亚洲专区 | 国产精品电影一区二区 | 成人三级网站在线观看 | 免费亚洲精品 | 久草资源在线观看 | 91av在线免费看 | 天天草夜夜 | 视频一区二区视频 | 精品一区二区在线免费观看 | 亚洲最新视频在线播放 | 久久精品视频免费播放 | 日本在线观看一区 | 精品久久一区二区三区 | 国内精品视频一区二区三区八戒 | 在线亚洲欧美视频 | 日韩一级电影网站 | 亚洲91中文字幕无线码三区 | 国产最顶级的黄色片在线免费观看 | 国产91影视| 亚洲无吗视频在线 | 久久日韩精品 | 国产日韩欧美视频在线观看 | 91成人小视频 | 一区二区视频网站 | 亚洲欧美色婷婷 | 玖玖色在线观看 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 五月婷婷黄色网 | 日韩一级理论片 | 欧美韩国日本在线观看 | 日韩成人精品一区二区三区 | 免费看短 | 天天草天天干天天 | 91在线精品播放 | 丁香网五月天 | www.色婷婷 | 国产精品久久久久久久婷婷 | 日韩中文字幕视频在线观看 | 亚洲永久av | 国产区网址 | 免费视频在线观看网站 | 日韩在线观看视频在线 | 亚洲精品在线观看中文字幕 | 午夜免费久久看 | 国产美女精品在线 | 在线免费观看羞羞视频 | 久久久久久综合网天天 | 婷婷日 | 久久精品这里热有精品 | 精品影院一区二区久久久 | 一区二区三区在线免费 | 国产欧美精品在线观看 | 超碰在线最新地址 | 国产精品视频观看 | 黄色日本免费 | 国产黄在线免费观看 | 狠狠躁日日躁狂躁夜夜躁 | 国产成人av福利 | 日韩精品视频在线观看网址 | 国产黄色片久久 | 中文字幕乱码在线播放 | 色婷婷九月| 国产我不卡| 日韩高清国产精品 | 一区二区三区四区在线 | 久久久免费精品 | 一区二区三区四区在线 | 日韩电影在线视频 | 日韩中文字幕在线不卡 | 日日爽 | 亚洲视屏| 国产精品18久久久久久久久久久久 | 中文在线免费观看 | 成人av免费电影 | 91av电影| 久保带人| 91九色视频国产 | 色婷婷久久 | 久久综合久久综合九色 | 亚洲精品黄色在线观看 | 黄色三级免费片 | 久久久久久久久久久免费视频 | 一区二区三区手机在线观看 | 9在线观看免费高清完整版 玖玖爱免费视频 | 99九九视频 | 亚洲成色 | 丁香一区二区 | 国产综合福利在线 | 欧美日韩亚洲在线 | 青青草国产精品 | 91探花国产综合在线精品 | 丁香六月国产 | 亚洲精品永久免费视频 | 精品不卡av | 日韩乱码在线 | 国产精品乱码久久久久久1区2区 | 五月天综合婷婷 | 97在线观看免费观看 | 伊人射| 亚洲视频免费在线 | 成人a免费视频 | 99热精品在线 | 91在线porny国产在线看 | 中文字幕a∨在线乱码免费看 | 日韩欧美一区二区三区视频 | 久久精品久久久久久久 | 免费在线激情电影 | 国产女做a爱免费视频 | 精品国产免费久久 | 黄色免费视频在线观看 | 美女网站黄在线观看 | 久久五月情影视 | 国产视频精品视频 | 国产成人一区二 | 在线观看黄色 | 久久艹人人 | 日韩3区 | 成人在线视频一区 | 欧美久久久久久久久中文字幕 | 欧美激情精品久久久久 | 国产精品video爽爽爽爽 | av资源中文字幕 | 国产成人三级在线播放 | 欧美色操| 日日弄天天弄美女bbbb | 亚洲精品午夜视频 | 亚洲国产最新 | 日韩毛片一区 | 亚洲专区欧美 | 成人 国产 在线 | 激情综合国产 | 天天综合天天综合 | 中文字幕高清在线 | 超碰av在线| 国产精品一区二区三区四区在线观看 | 亚洲最大激情中文字幕 | 九九三级毛片 | 久久久99精品免费观看 | 午夜av日韩 | 国产亚洲91 | 中文字幕高清视频 | 久久天堂精品视频 | 五月婷婷中文网 | 日本爱爱免费 | 国产成人精品免费在线观看 | 久草手机视频 | 久久亚洲热| 亚洲人成人在线 | 中文字幕在线观看网站 | 精品理论片 | 国产中文字幕视频在线观看 | 国产在线精品区 | 国产精品乱码久久久久久1区2区 | 久久综合网色—综合色88 | 国产v亚洲v | 久久国产一区二区三区 | 国产精品久久久久久久99 | 日韩精品一区二 | 国产一区二区三区四区大秀 | 国产精品成人国产乱 | 成人av片在线观看 | 草莓视频在线观看免费观看 | 成年在线观看 | 免费观看丰满少妇做爰 | 亚洲国产精品视频在线观看 | 亚洲日本三级 | 亚洲精品网站在线 | 午夜精品999 | 久久国产精品免费一区二区三区 | 97超视频在线观看 | 九九久久国产 | av网站地址 | 国产精品不卡一区 | 亚洲精品自拍视频在线观看 | 婷婷色网址 | 国产视频2 | 欧美a√大片| 天天曰天天射 | 欧美精品乱码久久久久久 | 毛片的网址 | 国产高清av免费在线观看 | 成人久久18免费 | 久久精品国产亚洲aⅴ | 成人一区二区三区在线观看 | 日韩欧美在线一区二区 | 偷拍福利视频一区二区三区 | 日韩视频一 | 久久精品视频网站 | 天天综合天天做 | 国产精品亚洲综合久久 | 国产精品国产三级国产aⅴ无密码 | 一区二区三区四区五区在线 | 天天综合久久综合 | 综合视频在线 | 99久热在线精品视频成人一区 | 色综合天天干 | 日韩免费视频网站 | 黄色免费观看网址 | 97伊人网| 午夜狠狠干 | 精品久久91 | 久章操| 亚洲一级免费电影 | 亚洲精品乱码久久久久v最新版 | 人人射 | 91干干干| 成人在线免费av | 在线免费黄网站 | www.在线观看av | 色综合天天综合在线视频 | 亚洲综合色激情五月 | av一级在线 | 成片免费观看视频999 | 伊人色**天天综合婷婷 | 日韩av一卡二卡三卡 | 成人91av| 亚洲国产精品999 | 亚洲自拍偷拍色图 | 激情婷婷 | 天天爽夜夜爽人人爽一区二区 | 国产免费亚洲高清 | 天天干天天干天天操 | 国产欧美日韩一区 | 一区免费视频 | 国产精品视频资源 | 成人cosplay福利网站 | 国产成人精品亚洲日本在线观看 | 亚洲永久精品国产 | 色久五月| 日日爱网址 | 日日夜夜av| 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 国产一区二区网址 | 亚洲精品在线观看网站 | 91精品老司机久久一区啪 | 美女网站视频久久 | 三级视频片 | 午夜精品久久久久久久99热影院 | 国产一区二区三区在线 | 免费在线黄色av | 色网站中文字幕 | 天天色棕合合合合合合 | 96精品高清视频在线观看软件特色 | 亚洲成人黄色网址 | 亚洲精品9| 91九色自拍| 成人在线免费观看视视频 | 97精品欧美91久久久久久 | 中文字幕免费一区二区 | 婷婷综合激情 | bbb搡bbb爽爽爽 | 99九九99九九九视频精品 | 黄色一级动作片 | 91麻豆精品国产91久久久久 | 高清久久久久久 | 人人狠狠综合久久亚洲 | 国产一区高清在线观看 | 亚洲欧美视频一区二区三区 | 在线看片成人 | 三级在线国产 | 涩涩网站在线播放 | 精品产品国产在线不卡 | 中文字幕有码在线 | 久久免费国产电影 | 精品99久久 | 9幺看片| 操操日| 狠狠操狠狠干天天操 | av中文字幕av | 中文av日韩 | 丁香六月激情 | 亚洲综合国产精品 | 日韩精品欧美精品 | 成人午夜av电影 | 欧美日韩一区二区三区免费视频 | 视频在线观看入口黄最新永久免费国产 | 国产理论一区二区三区 | av在线播放快速免费阴 | 粉嫩av一区二区三区四区在线观看 | 99999精品视频 | 欧美性生活免费 | 免费av影视 | 欧美日韩中文在线观看 | 久久艹久久 | 日韩欧美一区二区三区免费观看 | 一级黄色av| 精品国产一二区 | 国产精品欧美精品 | 国产精品密入口果冻 | 日韩乱码中文字幕 | 91精品91| 日韩xxx视频| 91黄视频在线观看 | 97超碰影视| 中文字幕一区二区三区在线观看 | 6080yy午夜一二三区久久 | 国产成人在线一区 | 狠狠操夜夜操 | 欧美性色19p | 在线观看日本高清mv视频 | 久久精品久久精品久久39 | 热久久视久久精品18亚洲精品 | 日本h在线播放 | 久久不卡日韩美女 | 成人在线观看资源 | 免费热情视频 | 就要干b | 久久久蜜桃一区二区 | 日韩丝袜在线 | 天天爱天天干天天爽 | 中文理论片 | 成人资源网 | av网站播放| 综合精品久久 | www日日 | 欧美日bb | 久久免费视屏 | 久久深夜福利免费观看 | 五月天九九 | 中文字幕在线国产 | 六月丁香色婷婷 | 色视频网站在线 | 韩日精品在线观看 | 日日夜夜91| 96精品在线 | 欧美 亚洲 另类 激情 另类 | 午夜视频在线瓜伦 | 这里只有精品视频在线观看 | 欧洲一区精品 | 免费日韩一区 | 麻豆视频在线观看免费 | 日韩四虎 | 在线播放亚洲 | 99色在线观看 | 国产亚洲字幕 | 人人爱人人添 | 国产精品福利小视频 | 欧美狠狠操 | 中文字幕a∨在线乱码免费看 | 亚洲国产中文字幕 | 狠狠躁夜夜躁人人爽超碰91 | 亚洲午夜精| 精久久久久 | 激情av一区二区 | 99在线视频免费观看 | 看片黄网站| 欧美一区二区三区免费观看 | 欧美综合色在线图区 | 久久久精品在线观看 | 国产午夜精品久久 | 欧美黄在线 | 激情综合网五月婷婷 | 欧美在线资源 | 97综合视频 | 亚州精品国产 | 国产手机视频精品 | 中文字幕免费观看 | 在线观看第一页 | 欧美日在线观看 | 欧美日韩亚洲在线观看 | 久久超| 亚洲成人国产精品 | 中文字幕亚洲精品日韩 | 探花视频免费观看 | 天天舔天天射天天操 | 国产资源站 | 久久综合五月天婷婷伊人 | 欧美精品你懂的 | 免费在线观看国产黄 | 日韩一区二区三区视频在线 | 美女黄频在线观看 | 在线观看黄色大片 | 国产精品短视频 | 午夜婷婷综合 | 国产婷婷vvvv激情久 | 成人小视频在线观看免费 | 中文字幕成人在线 | 国产 日韩 欧美 中文 在线播放 | 亚洲精品高清在线 | 久青草视频在线观看 | 麻豆一精品传二传媒短视频 | 麻豆系列在线观看 | 国产高清视频在线观看 | 国产精品99久久久精品免费观看 | 国产成人精品综合久久久久99 | 日韩中文字幕电影 | 国产日韩精品视频 | 国产中文视频 | 婷婷丁香五 | 日韩欧美视频在线观看免费 | 激情视频综合网 | 国产视频一区二区在线观看 | a级一a一级在线观看 | 超碰在线国产 | 特级西西444www大精品视频免费看 | 国产资源在线视频 | 成年人视频在线观看免费 | 手机在线日韩视频 | 特级a毛片| 国产精品一区二区精品视频免费看 | 成人av观看 | 九九九九九九精品任你躁 | 草莓视频在线观看免费观看 | 国产一区二区三精品久久久无广告 | 在线观看视频色 | 日韩精品一区在线播放 | 久久综合九色99 | av在线直接看 | 免费午夜在线视频 | 精品久久综合 | 久章操| 狠狠躁夜夜躁人人爽超碰91 | 91在线精品秘密一区二区 | 欧美日韩国产在线一区 | 五月婷婷国产 | 97超碰资源总站 | 成人久久18免费网站图片 | 五月婷婷六月综合 | 九九热免费观看 | 黄污网 | 亚洲综合视频在线播放 | 精品久久91 | 天天干天天干天天操 | 婷婷在线不卡 | 免费三级在线 | 久久免费一级片 | 在线观看一区二区精品 | 亚洲精品国偷拍自产在线观看蜜桃 | 九九九免费视频 | 精品国产91亚洲一区二区三区www | 久操操| 激情在线网址 | 8x成人免费视频 | 欧美最猛性xxx| 欧美污在线观看 | 国产麻豆精品传媒av国产下载 | 国产精品午夜久久 | 久久影院精品 | 婷婷激情综合 | 九九在线视频免费观看 | 91亚洲狠狠婷婷综合久久久 | 色婷婷狠狠18 | 91av色 | 欧美日本三级 | 久久精品婷婷 | 五月婷婷久久丁香 | 成人国产一区二区 | 久久黄色影院 | 91成人在线免费观看 | 久久久激情网 | 91精品国产91久久久久福利 | 欧美日韩国产一二 | 黄色在线观看免费 | 国产免费观看久久黄 | 亚洲精品久久久久久中文传媒 | 成年人黄色免费网站 | 国产一区二区不卡在线 | 在线激情网 | 国产高清在线免费观看 | 爱情影院aqdy鲁丝片二区 | 国产一区免费 | 日韩精品一区二区在线观看视频 | 日韩av资源在线观看 | 91福利区一区二区三区 | 91九色porny在线 | 在线最新av | 国产精品免费不 | 涩涩伊人 | 国产视频一区二区在线观看 | 久久久久久久av麻豆果冻 | 五月婷婷六月丁香在线观看 | 亚洲精品自拍视频在线观看 | 91精品国自产拍天天拍 | 99欧美精品 | 中文字幕永久 | 日韩在线观看视频免费 | 91资源在线视频 | 五月天激情在线 | 久久国产美女视频 | 久久影院中文字幕 | 激情网五月婷婷 | 国产精品在线看 | 亚洲精品女人久久久 | 日韩一区二区三区不卡 | 久久久国产视频 | 成人在线视频在线观看 | 国产丝袜网站 | av在线播放国产 | 99精品久久精品一区二区 | 在线观看岛国av | 精品国产资源 | 深爱婷婷久久综合 | 成人午夜剧场在线观看 | 亚洲1区在线 | 91在线操 | 欧美日韩国产区 | 国产成人精品一二三区 | 激情五月伊人 | 手机在线日韩视频 | 九九九九热精品免费视频点播观看 | a黄色片| 福利视频一区二区 | 日本三级吹潮在线 | 婷婷六月中文字幕 | 日韩日韩日韩日韩 | 97超碰在线免费观看 | 婷婷在线看 | 一区二区三区视频网站 | 国产视频一区精品 | 狠狠狠色丁香婷婷综合激情 | 高清中文字幕av | 国产91精品一区二区 | 国产少妇在线观看 | 91成人精品一区在线播放69 | 香蕉视频在线看 | 亚洲国产小视频在线观看 | 99在线高清视频在线播放 | 深爱婷婷网 | 久久99久久精品国产 | 日韩大片在线播放 | 日韩美精品视频 | 香蕉视频网站在线观看 | 奇米影视在线99精品 | 午夜精品一区二区三区四区 | 久久精品久久精品久久 | 天天摸天天干天天操天天射 | 国产免费大片 | 亚洲综合激情网 | 久久亚洲美女 | 狠狠狠色丁香婷婷综合激情 | 日韩一级精品 | 免费高清在线观看成人 | 丁香免费视频 | 天天综合网天天综合色 | 日韩久久久久久久久久 | 韩国av电影网 | 久久91久久久久麻豆精品 | wwwwww黄 | 福利视频精品 | 亚洲精品国产拍在线 | 色网免费观看 | 欧美色图亚洲图片 | 日日夜夜草| 欧美性大战 | 91av电影在线 | 亚洲一区二区视频 | 91视频啊啊啊 | 亚洲成色777777在线观看影院 | 91九色porn在线资源 | 在线观看成人 | 天天做天天爱夜夜爽 | 天堂视频一区 | 亚洲经典视频在线观看 | 日韩影视在线观看 | 国产精品wwwwww | 国产精品九九久久99视频 | 欧美日韩一区二区在线观看 | 免费观看性生交大片3 | 99在线高清视频在线播放 | 黄色官网在线观看 | 一区二区三区四区五区在线 | 久久九精品 | 制服丝袜在线91 | 久久国产精彩视频 | 午夜久久久久久久久久影院 | 日本最新一区二区三区 | 免费观看成人网 | 国产精品一区二区三区四 | 国产精品一区二区白浆 | 国产又粗又猛又黄又爽的视频 | 久久精品一区二区三区国产主播 | 久草网视频 | 色婷婷天天干 | 午夜久久影视 | 91天天操| 国产一区免费在线 | 精品免费久久久久久 | 99热在线免费观看 | 久久手机免费观看 | 99视频在线免费观看 | 激情网站网址 | 久草在线一免费新视频 | 97福利 | 久久国产露脸精品国产 | 国产精品 中文字幕 亚洲 欧美 | 日韩精品国产一区 | 天天摸天天舔 | 免费在线观看亚洲视频 | 成人久久18免费网站图片 | 激情av在线播放 | 国产夫妻性生活自拍 | www.久久免费视频 | 玖玖玖在线 | 欧美xxxxx在线视频 | 久久精品中文字幕一区二区三区 | 国产欧美精品xxxx另类 | 91在线播放综合 | 综合网成人| 伊人久久影视 | 日韩性xxx | 97在线观看视频国产 | 91视频黄色 | 五月亚洲 | 中文字幕av一区二区三区四区 | 久久久久久毛片 | 日日日日日 | 成人av动漫在线 | 五月婷丁香 | 国产又粗又长又硬免费视频 | 91人人爽久久涩噜噜噜 | 激情五月婷婷网 | 中文字幕永久在线 | 在线观看中文字幕av | 国产日韩精品一区二区在线观看播放 | 午夜影视一区 | 香蕉在线视频观看 | 亚洲理论影院 | a级片久久 | 美女国内精品自产拍在线播放 |