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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

后端学习 - JVM(上)内存与垃圾回收

發(fā)布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 后端学习 - JVM(上)内存与垃圾回收 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

JVM 架構(gòu)圖

文章目錄

  • 一 JVM 簡介
  • 二 類加載子系統(tǒng):
    • 1 作用
    • 2 類的三個加載過程
    • 3 類加載器的分類
    • 4 雙親委派機制
    • 5 兩個 class 對象為同一個類的必要條件
  • 三 運行時數(shù)據(jù)區(qū):PC寄存器(Program Counter Register)
  • 四 運行時數(shù)據(jù)區(qū):虛擬機棧
    • 1 概述
    • 2 棧可能出現(xiàn)的異常
    • 3 棧的存儲結(jié)構(gòu)和運行原理
    • 4 棧幀的組成
  • 五 方法的調(diào)用
    • 1 靜態(tài)鏈接與動態(tài)鏈接
    • 2 早期綁定與晚期綁定
    • 3 (非)虛方法
    • 4 JVM 方法調(diào)用的指令
    • 5 虛方法表
  • 六 運行時數(shù)據(jù)區(qū):本地方法棧
  • 七 運行時數(shù)據(jù)區(qū):堆
    • 1 概述
    • 2 堆的內(nèi)存結(jié)構(gòu)
    • 3 YGC / Minor GC
    • 4 Major GC & Full GC
    • 5 內(nèi)存分配策略
    • 6 線程分配緩沖區(qū)(Thread Local Allocation Buffer, TLAB)
    • 7 逃逸分析與優(yōu)化
    • 8 對象的內(nèi)存分配流程
  • 八 運行時數(shù)據(jù)區(qū):方法區(qū)(永久代 / 元空間)
    • 1 概述
    • 2 方法區(qū)與堆棧的交互
    • 3 方法區(qū)的內(nèi)部結(jié)構(gòu)
    • 4 方法區(qū)的發(fā)展:為什么需要元空間
    • 5 方法區(qū)的垃圾回收
  • 九 對象的實例化、內(nèi)存布局、訪問定位
    • 1 對象創(chuàng)建的方法和步驟
    • 2 !!對象的內(nèi)存布局
  • 十 String Table
    • 1 String 的基本特性
    • 2 String 拼接
    • 3 intern()
    • 4 創(chuàng)建了幾個對象?
    • 5 兩道難題*
  • 十一 垃圾回收相關(guān)概念
    • 1 什么是垃圾
    • 2 內(nèi)存溢出
    • 3 內(nèi)存泄漏
    • 4 強引用:存在就不回收
    • 5 軟引用:內(nèi)存不足時回收
    • 6 弱引用:發(fā)現(xiàn)即回收
    • 7 虛引用:形同虛設(shè),回收跟蹤
  • 十二 垃圾回收算法
    • 1 標(biāo)記階段:可達性分析算法
    • 2 finalize
    • 3 判斷對象是否可回收的流程(至少兩次標(biāo)記)
    • 4 清除階段:標(biāo)記-清除算法
    • 5 清除階段:標(biāo)記-復(fù)制算法
    • 6 清除算法:標(biāo)記-壓縮算法
    • 7 三種清除算法的對比
    • 8 分代收集算法
  • 十三 垃圾回收器
    • 1 主要性能指標(biāo)


一 JVM 簡介

  • JVM 本質(zhì)上是二進制字節(jié)碼的運行環(huán)境,是運行在操作系統(tǒng)上的,與硬件沒有直接的交互
  • Java 是跨平臺的語言:一次編寫,到處運行
  • JVM 是跨語言的平臺:JVM 是面向字節(jié)碼文件的,只要符合 JVM 規(guī)范,JVM 不僅可以處理 Java 語言編譯的字節(jié)碼文件,還支持其它語言編譯的字節(jié)碼文件

二 類加載子系統(tǒng):

1 作用

  • 負責(zé)加載文件開頭有特定的標(biāo)識的 class 文件
  • 只負責(zé)文件的加載,而不保證 class 文件可以運行(能否運行由執(zhí)行引擎決定)
  • 加載的類信息存放在方法區(qū),除此之外,方法區(qū)還會存放運行時的常量池信息
  • 在 class file -> JVM -> 元數(shù)據(jù)模板 的過程中作為“快遞員”的角色

2 類的三個加載過程

  • Loading(創(chuàng)建 Class 類型的對象)
    • 通過類的全限定名獲取定義此類的二進制字節(jié)流
    • 將該字節(jié)流代表的靜態(tài)存儲結(jié)構(gòu),轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu)
    • 在內(nèi)存中聲明一個 java.lang.Class 類型的對象,作為方法區(qū)的該類的各種數(shù)據(jù)的訪問入口
  • Linking(類變量分配內(nèi)存空間,賦初始值)
    • 包含 驗證(verify)、準(zhǔn)備(prepare)、解析(resolve) 三個階段
    • 驗證階段:確保 class 文件符合虛擬機要求,保證被加載類的正確性
    • 準(zhǔn)備階段:為 類變量(static 修飾) 申請內(nèi)存空間(不包含 final 修飾的 static 類變量,因為這些變量在編譯時分配了內(nèi)存空間),并賦初始零值(final 修飾的 static 類變量為指定值);此外,該階段不會為 實例變量(通過 this 引用) 初始化,因為實例變量隨著對象分配到堆中,而類變量分配到方法區(qū)中
    • 解析階段
  • Initialization(類變量的賦值,執(zhí)行靜態(tài)代碼塊語句)
    • 該階段的任務(wù)是,執(zhí)行類構(gòu)造器方法 <clinit>() 的過程,該方法是 javac 編譯器(前端編譯器)自動收集 類變量的賦值動作靜態(tài)代碼塊的語句 合并得到的
    • 子類的 <clinit>() 在父類的 <clinit>() 執(zhí)行后才能執(zhí)行
    • <clinit>() 不同于類的構(gòu)造器,在 JVM 視角下,類的構(gòu)造器是 <init>() 方法
    • 虛擬機保證 <clinit>() 在多線程下被同步加鎖,避免同一個類加載多次

    3 類加載器的分類

    • BootStrap ClassLoader(啟動類加載器):使用 C/C++ 實現(xiàn),沒有父類(上級,非繼承意義的父類)加載器,用于加載 Java 核心庫
    • Extension ClassLoader(擴展類加載器):繼承自 ClassLoader 類,父類(上級,非繼承意義的父類)加載器為啟動類加載器
    • AppClassLoader(應(yīng)用類加載器):繼承自 ClassLoader 類,父類(上級,非繼承意義的父類)加載器為擴展類加載器,是程序默認的類加載器
    • 用戶自定義類加載器

    4 雙親委派機制

    • 是 JVM 加載類的 class 文件的機制,避免類的重復(fù)加載,防止核心 API 被篡改
    • 具體地,如果有人想替換系統(tǒng)級別的類:String.java,篡改它的實現(xiàn),在這種機制下這些系統(tǒng)的類已經(jīng)被 Bootstrap classLoader 加載過了(因為當(dāng)一個類需要加載的時候,最先去嘗試加載的就是 BootstrapClassLoader),所以其他類加載器并沒有機會再去加載,從一定程度上防止了危險代碼的植入
    • 具體地,如果一個類加載器收到了類加載請求,它不會直接執(zhí)行類的加載,而是將請求委托到上級的加載器,上級的加載器遞歸執(zhí)行該過程,最終請求到達啟動類加載器
    • 如果上級加載器可以執(zhí)行指定類的加載,則過程結(jié)束;否則向下級傳遞該請求,直到類可以被加載

    5 兩個 class 對象為同一個類的必要條件

    • 全類名一致
    • 加載類的 ClassLoader(指 ClassLoader 實例)相同,即:同一個 class 文件,被同一個 JVM 的不同 ClassLoader 實例加載,不能算作同一個類對象

    三 運行時數(shù)據(jù)區(qū):PC寄存器(Program Counter Register)

    • 用于存儲指向下一條指令的地址(執(zhí)行引擎負責(zé)讀取下一條指令)
    • 線程私有,生命周期和線程保持一致
    • 是 Java 內(nèi)存中唯一一個沒有規(guī)定 OutOfMemoryError 的區(qū)域
    • 使用PC寄存器存儲字節(jié)碼指令地址的作用,為什么要記錄當(dāng)前線程的執(zhí)行地址?
      一個PC寄存器記錄一個線程的字節(jié)碼指令地址,程序運行時,CPU 需要在各個線程間切換,切換到某個線程時需要還原它切換之前的現(xiàn)場,通過PC寄存器確定繼續(xù)執(zhí)行的位置

    四 運行時數(shù)據(jù)區(qū):虛擬機棧

    1 概述

    • 主管 Java 程序的運行,保存方法的局部變量(8種基本數(shù)據(jù)類型+對象的引用地址)、部分結(jié)果,參與方法的調(diào)用和返回
    • 棧是運行時的單位,解決程序運行的問題;堆是存儲的單位,解決數(shù)據(jù)存儲的問題
    • 線程私有,生命周期和線程保持一致

    2 棧可能出現(xiàn)的異常

    • JVM 允許棧的容量為動態(tài)的,或是固定的
    • 棧容量動態(tài)時,如果棧嘗試擴展并無法申請到足夠的內(nèi)存,或是創(chuàng)建新線程時沒有足夠的內(nèi)存創(chuàng)建對應(yīng)的虛擬機棧,拋出 OutOfMemoryError
    • 棧容量固定時,請求的容量超過指定容量時,拋出 StackOverflowError

    3 棧的存儲結(jié)構(gòu)和運行原理

    • 棧的存儲格式是棧幀,棧幀是一個內(nèi)存區(qū)塊,維護著方法執(zhí)行過程中的數(shù)據(jù)信息
    • 棧幀和執(zhí)行的方法是一一對應(yīng)的
    • 在一個活動線程中,同一時刻只有棧頂?shù)臈腔顒拥?#xff08;即:一個線程同一時刻只能執(zhí)行一個方法),執(zhí)行引擎運行的所有字節(jié)碼指令只針對當(dāng)前棧幀進行操作
    • 不同線程中包含的棧幀不允許相互引用,即不能在某個棧幀中引用另外一個線程的棧幀
    • 方法返回時(使用 return 指令 / 拋出未處理的異常),當(dāng)前棧幀會將執(zhí)行結(jié)果傳遞給前一個棧幀,之后丟棄該棧幀,使得其下一個棧幀成為新的棧頂棧幀

    4 棧幀的組成

    組成作用
    局部變量表存儲方法的參數(shù)、定義在方法體內(nèi)的局部變量
    操作數(shù)棧保存計算過程的中間結(jié)果,同時作為計算過程中變量的臨時存儲空間
    動態(tài)鏈接將符號引用轉(zhuǎn)換為調(diào)用方法的直接引用
    方法返回地址存放調(diào)用該方法的PC寄存器的值,即調(diào)用該方法的指令的下一條指令的地址
    附加信息

    4.1 局部變量表

    • 是一個數(shù)字數(shù)組,主要用于存儲方法的參數(shù)、定義在方法體內(nèi)的局部變量
    • 線程私有,所以不存在數(shù)據(jù)安全問題
    • 所需容量大小在編譯時確定,方法運行時不會更改
    • 最基本的存儲單元是 Slot

    有關(guān) Slot

  • 引用類型、byte、short、char…占用1個 Slot;long、double 占用兩個 Slot
  • 如果當(dāng)前方法可以訪問 this.xxx(即:當(dāng)前棧幀由構(gòu)造方法或?qū)嵗椒▌?chuàng)建),則對當(dāng)前對象的引用 this 放在首個 Slot(這解釋了為什么靜態(tài)方法不能訪問 this.xxx,因為局部變量表里沒有 this)
  • Slot 是可重用的,如果某個局部變量超出其作用域,則該 Slot 可以被之后聲明的變量使用
    • 局部變量表中的變量,是重要的垃圾回收根節(jié)點,只要被局部變量表直接或間接引用的對象都不會被回收
    • 成員變量(包括靜態(tài)變量、實例變量)和局部變量的對比
    變量類型初始化過程
    靜態(tài)變量在類加載的 Linking 階段申請內(nèi)存空間并賦初始0值,在 Initialization 階段顯式賦值(靜態(tài)代碼塊賦值)
    實例變量對象創(chuàng)建時,在堆中申請內(nèi)存空間并賦初始0值
    局部變量無初始0值,使用前必須要顯式賦值

    4.2 操作數(shù)棧

    • 主要用于保存計算過程的中間結(jié)果,同時作為計算過程中變量的臨時存儲空間
    • 方法剛開始執(zhí)行時,操作數(shù)棧被創(chuàng)建,在編譯時確定其最大深度:引用類型、byte、short、char…占用1個單位深度;long、double 占用兩個單位深度
    • 不能通過索引訪問數(shù)據(jù),只能通過棧的 push / pop
    • 如果方法具有返回值,則返回值會被壓入當(dāng)前棧幀的操作數(shù)棧中,并更新PC寄存器為下一條需要執(zhí)行的字節(jié)碼指令

    4.3 動態(tài)鏈接

    • Java 源代碼被編譯成字節(jié)碼文件時,所有的變量和方法引用都作為符號引用保存在 class 文件的常量池(屬于方法區(qū))里,動態(tài)鏈接的作用是,將符號引用轉(zhuǎn)換為調(diào)用方法的直接引用
    • 為了實現(xiàn)動態(tài)鏈接,每個棧幀都包含一個指向運行時常量池中的該棧幀所屬方法的引用

    4.4 方法返回地址

    • 方法的結(jié)束有兩種方式:正常退出;出現(xiàn)未處理的異常,非正常退出
    • 正常退出的方法會給調(diào)用者返回值,而非正常退出的方法不會
    • 無論通過哪種方式退出,方法退出后都要返回其被調(diào)用的位置
    • 方法返回地址的作用是,在方法正常退出時,存放調(diào)用該方法的PC寄存器的值,即調(diào)用該方法的指令的下一條指令的地址

    五 方法的調(diào)用

    1 靜態(tài)鏈接與動態(tài)鏈接

    • 此處的 “鏈接” 是將調(diào)用方法的符號引用轉(zhuǎn)換為直接引用的過程,針對的是方法調(diào)用
    • 某種程度上,動態(tài)鏈接對應(yīng)語言的多態(tài)特性
    • 靜態(tài)鏈接:字節(jié)碼文件被裝載到 JVM 內(nèi)部時,被調(diào)用的方法在編譯期間可知,且運行時保持不變。這種情況下,將調(diào)用方法的符號引用轉(zhuǎn)換為直接引用的過程,稱為靜態(tài)鏈接
    • 動態(tài)鏈接:字節(jié)碼文件被裝載到 JVM 內(nèi)部時,被調(diào)用的方法在編譯期間不可知,只有在運行時才能將方法調(diào)用符號引用轉(zhuǎn)換為直接引用,稱為動態(tài)鏈接

    2 早期綁定與晚期綁定

    • “綁定” 指的是字段、方法、類的符號引用轉(zhuǎn)換為直接引用的過程
    • 早期綁定:對應(yīng)靜態(tài)鏈接,在編譯時可以執(zhí)行引用的轉(zhuǎn)換
    • 晚期綁定:對應(yīng)動態(tài)鏈接,只能在運行時執(zhí)行引用的轉(zhuǎn)換

    3 (非)虛方法

    • 非虛方法:在編譯時可以確定具體的調(diào)用版本,且在運行時不變,則該方法為非虛方法
    • 靜態(tài)方法、私有方法、final 方法、構(gòu)造器方法、父類的方法 均為非虛方法,其它方法稱為虛方法
    • 多態(tài)的前提是類的繼承或方法的重寫,所以不涉及到繼承和重寫的方法均為非虛方法

    4 JVM 方法調(diào)用的指令

    指令作用
    invokestatic調(diào)用靜態(tài)方法
    invokespecial調(diào)用<init>方法、私有方法、父類方法
    invokevirtual調(diào)用虛方法(包括 final 修飾的方法)
    invokeinterface調(diào)用接口方法
    invokedynamic動態(tài)解析并執(zhí)行需要調(diào)用的方法
    • invokestatic 調(diào)用的方法, invokespecial 調(diào)用的方法,invokevirtual 調(diào)用的 final 方法,為非虛方法
    • invokedynamic 是 Java8 中 lambda 表達式引入的新指令

    5 虛方法表

    • JVM 在每個類的方法區(qū)建立虛方法表(非虛方法不會在此出現(xiàn)),表中存放的是各個方法的實際入口,以提高動態(tài)鏈接情況下的查找性能
    • 使用舉例:

    六 運行時數(shù)據(jù)區(qū):本地方法棧

    • 本地方法:Java 調(diào)用的非 Java 語言實現(xiàn)的方法
    • 本地方法不是抽象方法,有具體實現(xiàn),但非 Java 語言,所以 native 不能與 abstract 共同使用
    • 虛擬機棧用于管理 Java 方法的調(diào)用,本地方法棧用于管理本地方法的調(diào)用
    • 本地方法棧的容量可以設(shè)置為可變,也可以設(shè)置為固定

    七 運行時數(shù)據(jù)區(qū):堆

    1 概述

    • 一個 JVM 實例只存在一個堆空間,在 JVM 啟動時堆的大小已確定
    • 堆在物理內(nèi)存上可以不連續(xù),但在邏輯上被視為連續(xù)的
    • 除了 TLAB(Thread Local Allocation Buffer)區(qū)域,所有的線程共享堆內(nèi)存
    • 堆是 GC(Garbage Collection) 執(zhí)行垃圾回收的重點區(qū)域。方法結(jié)束后,堆中的對象不會被立刻回收,而是在垃圾回收時被移除
    • 所有的 對象實例數(shù)組,在運行時都在堆上分配,而不是在棧上(虛擬機棧的棧幀保存的是對象實例和數(shù)組的引用)

    2 堆的內(nèi)存結(jié)構(gòu)

    • 新生代(伊甸園區(qū)、幸存者1區(qū)、幸存者2區(qū);默認比例為8:1:1)、老年代
    • 永久代 / 元空間是 Hotspot JVM 對于方法區(qū)的具體實現(xiàn),不屬于堆
    • 幾乎所有對象都是在伊甸園區(qū)被創(chuàng)建的
    • 分代的唯一理由是優(yōu)化 GC 性能

    3 YGC / Minor GC

    • 是新生代的垃圾回收機制
    • 相較于 Major GC、Full GC,執(zhí)行更頻繁,所需時間更短
    • 執(zhí)行流程:
    • 當(dāng)伊甸園區(qū)滿的時候觸發(fā)(幸存者區(qū)滿時不會觸發(fā))
    • 對新生代(包括伊甸園區(qū)和幸存者區(qū))執(zhí)行垃圾回收。對于沒有回收的實例,將伊甸園區(qū)的實例轉(zhuǎn)移到幸存者區(qū),在幸存者區(qū)的實例從 from 區(qū)轉(zhuǎn)移到 to 區(qū)
    • 對于幸存者區(qū)的實例,轉(zhuǎn)移次數(shù)超過設(shè)定值時,實例從幸存者區(qū)轉(zhuǎn)移到老年代,轉(zhuǎn)移到老年代的實例不再參與 Minor GC

    4 Major GC & Full GC

    • Major GC 針對老年代進行垃圾回收,如果進行之后內(nèi)存仍不足,則 OOM
    • Full GC 針對新生代、老年代、永久代進行垃圾回收,所需時間最長,通過調(diào)優(yōu)盡量避免

    5 內(nèi)存分配策略

    • 對象優(yōu)先分配到伊甸園區(qū)
    • 大對象直接分配到老年代
    • 長期存活的對象分配到老年代
    • 動態(tài)對象年齡判斷:幸存者區(qū)中,年齡相同的對象如果占幸存者區(qū)空間的一半以上,則大于等于該年齡的對象直接進入老年代,而不用到達閾值

    6 線程分配緩沖區(qū)(Thread Local Allocation Buffer, TLAB)

    • 在伊甸園區(qū),為每個線程分配一塊線程獨有的內(nèi)存區(qū)域
    • 多線程同時分配內(nèi)存時,使用 TLAB 可以避免一系列線程安全問題,同時提升了內(nèi)存分配吞吐量
    • JVM 將 TLAB 作為內(nèi)存分配的首選,無法在 TLAB 分配時,JVM 嘗試使用加鎖機制保證線程安全,并直接在伊甸園區(qū)分配內(nèi)存
    • 類的實例化過程:

    7 逃逸分析與優(yōu)化

    • 逃逸分析是 減少 Java 程序的同步負載堆分配壓力的 跨函數(shù)全局流分析算法
    • 如果經(jīng)過逃逸分析發(fā)現(xiàn),對象并沒有逃逸出方法的話,該對象可能被優(yōu)化為棧上分配而非堆上分配。這么做的好處是,無需對該對象進行垃圾回收,并減緩了堆的壓力
    • 結(jié)論:能使用局部變量的,就不要在方法外定義
    public class EscapeAnalysis {public EscapeAnalysis obj;/*方法返回EscapeAnalysis對象,發(fā)生逃逸*/public EscapeAnalysis getInstance(){return obj == null? new EscapeAnalysis() : obj;}/*為成員屬性賦值,發(fā)生逃逸*/public void setObj(){this.obj = new EscapeAnalysis();}//思考:如果當(dāng)前的obj引用聲明為static的?仍然會發(fā)生逃逸。/*對象的作用域僅在當(dāng)前方法中有效,沒有發(fā)生逃逸*/public void useEscapeAnalysis(){EscapeAnalysis e = new EscapeAnalysis();}/*引用成員變量的值,發(fā)生逃逸*/public void useEscapeAnalysis1(){EscapeAnalysis e = getInstance();//getInstance().xxx()同樣會發(fā)生逃逸} }
    • 優(yōu)化方法與作用
    優(yōu)化方法作用
    棧上分配如果對象沒有逃逸出方法,可能被優(yōu)化為棧上分配,避免了對其GC,減輕堆的壓力
    同步省略借助逃逸分析,判斷同步的代碼塊使用的鎖對象是否只能被一個線程訪問,如果是則取消代碼塊的同步
    標(biāo)量替換將符合條件的對象“打散”,分配在棧上,避免對象的創(chuàng)建,因此不使用堆的內(nèi)存
    • 標(biāo)量替換的實例
    /*標(biāo)量替換前*/ class Point {private int x;private int y;// 構(gòu)造方法省略... } private static void alloc() {Point p = new Point(1, 2);System.out.println("x" + p.x + "y" + p.y); }/*標(biāo)量替換后*/ private static void alloc() {int x = 1;int y = 2;System.out.println("x" + x + "y" + y); }

    8 對象的內(nèi)存分配流程

  • 對象優(yōu)先分配在 TLAB 上
  • 如果 TLAB 無法容納,則分配在伊甸園區(qū)
  • 伊甸園區(qū)無法容納,執(zhí)行 YGC(虛線部分為 YGC 的一部分流程,“Survivor放得下” 指的是從伊甸園區(qū)轉(zhuǎn)移過來的對象能否被幸存者區(qū)完全容納,非新對象)
  • YGC 后伊甸園仍然無法容納,嘗試分配到老年代
  • 執(zhí)行 FGC 后老年代無法容納則 OOM

  • 八 運行時數(shù)據(jù)區(qū):方法區(qū)(永久代 / 元空間)

    1 概述

    • 方法區(qū)用于存儲已被虛擬機加載的 類型信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼緩存等
    • 類似于堆,在 JVM 啟動時創(chuàng)建,物理內(nèi)存空間可以不連續(xù),容量可以設(shè)置為固定或可變
    • JDK7 之前稱方法區(qū)為永久代,8 及之后稱為元空間。元空間最大的區(qū)別在于使用的是本地內(nèi)存,而非 JVM 設(shè)置的內(nèi)存
    • 永久代 ≠ 方法區(qū),因為永久代僅僅是針對 Hotspot JVM 的概念,而方法區(qū)是 JVM 的概念
    • 方法區(qū)的容量決定了系統(tǒng)可以保存多少個類(類的個數(shù)而非類的實例個數(shù)),如果超出容量則 OOM: PermGen Space(JDK8 及之后為OOM: MetaSpace)

    2 方法區(qū)與堆棧的交互

    • 方法區(qū)和堆是線程共享的,而虛擬機棧、本地方法棧、PC寄存器是線程私有的
    • 容量滿時的異常類型不同:

      -對象創(chuàng)建時,方法區(qū)與堆棧的交互:
    • 程序執(zhí)行實例:字節(jié)碼指令存在于 class 文件
    public static void main(String[] args) {int a = 500;int b = 100;int c = a / b;int d = 50;System.out.println(c + d); }


    3 方法區(qū)的內(nèi)部結(jié)構(gòu)

    • 類型信息
      對于每個加載的類型(class, interface, enum, annotation),JVM存儲:
      該類型的完整有效名稱、該類型的直接父類的有效名稱、該類型的直接接口的有效名稱有序列表、該類型的修飾符

    • 域信息
      域聲明順序 存儲:
      域名稱、域類型、域修飾符

    • 方法信息
      方法聲明順序 存儲:
      方法聲明順序、方法的返回值類型、方法參數(shù)的數(shù)量和類型(按聲明順序)、方法的修飾符、方法的字節(jié)碼(方法名和方法體)、操作數(shù)棧大小、局部變量表大小、異常表

    • 非 final 的類變量
      即有 static 無 final 修飾的變量,類變量隨著類的加載而加載,和類數(shù)據(jù)屬于同一邏輯部分
      被 final 修飾的類變量在編譯時完成加載

    • 運行時常量池
      字節(jié)碼文件常量池(可以看作一張表,存放索引到類名、方法名、參數(shù)類型、字面量等類型的映射,以及相互之間的調(diào)用關(guān)系) 經(jīng)過類加載后得到的結(jié)果,存放在方法區(qū)中
      JVM 為每個已加載的類型維護一個運行時常量池,運行時常量池的每一項通過索引訪問

    4 方法區(qū)的發(fā)展:為什么需要元空間

    • 永久代的需要的空間難以估計,而元空間的容量僅受限于本地內(nèi)存,不易產(chǎn)生 OOM
    • 對永久代調(diào)優(yōu)比較困難
    版本變化
    1.6及之前有永久代
    1.7去永久代,運行時常量池中的字符串常量池、靜態(tài)變量移動到堆中,原因:永久代的回收效率很低,只有老年代或永久代空間不足時觸發(fā) Full GC 才會進行回收;而放在堆里能及時回收內(nèi)存
    1.8及之后無永久代,運行時常量池中的字符串常量池、靜態(tài)變量仍在堆中,永久代的其余部分移動到本地內(nèi)存中

    5 方法區(qū)的垃圾回收

    主要回收的內(nèi)容:常量池中不再使用的常量,和不再使用的類型

    • 常量池中不再使用的常量:類似于堆中實例的回收,一旦沒有被任何地方引用,就可以被回收
    • 不再使用的類型:實現(xiàn)比較困難,需要滿足以下三個條件
      該類的所有實例都被回收(包括派生子類)
      該類的類加載器已被回收
      該類對應(yīng)的 java.lang.Class 對象在任何地方都沒有被引用,即無法通過反射訪問該類的方法

    九 對象的實例化、內(nèi)存布局、訪問定位

    1 對象創(chuàng)建的方法和步驟

    2 !!對象的內(nèi)存布局

    • 在 main 方法中創(chuàng)建了一個名為 cust 的對象,其內(nèi)存布局如下圖所示
    • 因為是靜態(tài)方法,所以局部變量表的首位不是 this

    十 String Table

    1 String 的基本特性

    • 聲明為 final,不可繼承
    • 實現(xiàn)了 Serializable 接口,可序列化;實現(xiàn)了 Comparable 接口,可以比較大小
    • JDK8 及之前使用 char[] 存儲,JDK 9 之后使用 byte[],同時 StringBuffer 和 StringTable 也隨之更改
    • 通過字面量的方式(而非 new)給一個字符串賦值,此時字符串聲明在字符串常量池中
    • 字符串常量池不會存儲內(nèi)容相同的字符串
    • 具有不可變性,對字符串修改時,必須重新申請內(nèi)存區(qū)域進行賦值,而不能在原內(nèi)存空間中修改
    • JDK6 屬于永久代 -> JDK7 及之后屬于堆空間(詳見運行時數(shù)據(jù)區(qū):方法區(qū))

    2 String 拼接

    • 常量和常量的拼接結(jié)果,仍然放在字符串常量池,原理是編譯期優(yōu)化

    • 拼接過程中只要有一個是變量(如果聲明時被 final 修飾則不能視為“變量”,編譯期優(yōu)化),結(jié)果就在堆中,原理是變量拼接使用 StringBuilder,拼接后調(diào)用 toString(),類似于 new String()

    • 區(qū)別:new String() 生成的字符串會在常量池中保存一個字符串對象的復(fù)制(對象而非地址的復(fù)制),而 toString() 不會

    • 如果拼接的結(jié)果調(diào)用 intern(),則將拼接得到的字符串放入常量池(如果使用 equals() 判斷字符串已經(jīng)存在則無需放入),并返回字符串在常量池中的地址

    3 intern()

    • 某個字符串調(diào)用 intern() 方法,該方法會從字符串常量池中查詢當(dāng)前字符串是否存在,若不存在則復(fù)制到字符串常量池中,并返回它在字符串常量池的地址
    • 有關(guān) intern() “復(fù)制” 的說明:JDK1.6 及之前復(fù)制的是對象,將字符串對象從堆復(fù)制一份放在永久代(此時字符串常量池、靜態(tài)變量仍在永久代中);1.7 及之后復(fù)制的是字符串對象的引用地址,將地址放入字符串常量池(此時的字符串常量池、靜態(tài)變量移動到了堆中)
    • 注意以上僅針對 intern() “復(fù)制” ,new String(...) 只是單純地 創(chuàng)建兩個對象
    • 調(diào)用任意字符串的 intern() 方法,返回結(jié)果指向的實例,和以常量形式出現(xiàn)的字符串實例完全相同
    String s1 = "aa"; String s2 = "bb"; (s1 + s2).intern() == "aabb"; // 成立

    4 創(chuàng)建了幾個對象?

    • new String() 生成的字符串會在常量池中保存一份 對象的復(fù)制,而 toString() 不會
    • 以下對 JDK 6/7 均成立
    String s = new String("abc"); // 創(chuàng)建了2個對象,分別是堆中和字符串常量池中的 String 類型的實例 "abc" // 如何證明?看字節(jié)碼文件 String s = new String("aa") + new String("bb"); /* 創(chuàng)建了6個對象 1. new StringBuilder(),因為涉及到字符串拼接 2. new String("aa") 3. 字符串常量池中的 "aa" 4. new String("bb") 5. 字符串常量池中的 "bb" 6. StringBuilder 在拼接后調(diào)用 toString(),方法內(nèi)執(zhí)行 new String("aabb"),但不把 "aabb" 放入常量池!! */

    5 兩道難題*

    String s1 = new String("a"); // 不涉及到intern()的復(fù)制,只是單純創(chuàng)建兩個對象,無論6和7 s1.intern(); // 什么都沒做 String s2 = "a"; // 6:s2 ==(字符串常量池的實例 "a" 的地址) != s1的地址 // 7:s2 ==(字符串常量池中實例 "a" 的地址) != s1的地址 sout(s1 == s2); // 6/7/8 均返回 false String s3 = new String("a") + new String("a"); s3.intern(); // "aa"放入字符串常量池,是intern()放入的,而非 new String(...)放入,區(qū)別于上面 String s4 = "aa"; // 6:s4 ==(字符串常量池的實例 "aa" 的地址) != s3的地址 // 7:s4 ==(字符串常量池中存放的 堆中 "aa" 的地址) == s3的地址 sout(s3 == s4); // 6 返回 false,7/8 返回 true
    • 問題2參考上述有關(guān) intern() “復(fù)制” 的說明:JDK1.6 及之前復(fù)制的是對象,將字符串對象從堆復(fù)制一份放在永久代,創(chuàng)建了新對象(1.6 字符串常量池、靜態(tài)變量仍在永久代中);1.7 及之后復(fù)制的是字符串對象的引用地址,將地址放入字符串常量池(1.7 字符串常量池、靜態(tài)變量移動到了堆中)
    • 注意以上僅針對 intern() “復(fù)制” ,new String(...) 只是單純地 創(chuàng)建兩個對象
    • 關(guān)鍵是 intern() 之前常量池里是否已有字符串,即 intern() 是否起作用
    • 補充三道例題和圖解:



    十一 垃圾回收相關(guān)概念

    1 什么是垃圾

    • 垃圾:運行程序中沒有任何指針指向的對象
    • 垃圾回收的對象是堆和方法區(qū),重點是堆。從次數(shù)上講,頻繁收集年輕代,較少收集老年代,基本不收集永久代
    • 垃圾回收的步驟分為 標(biāo)記階段清除階段

    2 內(nèi)存溢出

    • 沒有空閑內(nèi)存,并且垃圾收集器無法提供更多內(nèi)存時,發(fā)生 OOM
    • 在拋出 OOM 前,通常 GC 會執(zhí)行垃圾回收,盡可能清理出空間
    • 發(fā)生原因:
      可能是 JVM 堆內(nèi)存設(shè)置不夠;
      也可能是代碼中創(chuàng)建了大量大對象,并且長時間不能被垃圾收集器回收;
      或者是申請了超大對象,超過了堆的最大值,此時不觸發(fā) GC 直接 OOM

    3 內(nèi)存泄漏

    • 嚴格來說,只有對象不會再被程序用到了,但是 GC 又不能回收他們的情況,才稱為內(nèi)存泄漏
    • 一些不好的實踐導(dǎo)致對象生命周期變長,甚至進一步導(dǎo)致 OOM,是寬泛意義上的內(nèi)存泄漏
    • 舉例:
      1.單例模式。單例對象的生命周期和應(yīng)用程序是一樣長的,如果單例對象持有對外部對象的引用的話,那么這個外部對象就不能 被回收,導(dǎo)致內(nèi)存泄漏
      2.一些資源未手動關(guān)閉導(dǎo)致內(nèi)存泄漏。數(shù)據(jù)庫連接、套接字連接、IO連接必須手動關(guān)閉,否則不能被回收

    4 強引用:存在就不回收

    • 最傳統(tǒng)的“引用”,默認的引用類型,無論任何情況下, 只要強引用還存在,垃圾收集器就永遠不會回收被引用的對象
    • 四種引用中,唯一需要為 OOM 負責(zé)的引用類型,即只有強引用才會導(dǎo)致 OOM
    • 強引用可以直接訪問目標(biāo)對象
    • 強引用指向的對象在任何時候都不會被回收,即使 OOM

    5 軟引用:內(nèi)存不足時回收

    • 在即將 OOM 之前,垃圾收集器會回收 具有軟引用的對象,如果 GC 后仍內(nèi)存不足則 OOM
    • 和弱引用類似,只不過 JVM 會盡量讓軟引用的對象存活得更久,迫不得已時才回收
    Object obj = new Object(); // 聲明強引用 SoftReference<Object> soft = new SoftReference<Object>(obj); // 聲明軟引用 obj = null; // 銷毀強引用

    6 弱引用:發(fā)現(xiàn)即回收

    • 具有弱引用的對象只能生存到下一次 GC 之前,無論內(nèi)存是否足夠,在執(zhí)行 GC 時都會回收這類對象
    • 由于 GC 線程的優(yōu)先級很低,所以弱引用對象也能存在一定的時間
    • 和軟引用都適合存放可有可無的緩存數(shù)據(jù)
    Object obj = new Object(); // 聲明強引用 WeakReference<Object> soft = new WeakReference<Object>(obj); // 聲明弱引用 obj = null; // 銷毀強引用

    7 虛引用:形同虛設(shè),回收跟蹤

    • 虛引用不會對對象的生存周期造成影響,也無法通過虛引用獲得對象(除此之外都可以通過引用獲取對象),虛引用的作用僅僅是在對象被回收時收到系統(tǒng)通知
    • 四種引用中,唯一一種不能用來獲取被引用的對象的引用類型
    • 虛引用可以跟蹤對象的回收時間,因此可以將一些資源釋放操作放置在虛引用對象中執(zhí)行記錄
    • 必須和引用隊列一起使用,當(dāng) GC 執(zhí)行時,如果發(fā)現(xiàn)一個待回收對象具有虛引用,就會在對象回收后將虛引用加入到引用隊列,以通知對象的回收情況
    Object obj = new Object(); // 聲明強引用 ReferenceQueue queue = new ReferenceQueue(); // 引用隊列 PhantomReference<Object> soft = new PhantomReference<Object>(obj, queue); // 聲明虛引用,需要傳入引用隊列 obj = null; // 銷毀強引用

    十二 垃圾回收算法

    1 標(biāo)記階段:可達性分析算法

    • 基本思路是,從 GC Roots 出發(fā)按照從上到下的搜索方式,確定對象是否可達,如果目標(biāo)對象沒有任何引用鏈相連,則是不可達的,標(biāo)記為垃圾對象。只有能被根對象集合直接或間接到達的對象才是存活對象
    • 可以解決循環(huán)引用問題
    • 可以作為 GC Roots 的對象類型:
      虛擬機棧(棧幀中的本地變量表)中引用的對象
      本地方法棧中引用的對象
      方法區(qū)中 類的靜態(tài)屬性 引用的對象
      方法區(qū)中 常量 引用的對象(字符串常量池中的對象)
      被同步鎖持有的對象
    • 如果一個引用指向堆內(nèi)存里的對象,引用本身又不在堆內(nèi)存里,那么這個對象就是一個 GC Root
    • 分析工作需要在能保障一致性的快照中進行,所以執(zhí)行時必須 Stop the World

    2 finalize

    • 垃圾回收器回收對象之前,總會先調(diào)用該對象的 finalize()
    • 重寫該方法可以自定義對象被銷毀之前的處理邏輯,用于對象回收時的資源釋放
    • 不要主動調(diào)用對象的 finalize() 方法,而要交給垃圾回收器調(diào)用,原因:
      finalize() 可能導(dǎo)致對象復(fù)活
      糟糕的 finalize() 會嚴重影響 GC 性能
      何時執(zhí)行 finalize() (即何時回收對象)是沒有保障的,應(yīng)該由 GC 決定
    • 虛擬機中的對象處于 可觸及、可復(fù)活、不可觸及 三種狀態(tài)
      可觸及:對象由 GC Roots 可達
      可復(fù)活:對象所有引用都被釋放,但 finalize() 沒有調(diào)用,有可能在 finalize() 中復(fù)活
      不可觸及:對象的 finalize() 已被調(diào)用并且沒有復(fù)活,此時對象可以被安全回收。不可觸及的對象不可能被復(fù)活,因為對象的 finalize() 只會調(diào)用一次

    3 判斷對象是否可回收的流程(至少兩次標(biāo)記)

  • 如果沒有 GC Roots 到對象的引用鏈,則第一次標(biāo)記
  • 判斷該對象有無必要執(zhí)行 finalize() 方法:
    ① 如果對象沒有重寫 finalize() 方法,或 finalize() 被調(diào)用過,則視為“沒有必要執(zhí)行”,對象被判定為不可觸及,執(zhí)行垃圾回收
    ② 如果對象重寫了 finalize() 方法,并且未執(zhí)行過,則對象被插入到 F-Queue 隊列中,由虛擬機自動創(chuàng)建的低優(yōu)先級線程 Finalizer 執(zhí)行其 finalize() 方法
    ③ 稍后 GC 對 F-Queue 中的對象進行二次標(biāo)記,如果對象執(zhí)行 finalize() 后和引用鏈上的任意對象產(chǎn)生聯(lián)系,則被移出“即將回收”集合。對象會再次出現(xiàn)沒有引用存在的情況時,該對象的 finalize() 不會再被調(diào)用,一旦 GC Roots 不可達則立刻進入不可觸及狀態(tài)
  • 4 清除階段:標(biāo)記-清除算法

    • 首先,垃圾收集器從根節(jié)點開始遍歷,標(biāo)記所有 引用的對象(而非標(biāo)記垃圾對象);然后垃圾收集器 對堆內(nèi)存從頭到尾進行線性遍歷,如果對象沒有被標(biāo)記則將其回收
    • 缺點:
      這種方式清理出來的空閑內(nèi)存是不連續(xù)的
      這里的清除指的是,把清除的對象地址保存在空閑地址列表里,以便再次為對象分配內(nèi)存時使用,因此需要維護一個空閑鏈表
      STW

    5 清除階段:標(biāo)記-復(fù)制算法

    • 將內(nèi)存空間分為兩塊,每次僅使用其中的一塊。在垃圾回收時將使用的內(nèi)存塊中的存活對象復(fù)制到未被使用的塊中,然后清除正在使用的內(nèi)存塊的所有對象,交換兩個內(nèi)存塊的角色
    • 適合存活對象很少,垃圾對象很多的場景(尤其是新生代)
    • 優(yōu)點:
      保證垃圾回收后空間的連續(xù)性,不會出現(xiàn)碎片問題
      三種算法中效率最高
    • 缺點:
      需要兩倍的內(nèi)存空間
      STW

      (黑色箭頭代表引用關(guān)系)

    6 清除算法:標(biāo)記-壓縮算法

    • 首先,垃圾收集器從根節(jié)點開始遍歷,標(biāo)記所有 引用的對象(而非標(biāo)記垃圾對象);然后將存活的對象壓縮到內(nèi)存的一側(cè),按照順序排放;最后清理邊界外的所有空間
    • 標(biāo)記-清除算法 的本質(zhì)差異在于,標(biāo)記-清除算法 是非移動式的回收算法,標(biāo)記-壓縮算法 是移動式的
    • 優(yōu)點:
      內(nèi)存有序分布,可以使用指針碰撞的方式為新對象分配內(nèi)存,效率高
      解決了 標(biāo)記-清除算法 的碎片問題
    • 缺點:
      效率低于上述兩種算法
      STW

    7 三種清除算法的對比

    標(biāo)記-清除標(biāo)記-復(fù)制標(biāo)記-壓縮
    執(zhí)行速度中等最快最慢
    空間開銷
    是否產(chǎn)生碎片
    是否移動對象

    8 分代收集算法

    • 核心思想是,不同生命周期的對象采用不同的收集方式
    • 新生代:區(qū)域比老年代小,對象生命周期短、存活率低、回收頻繁。適用 標(biāo)記-復(fù)制算法
    • 老年代:區(qū)域較大,對象生命周期長、存活率高、回收不頻繁。一般采用 標(biāo)記-清除算法標(biāo)記-壓縮算法 混合實現(xiàn)

    十三 垃圾回收器

    1 主要性能指標(biāo)

    • 吞吐量:運行用戶代碼的時間占總運行時間的比例
    • 暫停時間:執(zhí)行垃圾收集時,程序的工作線程被暫停的時間
    • 內(nèi)存占用:執(zhí)行垃圾收集時占用的堆空間大小

    優(yōu)秀的垃圾收集器最多三者得其二。其中,吞吐量和暫停時間也是相互矛盾的目標(biāo),如果選擇更大的吞吐量,就會降低垃圾回收的頻率,導(dǎo)致暫停時間更長;反之,選擇更短的暫停時間,提高了垃圾回收的頻率,降低了吞吐量。當(dāng)前垃圾收集器的準(zhǔn)則是,在保證吞吐量的前提下,盡量縮短暫停時間

    總結(jié)

    以上是生活随笔為你收集整理的后端学习 - JVM(上)内存与垃圾回收的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    欧美精品资源 | 国产手机视频在线 | 婷婷国产在线观看 | 亚洲,国产成人av | 麻豆影视网站 | 久久久久久欧美二区电影网 | 亚洲国产精品va在线看 | 91精品视频免费观看 | 久草在线免费色站 | 涩涩网站在线看 | 蜜臀av性久久久久av蜜臀妖精 | 欧美黄污视频 | 夜夜操天天干, | 2024国产精品视频 | 在线三级av | 亚洲高清在线视频 | 久久精品视频日本 | 国产精品美女久久久久久网站 | 91九色最新地址 | a久久免费视频 | 亚洲激情电影在线 | 国产裸体视频bbbbb | 亚洲视频免费在线观看 | 国产a国产a国产a | 黄色小说视频在线 | 国产一区私人高清影院 | 日日干av | 日韩va欧美va亚洲va久久 | 国产精品久久久久久久久久久免费 | 国产亚洲精品电影 | 久久久久久久久久久久影院 | 日韩在线电影观看 | www.天天干 | 欧美一级免费黄色片 | 国产精品日韩高清 | 狠狠色丁香婷婷综合欧美 | 国产中文在线观看 | 国产精品videossex国产高清 | 天天爱av导航 | 久久久久久激情 | 一区二区三区观看 | 中文字幕一区二区三区四区在线视频 | 国产精品久久一区二区无卡 | 国产精品乱码一区二区视频 | 国产精品久久久久一区 | 91看片在线播放 | 日韩免费一区 | 天无日天天操天天干 | 狠狠狠狠干| 亚洲精品综合一区二区 | www国产一区| 狠狠干我 | 超碰97中文 | 色九九视频 | 日韩手机在线观看 | 欧美色888 | 成人免费网站视频 | 国产亚洲精品久久久久久久久久久久 | 欧美aaaxxxx做受视频 | 亚洲资源视频 | 国产69精品久久99的直播节目 | 91精品一区在线观看 | 亚洲涩涩一区 | 丁香电影小说免费视频观看 | 日韩高清免费观看 | 精品久久中文 | 色偷偷网站视频 | 国产精品高潮呻吟久久av无 | 久草在线视频国产 | 毛片网站观看 | 一本一道久久a久久综合蜜桃 | 天天射天天操天天 | 久久久久免费精品视频 | 精品99在线观看 | 久久综合色天天久久综合图片 | 日日干天天爽 | 亚洲一级二级三级 | 日韩欧美大片免费观看 | 国产黑丝一区二区三区 | 狠狠干 狠狠操 | 91香蕉视频黄 | 五月天激情视频在线观看 | 国产一级免费播放 | 久久久久国产视频 | 天天操月月操 | 久久永久免费 | 色福利网| 一区 在线 影院 | 成人在线视频网 | 丁香花中文字幕 | 久久精品久久99精品久久 | 麻豆国产精品视频 | 久久免费a | jizz18欧美18 | 亚洲一级片在线观看 | 免费一级片久久 | 日本99精品 | 1024手机在线看 | 久久爱导航 | av线上看| 国产精品 中文在线 | 九九久久久久99精品 | 在线激情av电影 | 免费看三级 | 免费在线日韩 | 欧美性生活免费看 | 国产美女永久免费 | 久久综合狠狠综合 | 亚洲午夜剧场 | 国产永久免费高清在线观看视频 | 久久国产电影 | 国产少妇在线观看 | 精品久久久久久久久亚洲 | 中文字幕 婷婷 | 久久精品理论 | www.夜夜操.com| 成人小视频在线观看免费 | av 一区二区三区 | 香蕉视频在线免费 | 欧美一区在线看 | 中国一级片在线 | 国产乱对白刺激视频不卡 | 久久av一区二区三区亚洲 | 99精品免费 | 久久精久久精 | 国产伦理久久精品久久久久_ | 欧美一区成人 | 亚洲精品中文字幕在线 | 免费a v在线 | 日韩av资源站 | 草久视频在线观看 | 久久人人爽人人爽人人片av免费 | 国产午夜一区二区 | 女人18片毛片90分钟 | 亚洲精品视频免费在线 | 亚洲成人一二三 | 99在线观看免费视频精品观看 | 日日日日日 | 成人久久国产 | 日韩中文字幕免费在线播放 | 欧美激情xxxx性bbbb | 久草在线这里只有精品 | 国内精品在线看 | 99久久精品国产一区 | 91成人免费 | 久久午夜国产精品 | 91福利免费 | 制服丝袜在线 | 久久精品第一页 | 精品久久久久一区二区国产 | 日韩乱理 | 国产精品一区二区果冻传媒 | 中文字幕文字幕一区二区 | 婷婷综合 | 久久草在线视频国产 | 这里只有精品视频在线观看 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 亚洲成人国产精品 | 成人av电影网址 | 欧美成人h版电影 | 久久亚洲综合色 | 亚洲国产偷 | 精品一区av | 精品国产伦一区二区三区观看体验 | 在线小视频 | 国内偷拍精品视频 | 一区在线免费观看 | 日日夜夜天天干 | 99久久久国产精品免费99 | 国产精品一区二区三区免费视频 | 18av在线视频 | 三级视频国产 | 91精品黄色 | 亚洲天天 | 在线91视频 | 久久免费福利视频 | 日韩精品免费一线在线观看 | 99这里只有| 色噜噜日韩精品一区二区三区视频 | 不卡av免费在线观看 | 久久免费观看视频 | 在线观看免费版高清版 | 很黄很色很污的网站 | a黄色一级片 | 国产精品久久久久久久7电影 | 国产精品情侣视频 | av大全在线观看 | 成人午夜剧场在线观看 | 麻豆视频免费在线播放 | 成人va视频 | 91九色蝌蚪国产 | 天天插日日插 | 久久久久婷 | 麻豆91精品视频 | 视频一区二区精品 | 色综合久久久网 | 国产精品电影一区 | 色免费在线 | 欧美日韩精品免费观看视频 | 天天做天天干 | www.香蕉视频在线观看 | 国产精品久久久久久久久久尿 | 久久精品99国产精品 | 超碰夜夜 | 国产在线小视频 | 天海冀一区二区三区 | 久久福利| 成人av免费网站 | 最新黄色av网址 | 国产一区二区三区在线免费观看 | 久久蜜桃av | 伊在线视频 | 国产一区在线观看免费 | 日本电影黄色 | 亚洲1级片 | 国产69久久久欧美一级 | 麻豆 videos| 久久久久一区二区三区四区 | 天天干天天弄 | 人人舔人人爽 | 国产视频在线观看一区 | 国产精品久久久久久久av大片 | av一级片| 91丨九色丨国产在线观看 | 亚洲精品国产精品国产 | 国产在线观看 | 精品国自产在线观看 | 久久综合婷婷 | 成人h电影在线观看 | av大全在线 | 香蕉视频91 | 最新av中文字幕 | 亚洲免费在线视频 | 五月天综合 | 成人av教育 | 亚洲综合欧美精品电影 | 麻豆免费在线视频 | 日韩高清免费观看 | 日韩免费成人av | 国产96视频| 天天爱天天舔 | 伊人久在线 | 国产黄色精品网站 | 国产伦精品一区二区三区高清 | 91成人精品在线 | 麻豆视频免费在线观看 | 天天综合在线观看 | 国产高清av | 国产视频不卡 | 日韩一区二区三区免费视频 | 国产成人免费观看久久久 | 天天色婷婷 | 日日夜夜天天操 | 人人澡人人爽欧一区 | 又粗又长又大又爽又黄少妇毛片 | 中文伊人 | 热久久99这里有精品 | 91av在线看 | 中文字幕免费一区 | 亚洲春色综合另类校园电影 | 午夜精品久久久久久久久久久久久久 | 在线观看久 | 日韩欧美一区二区三区免费观看 | 国产精品视频永久免费播放 | 91视频亚洲| 男女视频91 | 一区二区三区在线免费 | 丁香婷婷亚洲 | 久久久久久久久网站 | 久久免费播放 | 91插插插免费视频 | 免费h精品视频在线播放 | 欧美激情在线网站 | 国产女人40精品一区毛片视频 | 97精品久久人人爽人人爽 | 国产精品久久久久久久免费大片 | 色婷婷播放 | 亚洲免费av网站 | 国语麻豆| 免费视频黄色 | 日韩精品一区二区三区高清免费 | 色婷婷色 | 亚洲国产日韩一区 | 色在线国产 | 少妇视频一区 | 日韩在线小视频 | 在线观看国产日韩 | 中文字幕一区二区三区乱码不卡 | 亚洲综合色激情五月 | 亚洲视频精品 | 国产高清av在线播放 | 超碰在线1 | 久久综合成人网 | 色开心| 久久久精品国产一区二区三区 | 国产精品一区二区三区四区在线观看 | 免费看一级黄色大全 | 久久伊人五月天 | 狠狠色噜噜狠狠狠狠2022 | 国产精品久久嫩一区二区免费 | 国产 日韩 中文字幕 | 天天操天天射天天操 | 成人黄色小说在线观看 | 在线高清一区 | 国产小视频在线观看免费 | 四虎成人精品永久免费av九九 | 亚洲天堂毛片 | 男女啪啪免费网站 | 91新人在线观看 | 91亚州 | 日本在线成人 | 美女在线免费视频 | 亚洲专区免费观看 | 国产精品一码二码三码在线 | 久久精品久久久久电影 | 久草在线最新视频 | 日精品在线观看 | 香蕉视频18 | 日韩欧美在线免费观看 | 亚洲精品456在线播放第一页 | 奇米影视999 | 999久久久免费精品国产 | 中文字幕 婷婷 | 免费观看一级成人毛片 | 亚洲日韩精品欧美一区二区 | 午夜精品久久久久久久99水蜜桃 | 91福利区一区二区三区 | 天天射天天艹 | 88av网站| 这里只有精品视频在线观看 | 免费高清国产 | 激情欧美xxxx | 久久久99精品免费观看 | 中文字幕精品www乱入免费视频 | www.com久久 | 欧美国产一区二区 | 婷婷丁香色综合狠狠色 | av黄色国产| 国产精品一区二区av影院萌芽 | 亚洲成人一二三 | 亚洲日本国产精品 | 久草影视在线观看 | 在线视频手机国产 | 夜添久久精品亚洲国产精品 | 成人午夜电影在线 | 中文字幕乱在线伦视频中文字幕乱码在线 | 午夜精品电影一区二区在线 | 五月激情天 | 国产精品毛片完整版 | 日韩精品一区二区三区电影 | 日韩在线观看高清 | 色播亚洲婷婷 | 国内精品免费久久影院 | 日免费视频 | 欧美久久综合 | 国内精品久久久久久中文字幕 | 欧美日韩国产一区 | 亚洲精品视频在线免费播放 | 国产精品久久久久久久久久免费看 | 欧美日韩亚洲第一页 | 91综合久久一区二区 | 免费网站在线观看人 | 婷婷丁香在线观看 | 亚洲毛片一区二区三区 | av中文在线影视 | 日韩毛片在线免费观看 | 福利久久| 久久久久久免费网 | 精品一区二区免费 | 精品久久久久久久久久久久久 | 久久午夜免费观看 | 色偷偷人人澡久久超碰69 | 欧美成人一二区 | 亚洲精品videossex少妇 | 丁香电影小说免费视频观看 | 在线精品国产 | 国产精品久久久久久久久久久久午夜片 | 久久久久久久久久影视 | 西西44人体做爰大胆视频 | 波多野结衣小视频 | 99福利影院| 欧美天天干 | 成人免费视频网站 | 日本乱码在线 | 97在线公开视频 | 深爱激情综合网 | 国产麻豆视频 | 99在线免费视频观看 | 黄影院| 欧美日韩伦理一区 | 天天天天综合 | 黄色av成人在线 | 国产一级电影网 | 中文字幕黄色av | 激情av在线资源 | japanesexxxxfreehd乱熟 | 成年人免费在线 | 欧美成亚洲 | 最近日本韩国中文字幕 | 欧美a级片网站 | 国产中文字幕免费 | 欧美日韩在线播放一区 | 国产美女免费观看 | 亚洲香蕉在线观看 | 99精品欧美一区二区三区黑人哦 | 精品理论片 | 国产 字幕 制服 中文 在线 | 91久久偷偷做嫩草影院 | 国产99久久九九精品免费 | 国产日本在线观看 | 日本动漫做毛片一区二区 | 亚洲黄色av网址 | 免费黄色av电影 | 免费观看性生活大片3 | 91看片在线免费观看 | 激情 婷婷 | 中文字幕一区二区三区精华液 | 国产在线视频资源 | 国产无套精品久久久久久 | 高潮久久久 | 亚洲国产精品久久久久婷婷884 | 不卡的av中文字幕 | 国内精品久久久久影院一蜜桃 | 日韩精品中文字幕久久臀 | 五月天久久久 | 精品在线播放视频 | 激情五月网站 | free. 性欧美.com | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 五月激情丁香图片 | 91成人短视频在线观看 | 亚洲国产精品久久久 | 国产精品国产三级国产aⅴ无密码 | 又黄又刺激的网站 | 精品一区精品二区高清 | 欧美精品一二三 | 亚洲成人av在线 | 亚洲精品国产第一综合99久久 | 欧美日产在线观看 | 99免在线观看免费视频高清 | 久久视频在线观看 | 婷婷婷国产在线视频 | 97成人精品区在线播放 | 日日夜夜综合 | 亚洲高清91 | 91精品在线免费观看 | 国产精品久久久999 国产91九色视频 | 亚洲自拍偷拍色图 | 日韩在线观看中文字幕 | 国产成人亚洲在线观看 | 欧洲色吧 | 久久国产视频网站 | 亚洲午夜精 | 欧美激情精品久久久久久免费印度 | 夜夜躁日日躁狠狠久久88av | 欧美精品一区二区在线播放 | 麻豆国产露脸在线观看 | 69视频国产 | 成片视频免费观看 | 亚州精品成人 | 玖玖在线视频观看 | 中文字幕乱偷在线 | japanesexxxxfreehd乱熟 | 天天艹天天爽 | 成人国产在线 | 日韩精品 在线视频 | 97香蕉久久超级碰碰高清版 | 欧美性生活久久 | 国产福利在线免费 | 精品婷婷 | 国偷自产中文字幕亚洲手机在线 | 亚洲热久久 | 国产精品av久久久久久无 | 亚洲国产高清视频 | 久久免费视频6 | 91丨九色丨蝌蚪丨对白 | 精品视频123区在线观看 | 国产福利91精品 | 国产91精品看黄网站在线观看动漫 | 欧美日韩在线免费观看 | 婷婷精品国产一区二区三区日韩 | 久久久久在线观看 | 在线看小早川怜子av | 九九在线国产视频 | 久艹视频在线免费观看 | 国产专区在线看 | 在线亚洲精品 | 9在线观看免费高清完整 | 欧洲精品久久久久毛片完整版 | 五月天婷亚洲天综合网鲁鲁鲁 | 日日碰狠狠添天天爽超碰97久久 | 狠狠色噜噜狠狠狠 | 日韩精品短视频 | 亚洲成aⅴ人片久久青草影院 | 午夜精品一区二区三区免费 | 婷婷视频在线 | 九九日九九操 | 五月天狠狠操 | 国产二区免费视频 | 夜夜夜夜爽 | 精品国产乱码久久久久久三级人 | 天天射网站 | 在线观看中文字幕视频 | av电影在线不卡 | 免费男女羞羞的视频网站中文字幕 | 天天干天天拍 | 九九热精品国产 | 日本一区二区三区免费看 | 日韩三级视频 | 亚洲精品综合欧美二区变态 | 欧美 日韩 国产 成人 在线 | 日韩天堂网 | 国产精品中文字幕在线 | 在线免费观看麻豆视频 | 在线国产精品视频 | 欧美成人91 | 久久情网 | 欧美午夜精品久久久久 | 久久久久久国产精品亚洲78 | 欧美久久久久久久久中文字幕 | 最近免费中文字幕大全高清10 | avav片| 国产视频 亚洲视频 | 日本爱爱免费 | 亚洲人av免费网站 | 黄色日本免费 | 青草视频在线 | 最近日本中文字幕a | 亚洲成aⅴ人在线观看 | 色综合www| av在线免费网 | 精品久久五月天 | 国产专区日韩专区 | 婷色| 美女网站视频免费黄 | 免费三级网 | 欧美影院久久 | 亚洲一区二区精品 | www.99在线观看 | 亚洲国产无 | 免费看成人片 | 欧美日韩中文国产一区发布 | 九九免费观看全部免费视频 | 黄色国产在线观看 | 精品亚洲免费视频 | 91在线视频导航 | 91精品久久久久久综合乱菊 | 国产精品黄网站在线观看 | 欧美a级在线播放 | 国产成本人视频在线观看 | 久久免费电影网 | 免费一级片观看 | 91禁在线观看 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 人人干人人做 | 五月天欧美精品 | av东方在线 | av高清一区二区三区 | 亚洲精品乱码久久久久久按摩 | 91成人在线观看高潮 | 欧美日韩69 | 国内偷拍精品视频 | 天天曰天天曰 | 中文字幕免费一区 | 国产永久免费高清在线观看视频 | 97福利 | 欧美色图另类 | 91av大全| 九九国产精品视频 | 99九九视频| 激情导航| 精品在线小视频 | 9999在线视频 | 精品免费观看视频 | 国内精品久久久久影院优 | 亚洲成av人片在线观看www | 成年人免费观看在线视频 | 亚洲综合成人av | 91麻豆精品国产自产在线 | 制服丝袜在线 | 亚洲国产欧美在线人成大黄瓜 | 国产日韩中文字幕 | 最近更新好看的中文字幕 | 欧美夫妻生活视频 | 欧美伦理一区二区 | a成人v| 麻豆视频在线观看 | 在线观看精品黄av片免费 | 超碰在线天天 | 91香蕉国产 | 黄色大片免费网站 | 91视频 - v11av| 91热精品 | 天天干 夜夜操 | 国产黑丝一区二区三区 | 99久久www免费 | 黄色av电影在线 | 五月天婷亚洲天综合网精品偷 | av天天色| 免费观看十分钟 | 日韩国产精品一区 | 在线天堂中文www视软件 | 91禁在线看 | 亚洲 中文 欧美 日韩vr 在线 | 激情小说网站亚洲综合网 | 国产高清在线精品 | 日韩精品一区二区三区电影 | 开心丁香婷婷深爱五月 | 国产精品久久久亚洲 | 久久夜靖品 | 9797在线看片亚洲精品 | 午夜视频亚洲 | 日本黄色大片免费看 | 欧美在线观看视频 | 国产青草视频在线观看 | 久草香蕉在线 | 人人看97| 色婷婷国产精品一区在线观看 | 天天色天天骑天天射 | 国产成人综合精品 | 日韩欧美在线视频一区二区 | 国产精品99在线播放 | 久99视频 | 久久91久久久久麻豆精品 | 在线亚洲欧美视频 | 免费观看黄色av | 午夜精品久久久99热福利 | 麻花天美星空视频 | 91精品国产综合久久福利 | 亚洲最新av | 九九免费观看全部免费视频 | 在线涩涩 | 国产夫妻性生活自拍 | 在线日韩精品视频 | 亚洲精品午夜久久久久久久 | 国产无套视频 | 成人国产精品一区二区 | 亚洲视频一区二区三区在线观看 | 免费av免费观看 | 国产91精品欧美 | 久久激情视频免费观看 | 在线国产精品视频 | 中文字幕亚洲欧美 | 日韩激情久久 | 中文字幕最新精品 | 亚洲国产成人精品电影在线观看 | 超碰免费观看 | 国产在线v| 美女露久久 | 极品中文字幕 | 天堂av在线中文在线 | 久久久久国产一区二区三区 | 四虎影视成人永久免费观看视频 | 99视频免费 | 国产人成看黄久久久久久久久 | 日韩欧美精品在线 | 成人免费av电影 | 午夜久久影院 | 在线看一区二区 | 国产视频18 | 日韩免费福利 | 天天插天天爱 | www.超碰97.com | 九九九九色 | 一本一道久久a久久综合蜜桃 | 欧美精品国产综合久久 | 久久日韩精品 | 在线视频 影院 | 欧美一级特黄高清视频 | va视频在线 | 黄色看片 | 成人一区电影 | 成年人毛片在线观看 | 国内精品美女在线观看 | 天天做天天看 | 高清不卡毛片 | 亚洲精品理论 | 久久97久久 | 久久久久久久久久久久久国产精品 | 日韩在线视频不卡 | 国产精品扒开做爽爽的视频 | 亚洲精选国产 | 国产黄色大片免费看 | 精品亚洲免费 | 丁香婷婷在线 | 在线观看网站av | 中文字幕av在线不卡 | 色婷婷狠| 欧美国产精品久久久久久免费 | 狠狠操天天射 | 国产高清视频网 | av综合网址 | 波多野结衣在线观看一区二区三区 | 91国内产香蕉 | 激情五月婷婷丁香 | 青青草久草在线 | 免费av在 | 亚洲国产精品免费 | 91影视成人 | 色视频网站在线 | 国产一区二区精品在线 | av888av.com| 国产欧美日韩一区 | 国产中文字幕在线视频 | 日日爱视频 | 欧女人精69xxxxxx | 中文字幕一区在线观看视频 | 亚洲综合色站 | 国产又粗又猛又黄又爽的视频 | 摸阴视频 | 亚州精品在线视频 | 成人av电影在线 | 奇米影视999 | 国产色网站 | av不卡网站 | 91超级碰碰 | 中文字幕电影一区 | 最近中文字幕大全中文字幕免费 | 色综合婷婷 | 日韩在线视频不卡 | 精品免费久久久久 | 久草精品视频在线观看 | avove黑丝| 国产999精品久久久久久绿帽 | 亚洲精品www久久久 www国产精品com | 久久婷婷精品 | 免费日韩一区二区三区 | 99久久婷婷国产一区二区三区 | 欧美在线观看禁18 | 99欧美精品 | 六月丁香六月婷婷 | 青青草在久久免费久久免费 | 欧美日韩一区二区久久 | 精品一区二区三区香蕉蜜桃 | 国产成人免费在线 | 久久综合久久伊人 | 天天插综合网 | 亚洲国产精品电影 | 久久久精品久久日韩一区综合 | 99国产在线视频 | 日本中文字幕观看 | 玖玖玖在线观看 | 日韩二区三区 | 国产精品嫩草影院99网站 | 国产精品资源在线观看 | 亚洲黄色免费在线看 | 日本久久综合视频 | 色婷婷综合视频在线观看 | 免费中文字幕 | 亚洲午夜精品在线观看 | 国产a级片免费观看 | 亚洲激情视频 | 国产91精品一区二区麻豆亚洲 | 97超碰香蕉| 国产在线999 | 五月婷在线观看 | 午夜精品福利一区二区三区蜜桃 | 九九视频这里只有精品 | 国产精品青草综合久久久久99 | 国产99久久久精品 | 久艹在线免费观看 | 国色天香第二季 | 欧美一区二区在线看 | 久久国产精品小视频 | 狠狠色2019综合网 | 国产精品一区二区在线观看 | 色综合中文字幕 | 夜夜夜影院 | 黄色片网站免费 | 国产真实精品久久二三区 | 99精品一区二区 | av品善网| 久草在线免费资源 | 欧美日韩1区2区 | 嫩草伊人久久精品少妇av | 日韩国产精品久久久久久亚洲 | av超碰在线 | 婷婷丁香九月 | av电影在线观看 | 三级av在线 | 日韩精品欧美专区 | 91精品电影 | 欧美analxxxx | 17videosex性欧美 | 中文字幕免费观看视频 | 在线观看中文字幕dvd播放 | 九九九九色| 免费在线精品视频 | 久久久久影视 | 久久久私人影院 | 综合色综合色 | 免费av试看 | 日本黄色免费观看 | 在线精品在线 | 狠狠五月天 | 激情网第四色 | 91在线观看高清 | 日韩在线观看一区二区三区 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 久久精品国产亚洲 | 免费看色网站 | 久久久免费毛片 | 97人人看| 中文字幕一区二区三 | 99久久夜色精品国产亚洲96 | 国产精品一区二区三区在线播放 | 中文字幕精品一区二区精品 | 国产一级高清视频 | 国产视频一区二区三区在线 | 夜夜夜夜爽| 香蕉视频网址 | 波多野结衣视频一区 | 久久99视频| 国产一级视频在线观看 | 黄色一级在线免费观看 | 超碰免费在线公开 | 久草免费福利在线观看 | 日韩激情中文字幕 | 午夜精品电影一区二区在线 | 免费看的国产视频网站 | 日韩亚洲精品电影 | 黄色aaa级片 | 亚洲a成人v | 91麻豆精品国产91 | 三级黄色片在线观看 | 亚洲一区精品二人人爽久久 | 黄色中文字幕在线 | av免费播放 | 天天干天天操天天 | 亚洲一区动漫 | 香蕉视频在线看 | 亚洲 欧美 日韩 综合 | 午夜 在线| 久久福利综合 | 国产美女网站视频 | 亚洲欧洲国产视频 | av成人免费在线观看 | 97成人资源站 | 97av.com| 国产999精品久久久久久 | 久久成人午夜 | 中文字幕在线观看免费高清完整版 | 99 色| 综合国产视频 | www.久久色 | 久久视频6 | 欧美综合久久 | 免费久久精品视频 | 亚洲成人av电影在线 | 久久中文字幕在线视频 | 亚洲高清91 | 欧美日韩亚洲在线观看 | 麻豆影视网| 天天摸天天舔天天操 | 中文在线字幕免 | 国产传媒中文字幕 | 精品国精品自拍自在线 | 日韩激情在线视频 | 亚洲国产激情 | 99国产精品 | 天堂av在线网站 | 免费色视频网站 | 伊人久久影视 | 日韩欧美电影在线 | 91精品在线麻豆 | 国产一区二区成人 | 亚洲精选视频在线 | 亚洲日本国产精品 | 亚洲免费黄色 | av视屏在线播放 | 91网址在线看 | 99草视频| 五月天综合网站 | 成人网页在线免费观看 | 欧美色图亚洲图片 | 成人毛片在线观看视频 | 麻豆精品传媒视频 | 人交video另类hd | 三级小视频在线观看 | 9热精品 | 亚洲国产片色 | 丝袜av网站 | 免费av电影网站 | 五月天久久精品 | 成人a级黄色片 | 国产18精品乱码免费看 | 免费日韩一级片 | 国产免费又爽又刺激在线观看 | 草久在线播放 | 日本公妇色中文字幕 | 天天爽夜夜爽人人爽一区二区 | 国产一区二区视频在线播放 | 在线视频观看亚洲 | 久久免费av电影 | 综合网婷婷 | 久久久国产影院 | 久保带人| 91资源在线观看 | 99福利片 | 欧美91精品久久久久国产性生爱 | 欧美日韩高清一区二区 国产亚洲免费看 | 天天干天天上 | 精品国产一区二区三区免费 | 日韩在线观看高清 | 中文字幕文字幕一区二区 | 免费在线观看a v | 在线观看成人福利 | 日韩欧美综合视频 | www成人av | 国产黑丝一区二区三区 | 天天躁天天操 | 国产精品一区二区三区久久 | 国产精品视屏 | 92av视频 | 久久中文欧美 | 在线观看视频黄 | 精品视频久久久 | 99视频在线观看免费 | 免费在线观看视频一区 | 中文字幕av一区二区三区四区 | 国产精品永久在线 | 中文字幕在线免费看线人 | 日韩最新av| 91精品在线观看视频 | 国产3p视频 | 福利视频 | 国产黄色片在线 | 在线观看视频你懂 | 国产精品2区 | 亚洲日本国产精品 | 欧美a性| 久久69av| 亚洲精品国产精品99久久 | 蜜臀久久99精品久久久酒店新书 | 欧美成人黄色 | 91亚洲国产成人 | 亚洲精品美女久久久久 | 麻花豆传媒mv在线观看网站 | 国产精品va最新国产精品视频 | 久久九九国产精品 | 四虎影院在线观看av | 91影视成人 | 精品国产精品国产偷麻豆 | 国产在线黄 | 亚洲成年人在线播放 | 在线观看久草 | 手机av电影在线 | 最近中文字幕在线 | 国产不卡av在线播放 | 天天插天天狠天天透 | 成人小视频在线免费观看 | 日p视频 | 精品在线你懂的 | 天操夜夜操 | 亚洲欧洲美洲av | 久久爽久久爽久久av东京爽 | 人人干免费 | 黄色网www| 国产精品免费看久久久8精臀av | 亚洲午夜小视频 | 久久综合九色综合欧美就去吻 | 色婷婷亚洲婷婷 | 亚洲国产激情 | av在线精品| 六月色丁| 久久久黄色| 九九免费精品视频在线观看 | 日韩精品在线观看视频 | 97人人人 | 色婷婷影视 | 在线播放你懂 | 97超碰在| 91视频-88av| www.亚洲激情.com | 九九九在线观看 | 亚洲欧美在线观看视频 | 超碰免费公开 | 国产福利精品在线观看 | 黄色的视频网站 | 99理论片| 日韩免费在线视频观看 | 在线免费观看欧美日韩 | 国产亚洲婷婷 | 国产精品久久久久久久久毛片 | 久草视频在线新免费 | 国精产品一二三线999 | 亚洲天天综合网 | 国产一二区视频 | 一区二区三区免费网站 | 亚洲精品一区二区18漫画 | 国产高清精 | av在线官网| 国产精品女人久久久 | 日韩在线中文字幕 | 8x8x在线观看视频 | 欧美福利视频一区 | 丁香婷婷综合激情 | 97超级碰 |