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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JVM 面试题 87 题详解

發(fā)布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM 面试题 87 题详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 1、java中會存在內(nèi)存泄漏嗎,請簡單描述。
  • 2、64 位 JVM 中,int 的長度是多數(shù)?
  • 3、Serial 與 Parallel GC 之間的不同之處?
  • 4、32 位和 64 位的 JVM,int 類型變量的長度是多數(shù)?
  • 5、Java 中 WeakReference 與 SoftReference 的區(qū)別?
  • 6、JVM 選項 -XX:+UseCompressedOops 有什么作用?為什么要使用
  • 7、怎樣通過 Java 程序來判斷 JVM 是 32 位 還是 64位?
  • 8、32 位 JVM 和 64 位 JVM 的最大堆內(nèi)存分別是多數(shù)?
  • 9、JRE、JDK、JVM 及 JIT 之間有什么不同?
  • 10、解釋 Java 堆空間及 GC?
  • 11、JVM 內(nèi)存區(qū)域
  • 12、程序計數(shù)器(線程私有)
  • 13、虛擬機(jī)棧(線程私有)
  • 14、本地方法區(qū)(線程私有)
  • 15、你能保證 GC 執(zhí)行嗎?
  • 16、怎么獲取 Java 程序使用的內(nèi)存?堆使用的百分比?
  • 17、Java 中堆和棧有什么區(qū)別?
  • 18、描述一下 JVM 加載 class 文件的原理機(jī)制
  • 19、GC 是什么?為什么要有 GC?
  • 20、堆(Heap-線程共享) -運行時數(shù)據(jù)區(qū)
  • 21、方法區(qū)/永久代(線程共享)
  • 22、JVM 運行時內(nèi)存
  • 23、新生代
  • 24、老年代
  • 25、永久代
  • 26、JAVA8 與元數(shù)據(jù)
  • 27、引用計數(shù)法
  • 28、可達(dá)性分析
  • 29、標(biāo)記清除算法( Mark-Sweep)
  • 30、復(fù)制算法(copying)
  • 31、標(biāo)記整理算法(Mark-Compact)
  • 32、分代收集算法
  • 33、新生代與復(fù)制算法
  • 34、老年代與標(biāo)記復(fù)制算法
  • 35、JAVA 強(qiáng)引用
  • 36、JAVA軟引用
  • 37、JAVA弱引用
  • 38、JAVA虛引用
  • 39、分代收集算法
  • 40、在新生代-復(fù)制算法
  • 41、在老年代-標(biāo)記整理算法
  • 42、分區(qū)收集算法
  • 43、GC 垃圾收集器
  • 44、Serial 垃圾收集器(單線程、 復(fù)制算法)
  • 45、ParNew 垃圾收集器(Serial+多線程)
  • 46、Parallel Scavenge 收集器(多線程復(fù)制算法、高效)
  • 57、Serial Old 收集器(單線程標(biāo)記整理算法 )
  • 58、Parallel Old 收集器(多線程標(biāo)記整理算法)
  • 59、CMS 收集器(多線程標(biāo)記清除算法)
  • 60、G1 收集器
  • 61、JVM 類加載機(jī)制
  • 62、類加載器
  • 63、雙親委派
  • 64、OSGI( 動態(tài)模型系統(tǒng))
  • 65、動態(tài)改變構(gòu)造
  • 66、模塊化編程與熱插拔
  • 67、JVM內(nèi)存模型
  • 68、棧
  • 69、本地方法棧
  • 70、程序計數(shù)器
  • 71、堆
  • 72、方法區(qū)
  • 73、分代回收
  • 74、堆和棧的區(qū)別
  • 75、什么時候會觸發(fā)FullGC
  • 76、什么是Java虛擬機(jī)?為什么Java被稱作是“平臺無關(guān)的編程語言”?
  • 77、對象分配規(guī)則
  • 78、描述一下JVM加載class文件的原理機(jī)制?
  • 79、Java對象創(chuàng)建過程
  • 80、簡述Java的對象結(jié)構(gòu)
  • 81、如何判斷對象可以被回收
  • 82、JVM的永久代中會發(fā)生垃圾回收么
  • 83、垃圾收集算法
  • 84、調(diào)優(yōu)命令有哪些?
  • 85、調(diào)優(yōu)工具
  • 86、Minor GC與Full GC分別在什么時候發(fā)生?
  • 87、你知道哪些JVM性能調(diào)優(yōu)

1、java中會存在內(nèi)存泄漏嗎,請簡單描述。

會。自己實現(xiàn)堆載的數(shù)據(jù)結(jié)構(gòu)時有可能會出現(xiàn)內(nèi)存泄露,可參看e?ective java.

2、64 位 JVM 中,int 的長度是多數(shù)?

Java 中,int 類型變量的長度是一個固定值,與平臺無關(guān),都是 32 位。意思就是說,在 32 位 和 64 位 的 Java 虛擬機(jī)中,int 類型的長度是相同的。

3、Serial 與 Parallel GC 之間的不同之處?

Serial 與 Parallel 在 GC 執(zhí)行的時候都會引起 stop-the-world。它們之間主要不同 serial 收集器是默認(rèn)的復(fù)制收集器,執(zhí)行 GC 的時候只有一個線程,而parallel 收集器使用多個 GC 線程來執(zhí)行。

4、32 位和 64 位的 JVM,int 類型變量的長度是多數(shù)?

32 位和 64 位的 JVM 中,int 類型變量的長度是相同的,都是 32 位或者 4個字節(jié)。

5、Java 中 WeakReference 與 SoftReference 的區(qū)別?

雖然 WeakReference 與 SoftReference 都有利于提高 GC 和 內(nèi)存的效率,但是 WeakReference ,一旦失去最后一個強(qiáng)引用,就會被 GC回收,而軟引用雖然不能阻止被回收,但是可以延遲到 JVM 內(nèi)存不足的時候。

6、JVM 選項 -XX:+UseCompressedOops 有什么作用?為什么要使用

當(dāng)你將你的應(yīng)用從 32 位的 JVM 遷移到 64 位的 JVM 時,由于對象的指針從32 位增加到了 64 位,因此堆內(nèi)存會突然增加,差不多要翻倍。這也會對 CPU緩存(容量比內(nèi)存小很多)的數(shù)據(jù)產(chǎn)生不利的影響。因為,遷移到 64 位的 JVM主要動機(jī)在于可以指定最大堆大小,通過壓縮
OOP 可以節(jié)省一定的內(nèi)存。通過-XX:+UseCompressedOops 選項,JVM 會使用 32 位的 OOP,而不是 64 位的 OOP。

7、怎樣通過 Java 程序來判斷 JVM 是 32 位 還是 64位?

你可以檢查某些系統(tǒng)屬性如 sun.arch.data.model 或 os.arch 來獲取該信息。

8、32 位 JVM 和 64 位 JVM 的最大堆內(nèi)存分別是多數(shù)?

理論上說上 32 位的 JVM 堆內(nèi)存可以到達(dá) 2^32, 即 4GB,但實際上會比這個小很多。不同操作系統(tǒng)之間不同,如 Windows 系統(tǒng)大約 1.5GB,Solaris 大約3GB。64 位 JVM 允許指定最大的堆內(nèi)存,理論上可以達(dá)到 2^64,這是一個非常大的數(shù)字,實際上你可以指定堆內(nèi)存大小到 100GB。甚至有的 JVM,如 Azul,堆內(nèi)存到 1000G 都是可能的。

9、JRE、JDK、JVM 及 JIT 之間有什么不同?

JRE 代表 Java 運行時(Java run-time),是運行 Java 引用所必須的。JDK 代表 Java 開發(fā)工具(Java development kit),是 Java 程序的開發(fā)工具,如 Java編譯器,它也包含 JRE。JVM 代表 Java 虛擬機(jī)(Java virtual machine),它的責(zé)任是運行 Java 應(yīng)用。JIT 代表即時編譯(Just In Time compilation),當(dāng)代碼執(zhí)行的次數(shù)超過一定的閾值時,會將 Java 字節(jié)碼轉(zhuǎn)換為本地代碼,如,主要的熱點代碼會被準(zhǔn)換為本地代碼,這樣有利大幅度提高 Java 應(yīng)用的性能。

10、解釋 Java 堆空間及 GC?

當(dāng)通過 Java 命令啟動 Java 進(jìn)程的時候,會為它分配內(nèi)存。內(nèi)存的一部分用于創(chuàng)建堆空間,當(dāng)程序中創(chuàng)建對象的時候,就從對空間中分配內(nèi)存。GC 是 JVM 內(nèi)部的一個進(jìn)程,回收無效對象的內(nèi)存用于將來的分配。

11、JVM 內(nèi)存區(qū)域


JVM 內(nèi)存區(qū)域主要分為線程私有區(qū)域【程序計數(shù)器、虛擬機(jī)棧、本地方法區(qū)】、線程共享區(qū)域【JAVA 堆、方法區(qū)】、直接內(nèi)存。
線程私有數(shù)據(jù)區(qū)域生命周期與線程相同, 依賴用戶線程的啟動/結(jié)束 而 創(chuàng)建/銷毀(在 Hotspot VM 內(nèi), 每個線程都與操作系統(tǒng)的本地線程直接映射, 因此這部分內(nèi)存區(qū)域的存/否跟隨本地線程的生/死對應(yīng))。

線程共享區(qū)域隨虛擬機(jī)的啟動/關(guān)閉而創(chuàng)建/銷毀。
直接內(nèi)存并不是 JVM 運行時數(shù)據(jù)區(qū)的一部分, 但也會被頻繁的使用: 在 JDK 1.4 引入的 NIO 提供了基于 Channel 與 Bu?er 的 IO 方式, 它可以使用 Native 函數(shù)庫直接分配堆外內(nèi)存, 然后使用DirectByteBu?er 對象作為這塊內(nèi)存的引用進(jìn)行操作(詳見: Java I/O 擴(kuò)展), 這樣就避免了在 Java堆和 Native 堆中來回復(fù)制數(shù)據(jù), 因此在一些場景中可以顯著提高性能。

12、程序計數(shù)器(線程私有)

一塊較小的內(nèi)存空間, 是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,每條線程都要有一個獨立的程序計數(shù)器,這類內(nèi)存也稱為“線程私有” 的內(nèi)存。
正在執(zhí)行 java 方法的話,計數(shù)器記錄的是虛擬機(jī)字節(jié)碼指令的地址(當(dāng)前指令的地址) 。如果還是 Native 方法,則為空。這個內(nèi)存區(qū)域是唯一一個在虛擬機(jī)中沒有規(guī)定任何 OutOfMemoryError 情況的區(qū)域。

13、虛擬機(jī)棧(線程私有)

是描述java方法執(zhí)行的內(nèi)存模型,每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。 每一個方法從調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機(jī)棧中入棧到出棧的過程。
棧幀( Frame)是用來存儲數(shù)據(jù)和部分過程結(jié)果的數(shù)據(jù)結(jié)構(gòu),同時也被用來處理動態(tài)鏈接(Dynamic Linking)、 方法返回值和異常分派( Dispatch Exception)。 棧幀隨著方法調(diào)用而創(chuàng)建,隨著方法結(jié)束而銷毀——無論方法是正常完成還是異常完成(拋出了在方法內(nèi)未被捕獲的異常)都算作方法結(jié)束。

14、本地方法區(qū)(線程私有)

本地方法區(qū)和 Java Stack 作用類似, 區(qū)別是虛擬機(jī)棧為執(zhí)行 Java 方法服務(wù), 而本地方法棧則為Native 方法服務(wù), 如果一個 VM 實現(xiàn)使用 C-linkage 模型來支持 Native 調(diào)用, 那么該棧將會是一個C 棧,但 HotSpot VM 直接就把本地方法棧和虛擬機(jī)棧合二為一 。

15、你能保證 GC 執(zhí)行嗎?

不能,雖然你可以調(diào)用 System.gc() 或者 Runtime.gc(),但是沒有辦法保證 GC的執(zhí)行。

16、怎么獲取 Java 程序使用的內(nèi)存?堆使用的百分比?

可以通過 java.lang.Runtime 類中與內(nèi)存相關(guān)方法來獲取剩余的內(nèi)存,總內(nèi)存及最大堆內(nèi)存。通過這些方法你也可以獲取到堆使用的百分比及堆內(nèi)存的剩余空間。Runtime.freeMemory() 方法返回剩余空間的字節(jié)數(shù),Runtime.totalMemory()方法總內(nèi)存的字節(jié)數(shù),Runtime.maxMemory() 返回最大內(nèi)存的字節(jié)數(shù)。

17、Java 中堆和棧有什么區(qū)別?

JVM 中堆和棧屬于不同的內(nèi)存區(qū)域,使用目的也不同。棧常用于保存方法幀和局部變量,而對象總是在堆上分配。棧通常都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的所有線程共享。

18、描述一下 JVM 加載 class 文件的原理機(jī)制

JVM 中類的裝載是由類加載器(ClassLoader)和它的子類來實現(xiàn)的,Java 中的類加載器是一個重要的 Java 運行時系統(tǒng)組件,它負(fù)責(zé)在運行時查找和裝入類文件中的類。
由于 Java 的跨平臺性,經(jīng)過編譯的 Java 源程序并不是一個可執(zhí)行程序,而是一個或多個類文件。當(dāng) Java 程序需要使用某個類時,JVM 會確保這個類已經(jīng)被加載、連接(驗證、準(zhǔn)備和解析)和初始化。類的加載是指把類的.class 文件中的數(shù)據(jù)讀入到內(nèi)存中,通常是創(chuàng)建一個字節(jié)數(shù)組讀入.class 文件,然后產(chǎn)生與所加載類對應(yīng)
的 Class 對象。

加載完成后,Class 對象還不完整,所以此時的類還不可用。當(dāng)類被加載后就進(jìn)入連接階段,這一階段包括驗證、準(zhǔn)備(為靜態(tài)變量分配內(nèi)存并設(shè)置默認(rèn)的初始值)和解析(將符號引用替換為直接引用)三個步驟。最后 JVM 對
類進(jìn)行初始化,包括:1)如果類存在直接的父類并且這個類還沒有被初始化,那么就先初始化父類;2)如果類中存在初始化語句,就依次執(zhí)行這些初始化語句。
類的加載是由類加載器完成的,類加載器包括:根加載器(BootStrap)、擴(kuò)展加載器(Extension)、系統(tǒng)加載器(System)和用戶自定義類加載器(java.lang.ClassLoader 的子類)。

從 Java 2(JDK 1.2)開始,類加載過程采取了父親委托機(jī)制(PDM)。PDM 更好的保證了 Java 平臺的安全性,在該機(jī)制中,JVM 自帶的Bootstrap 是根加載器,其他的加載器都有且僅有一個父類加載器。類的加載首先請求父類加載器加載,父類加載器無能為力時才由其子類加載器自行加載。JVM 不會向 Java 程序提供對 Bootstrap 的引用。下面是關(guān)于幾個類
加載器的說明:

  • Bootstrap:一般用本地代碼實現(xiàn),負(fù)責(zé)加載 JVM 基礎(chǔ)核心類庫(rt.jar);
  • Extension:從 java.ext.dirs 系統(tǒng)屬性所指定的目錄中加載類庫,它的父加載器是 Bootstrap;
  • System:又叫應(yīng)用類加載器,其父類是 Extension。它是應(yīng)用最廣泛的類加載器。它從環(huán)境變量 classpath 或者系統(tǒng)屬性
    java.class.path 所指定的目錄中記載類,是用戶自定義加載器的默認(rèn)父加載器。
  • 19、GC 是什么?為什么要有 GC?

    GC 是垃 圾收 集的 意思 ,內(nèi)存 處理 是編 程人 員容 易出 現(xiàn)問 題的 地方 ,忘記 或者 錯誤的內(nèi) 存回 收會 導(dǎo)致 程序 或系 統(tǒng)的 不穩(wěn) 定甚 至崩 潰, Java 提供 的 GC 功能 可以 自動監(jiān)測 對象 是否 超過 作用 域從 而達(dá) 到自 動回 收內(nèi) 存的 目的 ,Java 語言 沒有 提供 釋放已分 配內(nèi)存的 顯示 操作 方法 。Java 程序 員不 用擔(dān) 心內(nèi) 存管 理, 因為 垃圾 收集 器會自動 進(jìn)行 管理 。要 請求 垃圾 收集 ,可 以調(diào) 用下 面的 方法 之一 :System.gc() 或Runtime.getRuntime().gc() ,但 JVM 可以 屏蔽 掉顯 示的 垃圾 回收 調(diào)用 。
    垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用的內(nèi)存。垃圾回收器通常是作為一個單獨的低優(yōu)先級的線程運行,不可預(yù)知的情況下對內(nèi)存堆中已經(jīng)死亡的或者長時間沒有使用的對象進(jìn)行清除和回收,程序員不能實時的調(diào)用垃圾回收器對某個對象或所有對象進(jìn)行垃圾回收。在 Java 誕生初期,垃圾回收是 Java最大的亮點之一,因為服務(wù)器端的編程需要有效的防止內(nèi)存泄露問題,然而時過境遷,如今 Java 的垃圾回收機(jī)制已經(jīng)成為被詬病的東。移動智能終端用戶通常覺得 iOS 的系統(tǒng)比 Android 系統(tǒng)有更好的用戶體驗,其中一個深層次的原因就在于 Android 系統(tǒng)中垃圾回收的不可預(yù)知性。

    20、堆(Heap-線程共享) -運行時數(shù)據(jù)區(qū)

    是被線程共享的一塊內(nèi)存區(qū)域, 創(chuàng)建的對象和數(shù)組都保存在 Java 堆內(nèi)存中,也是垃圾收集器進(jìn)行垃圾收集的最重要的內(nèi)存區(qū)域。 由于現(xiàn)代
    VM 采用分代收集算法, 因此 Java 堆從 GC 的角度還可以細(xì)分為: 新生代(Eden 區(qū)、 From Survivor 區(qū)和 To Survivor 區(qū))和老年代。

    21、方法區(qū)/永久代(線程共享)

    即我們常說的永久代(Permanent Generation), 用于存儲被 JVM 加載的類信息、 常量、 靜態(tài)變量、 即時編譯器編譯后的代碼等數(shù)據(jù). HotSpot VM把GC分代收集擴(kuò)展至方法區(qū), 即使用Java堆的永久代來實現(xiàn)方法區(qū), 這樣 HotSpot 的垃圾收集器就可以像管理 Java 堆一樣管理這部分內(nèi)存,而不必為方法區(qū)開發(fā)專門的內(nèi)存管理器(永久帶的內(nèi)存回收的主要目標(biāo)是針對常量池的回收和類型的卸載, 因此收益一般很小) 。

    運行時常量池(Runtime Constant Pool)是方法區(qū)的一部分。 Class 文件中除了有類的版本、字段、方法、接口等描述等信息外,還有一項信息是常量池 (Constant Pool Table),用于存放編譯期生成的各種字面量和符號引用,這部分內(nèi)容將在類加載后存放到方法區(qū)的運行時常量池中。 Java 虛擬機(jī)對 Class 文件的每一部分(自然也包括常量池)的格式都有嚴(yán)格的規(guī)定,每一個字節(jié)用于存儲哪種數(shù)據(jù)都必須符合規(guī)范上的要求,這樣才會被虛擬機(jī)認(rèn)可、裝載和執(zhí)行。

    22、JVM 運行時內(nèi)存

    Java 堆從 GC 的角度還可以細(xì)分為: 新生代(Eden 區(qū)、 From Survivor 區(qū)和 To Survivor 區(qū))和老年代。

    23、新生代

    是用來存放新生的對象。一般占據(jù)堆的 1/3 空間。由于頻繁創(chuàng)建對象,所以新生代會頻繁觸發(fā)MinorGC 進(jìn)行垃圾回收。新生代又分為 Eden區(qū)、 ServivorFrom、 ServivorTo 三個區(qū)。
    Eden 區(qū)
    Java 新對象的出生地(如果新創(chuàng)建的對象占用內(nèi)存很大,則直接分配到老年代)。當(dāng) Eden 區(qū)內(nèi)存不夠的時候就會觸發(fā) MinorGC,對新生代區(qū)進(jìn)行一次垃圾回收。
    ServivorFrom
    上一次 GC 的幸存者,作為這一次 GC 的被掃描者。
    ServivorTo
    保留了一次 MinorGC 過程中的幸存者。
    MinorGC 的過程(復(fù)制->清空->互換)
    MinorGC 采用復(fù)制算法。

  • eden、 servicorFrom 復(fù)制到 ServicorTo,年齡+1
    首先,把 Eden 和 ServivorFrom 區(qū)域中存活的對象復(fù)制到 ServicorTo 區(qū)域(如果有對象的年齡以及達(dá)到了老年的標(biāo)準(zhǔn),則賦值到老年代區(qū)),同時把這些對象的年齡+1(如果 ServicorTo 不夠位置了就放到老年區(qū));
  • 清空 eden、 servicorFrom
    然后,清空 Eden 和 ServicorFrom 中的對象;
  • ServicorTo 和 ServicorFrom 互換
    最后, ServicorTo 和 ServicorFrom 互換,原 ServicorTo 成為下一次 GC 時的 ServicorFrom區(qū)。
  • 24、老年代

    主要存放應(yīng)用程序中生命周期長的內(nèi)存對象。
    老年代的對象比較穩(wěn)定,所以 MajorGC 不會頻繁執(zhí)行。在進(jìn)行 MajorGC 前一般都先進(jìn)行了一次 MinorGC,使得有新生代的對象晉身入老年代,導(dǎo)致空間不夠用時才觸發(fā)。當(dāng)無法找到足夠大的連續(xù)空間分配給新創(chuàng)建的較大對象時也會提前觸發(fā)一次 MajorGC 進(jìn)行垃圾回收騰出空間。
    MajorGC 采用標(biāo)記清除算法:首先掃描一次所有老年代,標(biāo)記出存活的對象,然后回收沒有標(biāo)記的對象。 ajorGC 的耗時比較長,因為要掃描再回收。 MajorGC 會產(chǎn)生內(nèi)存碎片,為了減少內(nèi)存損耗,我們一般需要進(jìn)行合并或者標(biāo)記出來方便下次直接分配。當(dāng)老年代也滿了裝不下的時候,就會拋出 OOM(Out of Memory)異常。

    25、永久代

    指內(nèi)存的永久保存區(qū)域,主要存放 Class 和 Meta(元數(shù)據(jù))的信息,Class 在被加載的時候被放入永久區(qū)域, 它和和存放實例的區(qū)域不同,GC 不會在主程序運行期對永久區(qū)域進(jìn)行清理。所以這也導(dǎo)致了永久代的區(qū)域會隨著加載的 Class 的增多而脹滿,最終拋出 OOM 異常。

    26、JAVA8 與元數(shù)據(jù)

    在 Java8 中, 永久代已經(jīng)被移除,被一個稱為“元數(shù)據(jù)區(qū)”(元空間)的區(qū)域所取代。元空間的本質(zhì)和永久代類似,元空間與永久代之間最大的區(qū)別在于: 元空間并不在虛擬機(jī)中,而是使用本地內(nèi)存。因此,默認(rèn)情況下,元空間的大小僅受本地內(nèi)存限制。 類的元數(shù)據(jù)放入
    nativememory, 字符串池和類的靜態(tài)變量放入 java 堆中, 這樣可以加載多少類的元數(shù)據(jù)就不再由MaxPermSize 控制, 而由系統(tǒng)的實際可用空間來控制。

    27、引用計數(shù)法

    在 Java 中,引用和對象是有關(guān)聯(lián)的。如果要操作對象則必須用引用進(jìn)行。因此,很顯然一個簡單的辦法是通過引用計數(shù)來判斷一個對象是否可以回收。簡單說,即一個對象如果沒有任何與之關(guān)聯(lián)的引用, 即他們的引用計數(shù)都不為 0, 則說明對象不太可能再被用到,那么這個對象就是可回收對象。

    28、可達(dá)性分析

    為了解決引用計數(shù)法的循環(huán)引用問題, Java 使用了可達(dá)性分析的方法。通過一系列的“GC roots”對象作為起點搜索。如果在“GC roots”和一個對象之間沒有可達(dá)路徑,則稱該對象是不可達(dá)的。要注意的是,不可達(dá)對象不等價于可回收對象, 不可達(dá)對象變?yōu)榭苫厥諏ο笾辽僖?jīng)過兩次標(biāo)記過程。兩次標(biāo)記后仍然是可回收對象,則將面臨回收。

    29、標(biāo)記清除算法( Mark-Sweep)

    最基礎(chǔ)的垃圾回收算法,分為兩個階段,標(biāo)注和清除。標(biāo)記階段標(biāo)記出所有需要回收的對象,清除階段回收被標(biāo)記的對象所占用的空間。如

    從圖中我們就可以發(fā)現(xiàn),該算法最大的問題是內(nèi)存碎片化嚴(yán)重,后續(xù)可能發(fā)生大對象不能找到可利用空間的問題。

    30、復(fù)制算法(copying)

    為了解決 Mark-Sweep 算法內(nèi)存碎片化的缺陷而被提出的算法。按內(nèi)存容量將內(nèi)存劃分為等大小的兩塊。每次只使用其中一塊,當(dāng)這一塊內(nèi)存滿后將尚存活的對象復(fù)制到另一塊上去,把已使用的內(nèi)存清掉,如圖:

    這種算法雖然實現(xiàn)簡單,內(nèi)存效率高,不易產(chǎn)生碎片,但是最大的問題是可用內(nèi)存被壓縮到了原本的一半。且存活對象增多的話, Copying算法的效率會大大降低。

    31、標(biāo)記整理算法(Mark-Compact)

    結(jié)合了以上兩個算法,為了避免缺陷而提出。標(biāo)記階段和 Mark-Sweep 算法相同, 標(biāo)記后不是清理對象,而是將存活對象移向內(nèi)存的一端。然后清除端邊界外的對象。如圖:

    32、分代收集算法

    分代收集法是目前大部分 JVM 所采用的方法,其核心思想是根據(jù)對象存活的不同生命周期將內(nèi)存劃分為不同的域,一般情況下將 GC 堆劃分為老生代(Tenured/Old Generation)和新生代(YoungGeneration)。老生代的特點是每次垃圾回收時只有少量對象需要被回收,新生代的特點是每次垃圾回收時都有大量垃圾需要被回收,因此可以根據(jù)不同區(qū)域選擇不同的算法。

    33、新生代與復(fù)制算法

    目前大部分 JVM 的 GC 對于新生代都采取 Copying 算法,因為新生代中每次垃圾回收都要回收大部分對象,即要復(fù)制的操作比較少,但通常并不是按照 1: 1 來劃分新生代。一般將新生代劃分為一塊較大的 Eden 空間和兩個較小的 Survivor 空間(From Space, To Space),每次使用Eden 空間和其中的一塊 Survivor 空間,當(dāng)進(jìn)行回收時,將該兩塊空間中還存活的對象復(fù)制到另一塊 Survivor 空間中。

    34、老年代與標(biāo)記復(fù)制算法

    而老年代因為每次只回收少量對象,因而采用 Mark-Compact 算法。

  • JAVA 虛擬機(jī)提到過的處于方法區(qū)的永生代(Permanet Generation), 它用來存儲 class 類,常量,方法描述等。對永生代的回收主要包括廢棄常量和無用的類。
  • 對象的內(nèi)存分配主要在新生代的 Eden Space 和 Survivor Space 的 From Space(Survivor 目前存放對象的那一塊),少數(shù)情況會直接分配到老生代。
  • 當(dāng)新生代的 Eden Space 和 From Space 空間不足時就會發(fā)生一次 GC,進(jìn)行 GC 后, EdenSpace 和 From Space 區(qū)的存活對象會被挪到 To Space,然后將 Eden Space 和 FromSpace 進(jìn)行清理。
  • 如果 To Space 無法足夠存儲某個對象,則將這個對象存儲到老生代。
  • 在進(jìn)行 GC 后,使用的便是 Eden Space 和 To Space 了,如此反復(fù)循環(huán)。
  • 當(dāng)對象在 Survivor 區(qū)躲過一次 GC 后,其年齡就會+1。 默認(rèn)情況下年齡到達(dá) 15 的對象會被移到老生代中。
  • 35、JAVA 強(qiáng)引用

    在 Java 中最常見的就是強(qiáng)引用, 把一個對象賦給一個引用變量,這個引用變量就是一個強(qiáng)引用。當(dāng)一個對象被強(qiáng)引用變量引用時,它處于可達(dá)狀態(tài),它是不可能被垃圾回收機(jī)制回收的,即使該對象以后永遠(yuǎn)都不會被用到 JVM 也不會回收。因此強(qiáng)引用是造成 Java 內(nèi)存泄漏的主要原因之一。

    36、JAVA軟引用

    軟引用需要用 SoftReference 類來實現(xiàn),對于只有軟引用的對象來說,當(dāng)系統(tǒng)內(nèi)存足夠時它不會被回收,當(dāng)系統(tǒng)內(nèi)存空間不足時它會被回收。軟引用通常用在對內(nèi)存敏感的程序中。

    37、JAVA弱引用

    弱引用需要用 WeakReference 類來實現(xiàn),它比軟引用的生存期更短,對于只有弱引用的對象來說,只要垃圾回收機(jī)制一運行,不管 JVM 的內(nèi)存空間是否足夠,總會回收該對象占用的內(nèi)存。

    38、JAVA虛引用

    虛引用需要 PhantomReference 類來實現(xiàn),它不能單獨使用,必須和引用隊列聯(lián)合使用。 虛引用的主要作用是跟蹤對象被垃圾回收的狀態(tài)。

    39、分代收集算法

    當(dāng)前主流 VM 垃圾收集都采用”分代收集” (Generational Collection)算法, 這種算法會根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊, 如 JVM 中的 新生代、老年代、永久代, 這樣就可以根據(jù)各年代特點分別采用最適當(dāng)?shù)?GC 算法

    40、在新生代-復(fù)制算法

    每次垃圾收集都能發(fā)現(xiàn)大批對象已死, 只有少量存活. 因此選用復(fù)制算法, 只需要付出少量存活對象的復(fù)制成本就可以完成收集

    41、在老年代-標(biāo)記整理算法

    因為對象存活率高、沒有額外空間對它進(jìn)行分配擔(dān)保, 就必須采用“標(biāo)記—清理”或“標(biāo)記—整理” 算法來進(jìn)行回收, 不必進(jìn)行內(nèi)存復(fù)制, 且直接騰出空閑內(nèi)存。

    42、分區(qū)收集算法

    分區(qū)算法則將整個堆空間劃分為連續(xù)的不同小區(qū)間, 每個小區(qū)間獨立使用, 獨立回收. 這樣做的好處是可以控制一次回收多少個小區(qū)間 , 根據(jù)目標(biāo)停頓時間, 每次合理地回收若干個小區(qū)間(而不是整個堆), 從而減少一次 GC 所產(chǎn)生的停頓。

    43、GC 垃圾收集器

    Java 堆內(nèi)存被劃分為新生代和年老代兩部分,新生代主要使用復(fù)制和標(biāo)記-清除垃圾回收算法;年老代主要使用標(biāo)記-整理垃圾回收算法,因此 java 虛擬中針對新生代和年老代分別提供了多種不同的垃圾收集器, JDK1.6 中 Sun HotSpot 虛擬機(jī)的垃圾收集器如下:

    44、Serial 垃圾收集器(單線程、 復(fù)制算法)

    Serial(英文連續(xù)) 是最基本垃圾收集器,使用復(fù)制算法,曾經(jīng)是JDK1.3.1 之前新生代唯一的垃圾收集器。 Serial 是一個單線程的收集器, 它不但只會使用一個 CPU 或一條線程去完成垃圾收集工作,并且在進(jìn)行垃圾收集的同時,必須暫停其他所有的工作線程,直到垃圾收集結(jié)束。
    Serial 垃圾收集器雖然在收集垃圾過程中需要暫停所有其他的工作線程,但是它簡單高效,對于限定單個 CPU 環(huán)境來說,沒有線程交互的開銷,可以獲得最高的單線程垃圾收集效率,因此 Serial垃圾收集器依然是 java 虛擬機(jī)運行在 Client 模式下默認(rèn)的新生代垃圾收集器。

    45、ParNew 垃圾收集器(Serial+多線程)

    ParNew 垃圾收集器其實是 Serial 收集器的多線程版本,也使用復(fù)制算法,除了使用多線程進(jìn)行垃圾收集之外,其余的行為和 Serial 收集器完全一樣, ParNew 垃圾收集器在垃圾收集過程中同樣也要暫停所有其他的工作線程。
    ParNew 收集器默認(rèn)開啟和 CPU 數(shù)目相同的線程數(shù),可以通過-XX:ParallelGCThreads 參數(shù)來限制垃圾收集器的線程數(shù)。 【Parallel:平行的】
    ParNew 雖然是除了多線程外和Serial 收集器幾乎完全一樣,但是ParNew垃圾收集器是很多 java虛擬機(jī)運行在 Server 模式下新生代的默認(rèn)垃圾收集器。

    46、Parallel Scavenge 收集器(多線程復(fù)制算法、高效)

    Parallel Scavenge 收集器也是一個新生代垃圾收集器,同樣使用復(fù)制算法,也是一個多線程的垃圾收集器, 它重點關(guān)注的是程序達(dá)到一個可控制的吞吐量(Thoughput, CPU 用于運行用戶代碼的時間/CPU 總消耗時間,即吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間)),高吞吐量可以最高效率地利用 CPU 時間,盡快地完成程序的運算任務(wù),主要適用于在后臺運算而不需要太多交互的任務(wù)。 自適應(yīng)調(diào)節(jié)策略也是 ParallelScavenge 收集器與 ParNew 收集器的一個重要區(qū)別。

    57、Serial Old 收集器(單線程標(biāo)記整理算法 )

    Serial Old 是 Serial 垃圾收集器年老代版本,它同樣是個單線程的收集器,使用標(biāo)記-整理算法,這個收集器也主要是運行在 Client 默認(rèn)的
    java 虛擬機(jī)默認(rèn)的年老代垃圾收集器。在 Server 模式下,主要有兩個用途:

  • 在 JDK1.5 之前版本中與新生代的 Parallel Scavenge 收集器搭配使用。
  • 作為年老代中使用 CMS 收集器的后備垃圾收集方案。新生代 Serial 與年老代 Serial Old 搭配垃圾收集過程圖:

    新生代 Parallel Scavenge 收集器與 ParNew 收集器工作原理類似,都是多線程的收集器,都使用的是復(fù)制算法,在垃圾收集過程中都需要暫停所有的工作線程。新生代 ParallelScavenge/ParNew 與年老代 Serial Old 搭配垃圾收集過程圖:
  • 58、Parallel Old 收集器(多線程標(biāo)記整理算法)

    Parallel Old 收集器是Parallel Scavenge的年老代版本,使用多線程的標(biāo)記-整理算法,在 JDK1.6才開始提供。
    在 JDK1.6 之前,新生代使用 ParallelScavenge 收集器只能搭配年老代的 Serial Old 收集器,只能保證新生代的吞吐量優(yōu)先,無法保證整體的吞吐量, Parallel Old 正是為了在年老代同樣提供吞吐量優(yōu)先的垃圾收集器, 如果系統(tǒng)對吞吐量要求比較高,可以優(yōu)先考慮新生代Parallel Scavenge和年老代 Parallel Old 收集器的搭配策略。
    新生代 Parallel Scavenge 和年老代 Parallel Old 收集器搭配運行過程圖

    59、CMS 收集器(多線程標(biāo)記清除算法)

    Concurrent mark sweep(CMS)收集器是一種年老代垃圾收集器,其最主要目標(biāo)是獲取最短垃圾回收停頓時間, 和其他年老代使用標(biāo)記-整理算法不同,它使用多線程的標(biāo)記-清除算法。最短的垃圾收集停頓時間可以為交互比較高的程序提高用戶體驗。CMS 工作機(jī)制相比其他的垃圾收集器來說更復(fù)雜。整個過程分為以下 4 個階段:

    初始標(biāo)記
    只是標(biāo)記一下 GC Roots 能直接關(guān)聯(lián)的對象,速度很快,仍然需要暫停所有的工作線程。
    并發(fā)標(biāo)記
    進(jìn)行 GC Roots 跟蹤的過程,和用戶線程一起工作,不需要暫停工作線程。
    重新標(biāo)記
    為了修正在并發(fā)標(biāo)記期間,因用戶程序繼續(xù)運行而導(dǎo)致標(biāo)記產(chǎn)生變動的那一部分對象的標(biāo)記記錄,仍然需要暫停所有的工作線程。
    并發(fā)清除
    清除 GC Roots 不可達(dá)對象,和用戶線程一起工作,不需要暫停工作線程。由于耗時最長的并發(fā)標(biāo)記和并發(fā)清除過程中,垃圾收集線程可以和用戶現(xiàn)在一起并發(fā)工作, 所以總體上來看CMS 收集器的內(nèi)存回收和用戶線程是一起并發(fā)地執(zhí)行。CMS 收集器工作過程

    60、G1 收集器

    Garbage ?rst 垃圾收集器是目前垃圾收集器理論發(fā)展的最前沿成果,相比與 CMS 收集器, G1 收集器兩個最突出的改進(jìn)是:
    1.基于標(biāo)記-整理算法,不產(chǎn)生內(nèi)存碎片。
    2.可以非常精確控制停頓時間,在不犧牲吞吐量前提下,實現(xiàn)低停頓垃圾回收。G1 收集器避免全區(qū)域垃圾收集,它把堆內(nèi)存劃分為大小固定的幾個獨立區(qū)域,并且跟蹤這些區(qū)域的垃圾收集進(jìn)度,同時在后臺維護(hù)一個優(yōu)先級列表,每次根據(jù)所允許的收集時間, 優(yōu)先回收垃圾最多的區(qū)域。區(qū)域劃分和優(yōu)先級區(qū)域回收機(jī)制,確保 G1 收集器可以在有限時間獲得最高的垃圾收集效率

    61、JVM 類加載機(jī)制

    JVM 類加載機(jī)制分為五個部分:加載,驗證,準(zhǔn)備,解析,初始化,下面我們就分別來看一下這五個過程。

    加載
    加載是類加載過程中的一個階段, 這個階段會在內(nèi)存中生成一個代表這個類的 java.lang.Class 對象, 作為方法區(qū)這個類的各種數(shù)據(jù)的入口。注意這里不一定非得要從一個 Class 文件獲取,這里既可以從 ZIP 包中讀取(比如從 jar 包和 war 包中讀取),也可以在運行時計算生成(動態(tài)代理),也可以由其它文件生成(比如將 JSP 文件轉(zhuǎn)換成對應(yīng)的 Class 類)。
    驗證
    這一階段的主要目的是為了確保 Class 文件的字節(jié)流中包含的信息是否符合當(dāng)前虛擬機(jī)的要求,并且不會危害虛擬機(jī)自身的安全。
    準(zhǔn)備
    準(zhǔn)備階段是正式為類變量分配內(nèi)存并設(shè)置類變量的初始值階段,即在方法區(qū)中分配這些變量所使用的內(nèi)存空間。注意這里所說的初始值概念,比如一個類變量定義為:
    實際上變量 v 在準(zhǔn)備階段過后的初始值為 0 而不是 8080, 將 v 賦值為 8080 的 put static 指令是程序被編譯后, 存放于類構(gòu)造器方法之中。
    但是注意如果聲明為:public static ?nal int v = 8080;
    在編譯階段會為 v 生成 ConstantValue 屬性,在準(zhǔn)備階段虛擬機(jī)會根據(jù) ConstantValue 屬性將 v賦值為 8080。
    解析
    解析階段是指虛擬機(jī)將常量池中的符號引用替換為直接引用的過程。符號引用就是 class 文件中的:

    public static int v = 8080;

    實際上變量 v 在準(zhǔn)備階段過后的初始值為 0 而不是 8080, 將 v 賦值為 8080 的 put static 指令是程序被編譯后, 存放于類構(gòu)造器方法之中。但是注意如果聲明為:
    在編譯階段會為 v 生成 ConstantValue 屬性,在準(zhǔn)備階段虛擬機(jī)會根據(jù) ConstantValue 屬性將 v
    賦值為 8080。解析
    解析階段是指虛擬機(jī)將常量池中的符號引用替換為直接引用的過程。符號引用就是 class 文件中的:

    public static final int v = 8080;

    在編譯階段會為 v 生成 ConstantValue 屬性,在準(zhǔn)備階段虛擬機(jī)會根據(jù) ConstantValue 屬性將 v賦值為 8080。
    解析
    解析階段是指虛擬機(jī)將常量池中的符號引用替換為直接引用的過程。符號引用就是 class 文件中的:

  • CONSTANT_Class_info
  • CONSTANT_Field_info
  • CONSTANT_Method_info
    等類型的常量。
  • 符號引用
    符號引用與虛擬機(jī)實現(xiàn)的布局無關(guān), 引用的目標(biāo)并不一定要已經(jīng)加載到內(nèi)存中。 各種虛擬機(jī)實現(xiàn)的內(nèi)存布局可以各不相同,但是它們能接受的符號引用必須是一致的,因為符號引用的字面量形式明確定義在 Java 虛擬機(jī)規(guī)范的 Class 文件格式中。
    直接引用
    直接引用可以是指向目標(biāo)的指針,相對偏移量或是一個能間接定位到目標(biāo)的句柄。如果有了直接引用,那引用的目標(biāo)必定已經(jīng)在內(nèi)存中存在。
    初始化
    初始化階段是類加載最后一個階段,前面的類加載階段之后,除了在加載階段可以自定義類加載器以外,其它操作都由 JVM 主導(dǎo)。到了初始階段,才開始真正執(zhí)行類中定義的 Java 程序代碼。
    類構(gòu)造器
    初始化階段是執(zhí)行類構(gòu)造器方法的過程。 方法是由編譯器自動收集類中的類變量的賦值操作和靜態(tài)語句塊中的語句合并而成的。虛擬機(jī)會保證子方法執(zhí)行之前,父類的方法已經(jīng)執(zhí)行完畢, 如果一個類中沒有對靜態(tài)變量賦值也沒有靜態(tài)語句塊,那么編譯器可以不為這個類生成() 方法。注意以下幾種情況不會執(zhí)行類初始化:

  • 通過子類引用父類的靜態(tài)字段,只會觸發(fā)父類的初始化,而不會觸發(fā)子類的初始化。
  • 定義對象數(shù)組,不會觸發(fā)該類的初始化。
  • 常量在編譯期間會存入調(diào)用類的常量池中,本質(zhì)上并沒有直接引用定義常量的類,不會觸發(fā)定義常量所在的類。
  • 通過類名獲取 Class 對象,不會觸發(fā)類的初始化。
  • 通過 Class.forName 加載指定類時,如果指定參數(shù) initialize 為 false 時,也不會觸發(fā)類初始化,其實這個參數(shù)是告訴虛擬機(jī),是否要對類進(jìn)行初始化。
  • 通過 ClassLoader 默認(rèn)的 loadClass 方法,也不會觸發(fā)初始化動作。
  • 62、類加載器

    虛擬機(jī)設(shè)計團(tuán)隊把加載動作放到 JVM 外部實現(xiàn),以便讓應(yīng)用程序決定如何獲取所需的類, JVM 提供了 3 種類加載器:
    啟動類加載器(Bootstrap ClassLoader)
    負(fù)責(zé)加載 JAVA_HOME\lib 目錄中的, 或通過-Xbootclasspath 參數(shù)指定路徑中的, 且被虛擬機(jī)認(rèn)可(按文件名識別, 如 rt.jar) 的類。
    擴(kuò)展類加載器(Extension ClassLoader)
    負(fù)責(zé)加載 JAVA_HOME\lib\ext 目錄中的,或通過 java.ext.dirs 系統(tǒng)變量指定路徑中的類庫。
    應(yīng)用程序類加載器(Application ClassLoader):
    負(fù)責(zé)加載用戶路徑(classpath)上的類庫。JVM 通過雙親委派模型進(jìn)行類的加載, 當(dāng)然我們也可以通過繼承 java.lang.ClassLoader實現(xiàn)自定義的類加載器。

    63、雙親委派

    當(dāng)一個類收到了類加載請求,他首先不會嘗試自己去加載這個類,而是把這個請求委派給父類去完成,每一個層次類加載器都是如此,因此所有的加載請求都應(yīng)該傳送到啟動類加載其中,只有當(dāng)父類加載器反饋自己無法完成這個請求的時候(在它的加載路徑下沒有找到所需加載的Class), 子類加載器才會嘗試自己去加載。

    采用雙親委派的一個好處是比如加載位于 rt.jar 包中的類 java.lang.Object,不管是哪個加載器加載這個類,最終都是委托給頂層的啟動類加載器進(jìn)行加載,這樣就保證了使用不同的類加載器最終得到的都是同樣一個 Object 對象

    64、OSGI( 動態(tài)模型系統(tǒng))

    OSGi(Open Service Gateway Initiative),是面向 Java 的動態(tài)模型系統(tǒng),是 Java 動態(tài)化模塊化系統(tǒng)的一系列規(guī)范。

    65、動態(tài)改變構(gòu)造

    OSGi 服務(wù)平臺提供在多種網(wǎng)絡(luò)設(shè)備上無需重啟的動態(tài)改變構(gòu)造的功能。為了最小化耦合度和促使這些耦合度可管理, OSGi 技術(shù)提供一種面向服務(wù)的架構(gòu),它能使這些組件動態(tài)地發(fā)現(xiàn)對方。

    66、模塊化編程與熱插拔

    OSGi 旨在為實現(xiàn) Java 程序的模塊化編程提供基礎(chǔ)條件,基于 OSGi 的程序很可能可以實現(xiàn)模塊級的熱插拔功能,當(dāng)程序升級更新時,可以只停用、重新安裝然后啟動程序的其中一部分,這對企業(yè)級程序開發(fā)來說是非常具有誘惑力的特性。

    OSGi 描繪了一個很美好的模塊化開發(fā)目標(biāo),而且定義了實現(xiàn)這個目標(biāo)的所需要服務(wù)與架構(gòu),同時也有成熟的框架進(jìn)行實現(xiàn)支持。但并非所有的應(yīng)用都適合采用 OSGi 作為基礎(chǔ)架構(gòu),它在提供強(qiáng)大功能同時,也引入了額外的復(fù)雜度,因為它不遵守了類加載的雙親委托模型。

    67、JVM內(nèi)存模型

    線程獨占:棧,本地方法棧,程序計數(shù)器線程共享:堆,方法區(qū)

    68、棧

    又稱方法棧,線程私有的,線程執(zhí)行方法是都會創(chuàng)建一個棧陣,用來存儲局部變量表,操作棧,動態(tài)鏈接,方法 出口等信息.調(diào)用方法時執(zhí)行入棧,方法返回式執(zhí)行出棧.

    69、本地方法棧

    與棧類似,也是用來保存執(zhí)行方法的信息.執(zhí)行Java方法是使用棧,執(zhí)行Native方法時使用本地方法棧.

    70、程序計數(shù)器

    保存著當(dāng)前線程執(zhí)行的字節(jié)碼位置,每個線程工作時都有獨立的計數(shù)器,只為執(zhí)行Java方法服務(wù),執(zhí)行Native方法時,程序計數(shù)器為空.

    71、堆

    JVM內(nèi)存管理最大的一塊,對被線程共享,目的是存放對象的實例,幾乎所欲的對象實例都會放在這里,當(dāng)堆沒有可用空間時,會拋出OOM異常.根 據(jù)對象的存活周期不同,JVM把對象進(jìn)行分代管理,由垃圾回收器進(jìn)行垃圾的回收管理

    72、方法區(qū)

    又稱非堆區(qū),用于存儲已被虛擬機(jī)加載的類信息,常量,靜態(tài)變量,即時編譯器優(yōu)化后的代碼等數(shù)據(jù).1.7的永久代和1.8的元空間都是方法區(qū)的一種 實現(xiàn)。

    73、分代回收

    分代回收基于兩個事實:大部分對象很快就不使用了,還有一部分不會立即無用,但也不會持續(xù)很長時間

    年輕代->標(biāo)記-復(fù)制
    老年代->標(biāo)記-清除

    74、堆和棧的區(qū)別

    棧是運行時單位,代表著邏輯,內(nèi)含基本數(shù)據(jù)類型和堆中對象引用,所在區(qū)域連續(xù),沒有碎片;堆是存儲單位,代表著數(shù)據(jù),可被多個棧共享(包括成員中基本數(shù)據(jù)類型、引用和引用對象),所在區(qū)域不連續(xù),會有碎片。 1. 功能不同
    棧內(nèi)存用來存儲局部變量和方法調(diào)用,而堆內(nèi)存用來存儲Java中的對象。無論是成員變量,局部變量, 還是類變量,它們指向的對象都存儲在堆內(nèi)存中。
    2. 共享性不同
    棧內(nèi)存是線程私有的。
    堆內(nèi)存是所有線程共有的。
    3. 異常錯誤不同
    如果棧內(nèi)存或者堆內(nèi)存不足都會拋出異常。
    棧空間不足:java.lang.StackOverFlowError。堆空間不足:java.lang.OutOfMemoryError。
    4. 空間大小
    棧的空間大小遠(yuǎn)遠(yuǎn)小于堆的

    75、什么時候會觸發(fā)FullGC

    除直接調(diào)用System.gc外,觸發(fā)Full GC執(zhí)行的情況有如下四種。
    1.舊生代空間不足
    舊生代空間只有在新生代對象轉(zhuǎn)入及創(chuàng)建為大對象、大數(shù)組時才會出現(xiàn)不足的現(xiàn)象,當(dāng)執(zhí)行Full GC后空間仍然不足,則拋出如下錯誤:
    java.lang.OutOfMemoryError: Java heap space
    為避免以上兩種狀況引起的FullGC,調(diào)優(yōu)時應(yīng)盡量做到讓對象在Minor GC階段被回收、讓對象在新生代多存活一段時間及不要創(chuàng)建過大的對象及數(shù)組。
    2.Permanet Generation空間滿
    PermanetGeneration中存放的為一些class的信息等,當(dāng)系統(tǒng)中要加載的類、反射的類和調(diào)用的方法較多時,Permanet Generation
    可能會被占滿,在未配置為采用CMS GC的情況下會執(zhí)行Full GC。如果經(jīng)過Full GC仍然回收不了,那么JVM會拋出如下錯誤信息:
    java.lang.OutOfMemoryError: PermGen space
    為避免Perm Gen占滿造成Full GC現(xiàn)象,可采用的方法為增大Perm Gen空間或轉(zhuǎn)為使用CMS GC。
    3.CMS GC時出現(xiàn)promotion failed和concurrent mode failure
    對于采用CMS進(jìn)行舊生代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure兩種狀況,當(dāng)這兩種狀況出現(xiàn)時可能會觸發(fā)Full GC。
    promotionfailed是在進(jìn)行Minor GC時,survivor space放不下、對象只能放入舊生代,而此時舊生代也放不下造成的;concurrent mode failure是在執(zhí)行CMS GC的過程中同時有對象要放入舊生代,而此時舊生代空間不足造成的。
    應(yīng)對措施為:增大survivorspace、舊生代空間或調(diào)低觸發(fā)并發(fā)GC的比率,但在JDK 5.0+、6.0+的版本中有可能會由于JDK的bug29導(dǎo)致CMS在remark完畢后很久才觸發(fā)sweeping動作。對于這種狀況,可通過設(shè)置-XX:CMSMaxAbortablePrecleanTime=5(單位為ms)來避免。
    4.統(tǒng)計得到的Minor GC晉升到舊生代的平均大小大于舊生代的剩余空間
    這是一個較為復(fù)雜的觸發(fā)情況,Hotspot為了避免由于新生代對象晉升到舊生代導(dǎo)致舊生代空間不足的現(xiàn)象,在進(jìn)行Minor GC時,做了一個判斷,如果之前統(tǒng)計所得到的Minor GC晉升到舊生代的平均大小大于舊生代的剩余空間,那么就直接觸發(fā)Full GC。
    例如程序第一次觸發(fā)MinorGC后,有6MB的對象晉升到舊生代,那么當(dāng)下一次Minor GC發(fā)生時,首先檢查舊生代的剩余空間是否大于6MB,如果小于6MB,則執(zhí)行Full GC。
    當(dāng)新生代采用PSGC時,方式稍有不同,PS GC是在Minor GC后也會檢查,例如上面的例子中第一次Minor GC后,PS GC會檢查此時舊生代的剩余空間是否大于6MB,如小于,則觸發(fā)對舊生代的回收。除了以上4種狀況外,對于使用RMI來進(jìn)行RPC或管理的Sun JDK應(yīng)用而言,默認(rèn)情況下會一小時執(zhí)行一次Full GC。可通過在啟動時通過- java-Dsun.rmi.dgc.client.gcInterval=3600000來設(shè)置Full GC執(zhí)行的間隔時間或通過-XX:+ DisableExplicitGC來禁止RMI調(diào)用System.gc

    76、什么是Java虛擬機(jī)?為什么Java被稱作是“平臺無關(guān)的編程語言”?

    Java虛擬機(jī)是一個可以執(zhí)行Java字節(jié)碼的虛擬機(jī)進(jìn)程。Java源文件被編譯成能被Java虛擬機(jī)執(zhí)行的字節(jié)碼文件。 Java被設(shè)計成允許應(yīng)用程序可以運行在任意的平臺,而不需要程序員為每一個平臺單獨重寫或者是重新編譯。Java虛擬機(jī)讓這個變?yōu)榭赡?#xff0c;因為它知道底層硬件平臺的 指令長度和其他特性。

    77、對象分配規(guī)則

  • 對象優(yōu)先分配在Eden區(qū),如果Eden區(qū)沒有足夠的空間時,虛擬機(jī)執(zhí)行一次Minor GC。
  • 大對象直接進(jìn)入老年代(大對象是指需要大量連續(xù)內(nèi)存空間的對象)。這樣做的目的是避免在Eden區(qū)和兩個Survivor區(qū)之間發(fā)生大量的內(nèi)存拷貝(新生代采用復(fù)制算法收集內(nèi)存)。
  • 長期存活的對象進(jìn)入老年代。虛擬機(jī)為每個對象定義了一個年齡計數(shù)器,如果對象經(jīng)過了1次Minor GC那么對象會進(jìn)入Survivor區(qū),之后每經(jīng)過一次Minor GC那么對象的年齡加1,知道達(dá)到閥值對象進(jìn)入老年區(qū)。
  • 動態(tài)判斷對象的年齡。如果Survivor區(qū)中相同年齡的所有對象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對象可以直接進(jìn)入老年代。
  • 空間分配擔(dān)保。每次進(jìn)行Minor GC時,JVM會計算Survivor區(qū)移至老年區(qū)的對象的平均大小,如果這個值大于老年區(qū)的剩余值大小則進(jìn)行一次Full GC,如果小于檢查HandlePromotionFailure設(shè)置,如果true則只進(jìn)行Monitor GC,如果false則進(jìn)行Full GC
  • 78、描述一下JVM加載class文件的原理機(jī)制?

    JVM中類的裝載是由類加載器(ClassLoader)和它的子類來實現(xiàn)的,Java中的類加載器是一個重要的Java運行時系統(tǒng)組件,它負(fù)責(zé)在運行時 查找和裝入類文件中的類。

    由于Java的跨平臺性,經(jīng)過編譯的Java源程序并不是一個可執(zhí)行程序,而是一個或多個類文件。當(dāng)Java程序需要使用某個類時,JVM會確保 這個類已經(jīng)被加載、連接(驗證、準(zhǔn)備和解析)和初始化。
    類的加載是指把類的.class文件中的數(shù)據(jù)讀入到內(nèi)存中,通常是創(chuàng)建一個字節(jié)數(shù)組讀入.class文件,然后產(chǎn)生與所加載類對應(yīng)的Class對象。加載完成后,Class對象還不完整,所以此時的類還不可用。
    當(dāng)類被加載后就進(jìn)入連接階段,這一階段包括驗證、準(zhǔn)備(為靜態(tài)變量分配內(nèi)存并設(shè)置默認(rèn)的初始值)和解析(將符號引用替換為直接引用)三個步驟。最后JVM對類進(jìn)行初始化,
    包括:

  • 如果類存在直接的父類并且這個類還沒有被初始化,那么就先初始化父類;
  • 如果類中存在初始化語句,就依次執(zhí)行這些初始化語句。 類的加載是由類加載器完成的,類加載器包括:根加載器(BootStrap)、擴(kuò)展加載器(Extension)、系統(tǒng)加載器(System)和用戶自定義類加載器(java.lang.ClassLoader的子類)。
    從Java 2(JDK 1.2)開始,類加載過程采取了父親委托機(jī)制(PDM)。PDM更好的保證了Java平臺的安全性,在該機(jī)制中,JVM自帶的Bootstrap是根加載器,其他的加載器都有且僅有一個父類加載器。類的加載首先請求父類加載器加載,父類加載器無能為力時才由其子類加載器自行加載。JVM不會向Java程序提供對Bootstrap的引用。下面是關(guān)于幾個類加載器的說明
  • Bootstrap:一般用本地代碼實現(xiàn),負(fù)責(zé)加載JVM基礎(chǔ)核心類庫(rt.jar);
    Extension:從java.ext.dirs系統(tǒng)屬性所指定的目錄中加載類庫,它的父加載器是Bootstrap;
    System:又叫應(yīng)用類加載器,其父類是Extension。它是應(yīng)用最廣泛的類加載器。它從環(huán)境變量classpath或者系統(tǒng)屬性java.class.path所指定的目錄中記載類,是用戶自定義加載器的默認(rèn)父加載器。

    79、Java對象創(chuàng)建過程

  • JVM遇到一條新建對象的指令時首先去檢查這個指令的參數(shù)是否能在常量池中定義到一個類的符號引用。然后加載這個類(類加載過程在 后邊講) 2. 為對象分配內(nèi)存。一種辦法“指針碰撞”、一種辦法“空閑列表”,最終常用的辦法“本地線程緩沖分配(TLAB)”
  • 將除對象頭外的對象內(nèi)存空間初始化為0
  • 對對象頭進(jìn)行必要設(shè)置
  • 80、簡述Java的對象結(jié)構(gòu)

    Java對象由三個部分組成:對象頭、實例數(shù)據(jù)、對齊填充。
    對象頭由兩部分組成,第一部分存儲對象自身的運行時數(shù)據(jù):哈希碼、GC分代年齡、鎖標(biāo)識狀態(tài)、線程持有的鎖、偏向線程ID(一般占32/64 bit)。第二部分是指針類型,指向?qū)ο蟮念愒獢?shù)據(jù)類型(即對象代表哪個類)。如果是數(shù)組對象,則對象頭中還有一部分用來記錄數(shù)組長度。
    實例數(shù)據(jù)用來存儲對象真正的有效信息(包括父類繼承下來的和自己定義的) 對齊填充:JVM要求對象起始地址必須是8字節(jié)的整數(shù)倍(8字節(jié)對齊 )

    81、如何判斷對象可以被回收

    判斷對象是否存活一般有兩種方式:
    引用計數(shù):每個對象有一個引用計數(shù)屬性,新增一個引用時計數(shù)加1,引用釋放時計數(shù)減1,計數(shù)為0時可以回收。此方法簡單,無法解決對象相互循環(huán)引用的問題。
    可達(dá)性分析(Reachability Analysis):從GC Roots開始向下搜索,搜索所走過的路徑稱為引用鏈。當(dāng)一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的,不可達(dá)對象。

    82、JVM的永久代中會發(fā)生垃圾回收么

    垃圾回收不會發(fā)生在永久代,如果永久代滿了或者是超過了臨界值,會觸發(fā)完全垃圾回收(Full GC)。如果你仔細(xì)查看垃圾收集器的輸出信息,就會發(fā)現(xiàn)永久代也是被回收的。這就是為什么正確的永久代大小對避免Full GC是非常重要的原因。請參考下Java8:從永久代到元數(shù)據(jù)區(qū) (注:Java8中已經(jīng)移除了永久代,新加了一個叫做元數(shù)據(jù)區(qū)的native內(nèi)存區(qū))

    83、垃圾收集算法

    GC最基礎(chǔ)的算法有三種: 標(biāo)記 -清除算法、復(fù)制算法、標(biāo)記-壓縮算法,我們常用的垃圾回收器一般都采用分代收集算法。
    標(biāo)記 -清除算法,“標(biāo)記-清除”(Mark-Sweep)算法,如它的名字一樣,算法分為“標(biāo)記”和“清除”兩個階段:首先標(biāo)記出所有需要回收的對象,在標(biāo)記完成后統(tǒng)一回收掉所有被標(biāo)記的對象。
    復(fù)制算法,“復(fù)制”(Copying)的收集算法,它將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當(dāng)這一塊的內(nèi)存用完了,就將還存活著的對象復(fù)制到另外一塊上面,然后再把已使用過的內(nèi)存空間一次清理掉。
    標(biāo)記-壓縮算法,標(biāo)記過程仍然與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對可回收對象進(jìn)行清理,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內(nèi)存
    分代收集算法,“分代收集”(Generational Collection)算法,把Java堆分為新生代和老年代,這樣就可以根據(jù)各個年代的特點采用最適當(dāng)?shù)氖占惴?/p>

    84、調(diào)優(yōu)命令有哪些?

    Sun JDK監(jiān)控和故障處理命令有jps jstat jmap jhat jstack jinfo

  • jps,JVM Process Status Tool,顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機(jī)進(jìn)程。
  • jstat,JVM statistics Monitoring是用于監(jiān)視虛擬機(jī)運行時狀態(tài)信息的命令,它可以顯示出虛擬機(jī)進(jìn)程中的類裝載、內(nèi)存、垃圾收集、JIT編譯等運行數(shù)據(jù)。
  • jmap,JVM Memory Map命令用于生成heap dump文件
  • jhat,JVM Heap Analysis Tool命令是與jmap搭配使用,用來分析jmap生成的dump,jhat內(nèi)置了一個微型的HTTP/HTML服務(wù)器,生成dump的分析結(jié)果后,可以在瀏覽器中查看
  • jstack,用于生成java虛擬機(jī)當(dāng)前時刻的線程快照。
  • jinfo,JVM Con?guration info 這個命令作用是實時查看和調(diào)整虛擬機(jī)運行參數(shù)
  • 85、調(diào)優(yōu)工具

    常用調(diào)優(yōu)工具分為兩類,jdk自帶監(jiān)控工具:jconsole和jvisualvm,第三方有:MAT(Memory AnalyzerTool)、GChisto。

  • jconsole,Java Monitoring and Management Console是從java5開始,在JDK中自帶的java監(jiān)控和管理控制臺,用于對JVM中內(nèi)存, 線程和類等的監(jiān)控
  • jvisualvm,jdk自帶全能工具,可以分析內(nèi)存快照、線程快照;監(jiān)控內(nèi)存變化、GC變化等。
  • MAT,Memory Analyzer Tool,一個基于Eclipse的內(nèi)存分析工具,是一個快速、功能豐富的Javaheap分析工具,它可以幫助我們查找內(nèi)存泄漏和減少內(nèi)存消耗
  • GChisto,一款專業(yè)分析gc日志的工具
  • 86、Minor GC與Full GC分別在什么時候發(fā)生?

    新生代內(nèi)存不夠用時候發(fā)生MGC也叫YGC,JVM內(nèi)存不夠的時候發(fā)生FGC

    87、你知道哪些JVM性能調(diào)優(yōu)

    設(shè)定堆內(nèi)存大小
    -Xmx:堆內(nèi)存最大限制。
    設(shè)定新生代大小。 新生代不宜太小,否則會有大量對象涌入老年代
    -XX:NewSize:新生代大小
    -XX:NewRatio 新生代和老生代占比
    -XX:SurvivorRatio:伊甸園空間和幸存者空間的占比
    設(shè)定垃圾回收器 年輕代用 -XX:+UseParNewGC 年老代用-XX:+UseConcMarkSweepGC

    原文:https://www.cnblogs.com/chengxuyuanxiaoyang/p/13692997.html

    總結(jié)

    以上是生活随笔為你收集整理的JVM 面试题 87 题详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    欧美性猛片, | 天天操天天射天天爽 | av品善网 | 色综合欧洲 | 激情网站免费观看 | 操操操干干干 | 欧美激情第一区 | 亚洲精品视频免费在线观看 | av黄网站 | 欧美日韩国产高清视频 | 久久亚洲综合国产精品99麻豆的功能介绍 | 夜夜骑日日 | 日日天天 | 久久久久久99精品 | 色婷婷综合成人av | 久久久久国产精品免费网站 | 欧美久久电影 | 97理论片 | 97视频免费 | 91欧美国产| 欧美精品做受xxx性少妇 | 在线黄av | www久久 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 国产视频久久久 | 欧美精品久久久久久 | 中文字幕免费久久 | 人人cao| 国产精品欧美一区二区 | 久久久午夜电影 | 中文字幕中文字幕在线中文字幕三区 | 在线观看日韩一区 | 久久在线免费视频 | 成人免费色 | 中文字幕色在线视频 | 亚洲国产成人久久 | 激情欧美在线观看 | 免费在线精品视频 | 久久国产精品色av免费看 | 五月天婷婷丁香花 | 亚洲成人免费在线观看 | 91激情视频在线播放 | 成人观看视频 | www.夜色.com | 亚洲高清91 | 丰满少妇高潮在线观看 | 九九热免费在线视频 | 97超碰资源网 | 四虎天堂| 亚洲综合在线五月天 | 区一区二在线 | 日韩成人一级大片 | 亚洲资源在线 | 精品视频免费久久久看 | 超碰人人乐 | 国产精品美女毛片真酒店 | 欧美怡红院视频 | 欧美精品久久久久久久久久久 | 中文字幕一区二区三区四区 | 日本黄色一级电影 | free,性欧美| 欧美一区免费在线观看 | 精品久久91| 91精品小视频 | 欧美日本一区 | 波多野结衣视频一区二区 | 国产日韩精品一区二区三区在线 | 国产 在线 高清 精品 | 视频在线观看入口黄最新永久免费国产 | 在线观看中文字幕视频 | 天天操天天爽天天干 | 激情欧美在线观看 | 久久久99精品免费观看乱色 | 日韩视频免费看 | 毛片网在线 | 色综合天天干 | 99精品在线观看 | 亚洲经典视频在线观看 | 日韩在线视频看看 | 一区二区三区久久 | 久久婷婷网 | 欧美一区二区三区激情视频 | 欧美影院久久 | 天天综合导航 | 日韩高清国产精品 | 有码中文字幕 | 成人国产综合 | a级片在线播放 | 中文电影网 | 色全色在线资源网 | 国产精品11 | 精品不卡视频 | 九九精品毛片 | 91精品在线视频观看 | 992tv人人草 黄色国产区 | h网站免费在线观看 | 久久久天堂 | 狠狠干夜夜 | 久久伊人综合 | 亚洲码国产日韩欧美高潮在线播放 | 亚洲精品人人 | 很黄很黄的网站免费的 | 国产视频亚洲视频 | 婷婷中文字幕综合 | 国产伦理一区二区 | 国产成人黄色在线 | 久久精品www人人爽人人 | av国产在线观看 | 激情婷婷综合 | 激情电影影院 | 在线视频精品播放 | 久久久亚洲麻豆日韩精品一区三区 | 免费中文字幕 | 黄色网在线播放 | 天天摸天天弄 | 免费观看一级成人毛片 | 五月婷婷综合色拍 | 日韩av一区二区三区四区 | 激情综合国产 | 91黄色视屏 | 久久蜜臀av | 香蕉色综合 | 婷婷六月天天 | 精品欧美在线视频 | 狠狠干夜夜爱 | 久久久久久久久久久免费视频 | 国产高清在线观看av | 国产精品毛片 | 天天操天 | 色综合 久久精品 | 福利一区二区 | 中文字幕丝袜 | 国产亚洲精品久久19p | 高清在线一区 | 亚洲精品乱码久久久久久蜜桃动漫 | 国产不卡免费 | 亚洲国产成人高清精品 | 黄色免费在线视频 | 国内精品一区二区 | 黄色免费在线视频 | www.久草视频| 久草在线视频国产 | 国产99久久久国产精品成人免费 | 日韩影视精品 | 日本精油按摩3 | 中文字幕第| 久久久久久电影 | 日韩午夜电影院 | 日韩精品视频免费专区在线播放 | 最近中文字幕完整高清 | 草久久精品 | 亚洲v精品 | 中文 一区二区 | 国产亚州av | 五月天狠狠操 | 欧美伦理一区二区 | 国产福利一区在线观看 | 国产91九色视频 | 深夜国产在线 | 欧美福利网址 | 日韩美一区二区三区 | 97人人超| 91热这里只有精品 | 99精品在线 | 国产一区二区高清不卡 | 99久久精品国产一区二区成人 | 亚州国产精品视频 | 色综合网| 黄色三级免费 | 四虎影视8848aamm| 激情网第四色 | 97电影手机| 亚洲免费婷婷 | 久色 网| 在线看国产一区 | 久久免费福利视频 | 91tv国产成人福利 | 日韩首页 | 日本精品久久久久中文字幕5 | 久久精品视频网址 | 91在线超碰| 色伊人网 | 不卡的av在线播放 | 久热免费在线观看 | 亚洲国产婷婷 | 日韩三级成人 | 亚洲播放一区 | 国产高清在线免费 | 国产精品无av码在线观看 | 国语精品久久 | 日韩狠狠操 | 激情综合网在线观看 | 欧美一级大片在线观看 | 国产美女无遮挡永久免费 | 人成午夜视频 | 97久久精品午夜一区二区 | 中文字幕亚洲情99在线 | 91香蕉国产在线观看软件 | 久久久久亚洲精品成人网小说 | 国产电影黄色av | 亚洲一级国产 | 九九热视频在线免费观看 | 国产专区在线播放 | 国产成人综合精品 | 精品一区 在线 | 午夜色大片在线观看 | 综合久久婷婷 | 在线成人免费电影 | 久久精美视频 | 人人插人人做 | 久久99精品久久久久久 | 欧美日性视频 | 国产视频一区在线 | 日韩久久一区 | 夜夜爽夜夜操 | 91av原创 | 日韩免费观看av | 久久在线观看视频 | 丁香六月久久综合狠狠色 | 福利网址在线观看 | 亚洲天天综合 | 一区二区三区国产欧美 | 久久99精品国产 | 操老逼免费视频 | 蜜臀av性久久久久av蜜臀妖精 | 天堂资源在线观看视频 | 在线a人v观看视频 | 日韩午夜在线观看 | 久草在线视频精品 | 精品国精品自拍自在线 | 蜜臀一区二区三区精品免费视频 | 激情欧美日韩一区二区 | 在线观看爱爱视频 | 天天干夜夜夜 | 国内精品久久久久影院优 | 在线观看日韩国产 | 少妇高潮流白浆在线观看 | 韩国av免费观看 | 日韩av一区二区三区四区 | 国产精品毛片一区二区三区 | 在线观看一区二区视频 | 欧美亚洲xxx | av一级一片 | 99操视频| 日韩精品一区二区在线 | 亚洲欧洲成人 | 欧美精品久久久久久久久久久 | 中文字幕成人网 | 91网免费观看 | www91在线观看 | 国产精久久久久久久 | 国产一区二区在线影院 | 成人午夜久久 | 久久露脸国产精品 | 国产视频资源在线观看 | 日本三级久久久 | 98超碰人人 | 国产美女免费观看 | 国产999在线| 精品国产免费人成在线观看 | 免费视频 三区 | 天天天天天天操 | 97超级碰碰碰视频在线观看 | 亚洲综合爱 | 成人夜晚看av | 日韩不卡高清视频 | 欧美午夜剧场 | 精品久久久免费视频 | 九色琪琪久久综合网天天 | 国产精品视频久久久 | 五月开心色 | 国产精品不卡av | 久久久免费电影 | 精品99久久久久久 | 中文字幕丝袜美腿 | 成人毛片久久 | 高清国产午夜精品久久久久久 | 亚洲一本视频 | 国产高清日韩欧美 | 国产一级片播放 | 国产精品免费观看国产网曝瓜 | 日韩欧美一区二区不卡 | 激情开心色| 欧美三级在线播放 | 黄色一级在线免费观看 | 亚洲v欧美v国产v在线观看 | 久久久久久伊人 | 在线观看视频黄色 | 精品一区二区三区四区在线 | 精品99免费视频 | 伊人春色电影网 | 日韩一级网站 | 久草久草在线 | 午夜久久久久久久久 | 亚洲 欧洲 国产 精品 | 国产精品久久久一区二区三区网站 | 人人爽影院 | av中文在线影视 | 欧美资源| 欧美成人黄色片 | 久久婷婷精品视频 | 国产在线欧美在线 | 黄色精品一区 | 亚洲在线黄色 | 麻豆国产精品视频 | 久久久久免费精品国产 | 特级a老妇做爰全过程 | 88av网站| 91人人在线| 伊人婷婷激情 | 精品伊人久久久 | 婷婷播播网| 久久女教师| 黄色一区三区 | 久久少妇免费视频 | 亚洲在线免费视频 | 波多野结衣视频在线 | 亚洲国产成人在线 | 久久视频免费在线 | 国产高清黄色 | 99热这里有精品 | 国产伦理久久精品久久久久_ | 成人免费视频网站 | 日日骑 | 久久久久久久久精 | 亚洲高清免费在线 | av一级在线 | 亚洲欧洲精品在线 | 色网站在线观看 | 亚洲午夜久久久久久久久电影网 | 天天爽夜夜爽精品视频婷婷 | 国产中文a | 97麻豆视频 | 国产麻豆精品久久一二三 | 婷婷综合在线 | 日本三级在线观看中文字 | 在线观看一区二区视频 | 天天色欧美 | 狠狠色狠狠色综合日日小说 | 国产精品欧美激情在线观看 | 91九色国产在线 | av资源中文字幕 | 国产在线理论片 | 在线视频电影 | 一区二区三区在线观看中文字幕 | 亚洲精品国偷拍自产在线观看蜜桃 | 超碰九九 | 少妇bbb搡bbbb搡bbbb′ | 一级黄色片在线观看 | 99性视频 | 中文字幕韩在线第一页 | 亚洲免费小视频 | 99r在线观看| 欧洲亚洲女同hd | 久久免费大片 | 999成人免费视频 | 日韩一二区在线 | 国产精品免费大片视频 | 新版资源中文在线观看 | 久久av观看 | 国产精品久久久久久久久久免费看 | 天天操天天射天天爱 | 国产精品九九视频 | 日韩丝袜视频 | 啪啪动态视频 | www.伊人色.com| 91中文字幕视频 | 婷婷久久综合九色综合 | 丝袜+亚洲+另类+欧美+变态 | 在线亚洲成人 | 国产伦精品一区二区三区免费 | 国产精品门事件 | 91正在播放 | 97色视频在线 | 久久黄色小说视频 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 激情欧美在线观看 | 国产精品麻豆欧美日韩ww | 四虎www| 国产在线视频一区二区 | 亚洲国产精品成人av | 欧美在线18| 亚洲精品三级 | 日本爱爱片| 亚洲一级二级 | 91麻豆精品国产自产在线游戏 | 顶级欧美色妇4khd | 九九久久电影 | 免费精品人在线二线三线 | 青青草国产精品视频 | www91在线观看 | 亚洲永久精品在线 | 精品国产伦一区二区三区免费 | 日韩欧美视频在线观看免费 | 91探花视频| 国内99视频 | 欧美日韩一区二区视频在线观看 | 国产精品99久久久 | 久久久久久久久久久久久国产精品 | 欧美日韩视频一区二区三区 | 福利视频导航网址 | 久久成| 久久久久久久综合色一本 | 日韩爱爱网站 | 天天综合视频在线观看 | 91视频观看免费 | 国产亚州精品视频 | 国产99久久久国产精品免费二区 | 午夜色性片 | 五月花激情 | 久久深夜 | 在线观看av中文字幕 | 欧美另类xxxxx | 蜜桃传媒一区二区 | 欧美日韩国产二区三区 | 人人爽人人爽人人爽 | 精品国产123| 亚洲欧美在线观看视频 | 在线观看中文字幕网站 | 成人国产精品久久久春色 | 日韩剧情| 国产涩涩网站 | 日本免费久久高清视频 | 免费看高清毛片 | 国产高清免费在线观看 | 嫩草伊人久久精品少妇av | 久久综合久久久久88 | 天天做日日做天天爽视频免费 | 亚洲男男gaygay无套 | 亚洲精品在线一区二区三区 | 国产成人福利在线 | 午夜精品一区二区三区可下载 | 色偷偷网站视频 | 午夜久久影视 | 一区二区男女 | 久艹视频在线观看 | 日韩欧美高清 | 色视频在线看 | 香蕉91视频 | 国产精品久久久久影院 | 男女视频久久久 | 成人一区二区三区中文字幕 | 日韩手机视频 | 国产精品中文字幕av | 国产中文字幕三区 | 开心婷婷色 | 久久最新网址 | 日韩av视屏 | 亚洲欧美成人综合 | 国内99视频 | 九色视频网| 欧美激情综合五月色丁香 | www.神马久久 | 久久你懂的 | 黄色精品一区二区 | 草久久精品 | 亚洲第二色 | 久久久久欠精品国产毛片国产毛生 | 99久久精品国产观看 | 国产精品久久久久久超碰 | 久久国产精品一区二区 | 日批网站免费观看 | 国产精品视频一二三 | 欧美一区二视频在线免费观看 | 亚洲精品国产综合99久久夜夜嗨 | 国产精品9999久久久久仙踪林 | www.狠狠操.com | 操碰av | 97国产在线观看 | 久草.com| 草久在线观看 | 亚洲国产69 | 国产日韩欧美中文 | 97小视频| 亚洲精品中文在线 | 亚洲综合色站 | www免费黄色 | 一区二区高清在线 | 99视频一区 | 97精品国产aⅴ | 欧美日韩后| 日日操天天操夜夜操 | 狠狠干成人综合网 | 日韩成人在线免费观看 | 国产99久久99热这里精品5 | 91中文字幕永久在线 | 国产毛片久久 | 西西人体www444| 国产不卡视频在线播放 | 免费色视频网址 | av在线播放中文字幕 | 麻豆成人精品视频 | 天天操操| 免费av大全 | 99精品国产福利在线观看免费 | 最新色站 | av天天澡天天爽天天av | 精品国产一区二 | 久久深夜| 国产精品美乳一区二区免费 | 国产a视频免费观看 | 69国产精品视频免费观看 | 91免费国产在线观看 | 久久精品99久久久久久2456 | 国产精品高| 欧美午夜精品久久久久久浪潮 | 欧美日韩不卡一区二区三区 | 欧美日本不卡视频 | 精品国产自在精品国产精野外直播 | 国产高清小视频 | 99视频在线免费看 | 久久免视频 | 九九视频网站 | 久久99热这里只有精品国产 | 久久看毛片 | 92国产精品久久久久首页 | 西西4444www大胆艺术 | 亚洲精品免费观看视频 | 天堂av免费在线 | 狠狠色婷婷丁香六月 | 日韩超碰| 青春草免费在线视频 | 婷婷丁香激情 | 91在线porny国产在线看 | 中文字幕资源网 国产 | 国产精品久久久久久久久久久久午夜 | 国产精品99久久久久人中文网介绍 | 国产精品久久久久久久久久久免费看 | 成人黄色小说视频 | 国际精品久久久 | 五月天久久激情 | av在线超碰 | 日韩伦理一区二区三区av在线 | 国产人成看黄久久久久久久久 | 国产麻豆成人传媒免费观看 | 欧美二区在线播放 | 毛片3 | 亚洲精品国产精品乱码在线观看 | 午夜精品久久久久久久99热影院 | 精品国产乱码久久久久久久 | 久久久午夜精品理论片中文字幕 | 国产大尺度视频 | 最近高清中文在线字幕在线观看 | 国产麻豆传媒 | 日本精品中文字幕 | 国产精久久久久久久 | 999国内精品永久免费视频 | 国产黄色视 | 日韩精品一区二区电影 | 亚洲成av片人久久久 | 国产精品99蜜臀久久不卡二区 | 永久免费观看视频 | 天天天色综合a | 亚洲专区视频在线观看 | 一二三区av| 91探花国产综合在线精品 | 午夜精品久久久久久久99婷婷 | 国产91精品在线播放 | 99久久国产免费,99久久国产免费大片 | 热久久99这里有精品 | 日韩理论电影网 | 久久99精品久久只有精品 | 91网页版在线观看 | 中文字幕在线视频国产 | 亚洲国产人午在线一二区 | 免费高清在线视频一区· | av免费在线观看1 | 国产精品第一页在线观看 | 国产精品观看在线亚洲人成网 | 中文字幕国语官网在线视频 | 天堂入口网站 | 狠狠干.com | 又黄又刺激视频 | 日韩欧美一区二区三区在线 | 成人日批视频 | 丁香色天天 | 美女视频久久黄 | 最近高清中文字幕 | 中文字幕人成乱码在线观看 | 一级淫片在线观看 | 一二三区视频在线 | 91完整视频| 久久精品国产一区 | 国产男女免费完整视频 | 夜夜澡人模人人添人人看 | 久久精品免费 | 中文字幕电影高清在线观看 | 中字幕视频在线永久在线观看免费 | 亚洲高清91 | 久草免费在线观看视频 | 久青草影院 | 能在线观看的日韩av | 超薄丝袜一二三区 | 在线观看一级 | 中文字幕亚洲精品在线观看 | 亚洲精品视频一二三 | 国产中文在线视频 | 国产 视频 久久 | 久久国产精品久久精品国产演员表 | 探花视频免费观看高清视频 | 91看片在线免费观看 | 国产va饥渴难耐女保洁员在线观看 | 久久精彩| 波多野结衣最新 | 狠狠躁日日躁夜夜躁av | 中文字幕在线播放第一页 | 91女子私密保健养生少妇 | 日本在线免费看 | 久久综合九色综合97婷婷女人 | 国产高清永久免费 | 欧美 日韩 国产 成人 在线 | 国产免费一区二区三区最新6 | 91久久久国产精品 | 国产片免费在线观看视频 | 欧美成人精品三级在线观看播放 | 久久精品精品电影网 | 在线免费国产视频 | 亚洲精品看片 | 国产亚洲一级高清 | 国产h在线观看 | 黄色毛片视频免费 | 婷婷视频在线 | 欧美热久久 | 久久精品一区二区 | 亚洲一级理论片 | 日韩av午夜在线观看 | 精品免费久久久久 | 国产在线观看一 | 久久精品一区八戒影视 | 99这里只有久久精品视频 | av成人动漫在线观看 | www.久草视频 | а天堂中文最新一区二区三区 | 成人污视频在线观看 | 91视频网址入口 | 国产精品久久久久久一二三四五 | 国内精品久久久久久久久久 | 国产精品18videosex性欧美 | 国产做a爱一级久久 | 99久久久国产精品免费99 | 国产亚洲精品女人久久久久久 | 日韩欧美高清免费 | 91插插插网站 | av福利超碰网站 | 麻豆免费在线视频 | 久久久电影 | 国产人免费人成免费视频 | 色婷婷啪啪免费在线电影观看 | 国产精品一区免费看8c0m | va视频在线观看 | 天天超碰 | 久久久久久久久久福利 | 久久久亚洲电影 | 国产久草在线观看 | 特黄色大片 | 欧美一级特黄aaaaaa大片在线观看 | 女人18精品一区二区三区 | 超碰在线最新地址 | 美女视频黄色免费 | 久久人人爽人人爽人人片 | 久草精品网 | 国产一区二区在线免费视频 | 国产福利午夜 | 亚洲高清av | 亚洲精品网址在线观看 | 999成人国产 | 青青草在久久免费久久免费 | 日韩精品视频免费专区在线播放 | 91久久久久久国产精品 | 黄色a视频免费 | 亚洲欧美在线综合 | 欧美aaa一级 | 日韩美av在线 | 久久第四色 | 国语对白少妇爽91 | 国内视频1区| 美女视频黄的免费的 | 日韩欧美不卡 | 欧美污在线观看 | 国产精品久久网站 | 六月丁香激情综合色啪小说 | 天天操天天曰 | 日本黄网站 | 日韩a级黄色片 | 国产精品 中文字幕 亚洲 欧美 | 久久久久久久18 | 欧美日韩视频在线观看免费 | 中文字幕日韩国产 | 国产剧情在线一区 | 久久久久久久久久久网站 | 青青草国产在线 | 亚洲国产精品va在线看黑人 | 九九久久免费 | 91麻豆网| 激情开心站 | 欧美少妇bbwhd| 亚洲视频在线看 | 久草网视频 | 亚洲在线高清 | 欧美在线视频免费 | 国产伦精品一区二区三区免费 | 国产一区二区三区四区大秀 | 国产天天综合 | 成人免费视频播放 | 91精品国产九九九久久久亚洲 | 91精品国产九九九久久久亚洲 | 91专区在线观看 | 欧美成人精品三级在线观看播放 | 久久伦理电影 | 操久 | 国产中文字幕视频在线观看 | 蜜臀av性久久久久av蜜臀妖精 | 黄色免费网站大全 | 国产小视频你懂的 | 国产裸体永久免费视频网站 | 久久久九九| 五月情婷婷| 日本黄色免费电影网站 | 日韩 国产 | 欧美资源在线观看 | 欧美 日韩 性| www.天天操.com | 色婷婷久久久综合中文字幕 | 一区二区视频在线免费观看 | 中文字幕网站视频在线 | 日韩免费福利 | 国产小视频在线播放 | 在线观看片 | 久久久久一区 | 久久久久免费看 | 久久精品第一页 | 九9热这里真品2 | 国内精品久久久久影院一蜜桃 | 天天看天天干天天操 | 在线观看日韩中文字幕 | 亚洲精品自拍视频在线观看 | 91黄色免费网站 | 久久尤物电影视频在线观看 | 狠狠久久综合 | 国产精品黄色影片导航在线观看 | 亚洲激情综合网 | 中文字幕视频免费观看 | 五月婷婷操 | 色丁香久久 | 色网站在线 | 在线中文字幕视频 | 欧美一级艳片视频免费观看 | 日韩网站一区二区 | 欧美 激情在线 | 免费成人在线观看视频 | 天天拍夜夜拍 | 国产黑丝袜在线 | 亚洲精品国产综合99久久夜夜嗨 | av专区在线 | 国产精品理论视频 | 9幺看片 | 91在线产啪 | .国产精品成人自产拍在线观看6 | 国产精品成人一区二区三区 | www九九热 | 国产日韩精品一区二区在线观看播放 | 亚洲激情在线 | 国产精品第72页 | 午夜黄色影院 | 在线观看亚洲专区 | 97香蕉久久超级碰碰高清版 | 日韩欧美在线综合网 | 亚洲影视资源 | 五月激情六月丁香 | 韩日精品视频 | 日韩久久久久久久久 | 中文字幕色婷婷在线视频 | 91福利视频免费观看 | 在线视频 精品 | 天天干天天操天天 | 国产一级黄色av | 日韩av一区二区在线播放 | 十八岁以下禁止观看的1000个网站 | 激情综合站 | 91日韩精品一区 | 色偷偷88888欧美精品久久久 | 在线播放 一区 | 欧洲一区二区三区精品 | 中文字幕在线免费观看视频 | 午夜精品视频在线 | 亚洲综合涩 | 亚洲精品日韩在线观看 | 欧美日韩视频在线一区 | 91视频久久久久久 | 亚洲精品国产精品国产 | 狠狠色丁香婷婷综合视频 | 婷婷午夜天 | 最新免费av在线 | 中文国产字幕 | 啪嗒啪嗒免费观看完整版 | 亚洲欧美一区二区三区孕妇写真 | 日韩高清免费在线 | 婷婷伊人综合亚洲综合网 | 日韩精品电影在线播放 | av免费观看高清 | 公开超碰在线 | 成人午夜网 | av一区二区在线观看中文字幕 | 国产精品久久久久一区二区国产 | 91最新地址永久入口 | 欧美另类tv | 欧美日韩破处 | 99精品久久久久 | 91网址在线观看 | 91精品999 | 草免费视频 | 久久久国产一区二区三区四区小说 | 国产在线观看高清视频 | 国产亚洲情侣一区二区无 | 国产精品一区二区果冻传媒 | 亚洲夜夜网 | 国产精品av免费 | 久草免费资源 | 国产久视频 | 天天干人人插 | 97视频在线观看视频免费视频 | 欧美一级久久久 | 国产日韩视频在线 | 国产精品一区二区三区电影 | 日韩在线观看网站 | 97碰碰精品嫩模在线播放 | 日韩色在线 | 欧美一级日韩三级 | 伊人狠狠色 | 夜夜爽夜夜操 | 久久综合九色综合欧美狠狠 | 丝袜美女视频网站 | 97超碰人人澡 | 精品一区二区影视 | 免费a网址 | 97国产人人| 69精品 | 亚欧日韩av | 中文字幕在线观看免费高清电影 | 97超碰香蕉| 国产精品一区二区吃奶在线观看 | 99久久免费看 | 国产精品系列在线观看 | 精品美女在线视频 | 在线直播av | 六月色| 久久九九影视网 | 久久久国产影视 | 精品国产1区2区3区 国产欧美精品在线观看 | 免费在线观看av电影 | 国产无区一区二区三麻豆 | 国产一区欧美一区 | 国产99区 | 精品国产美女 | 日本中文字幕在线播放 | 国产一区二区免费 | 精品专区一区二区 | 国产精品综合av一区二区国产馆 | 日韩精品免费一区二区在线观看 | www.久久视频 | 人人澡人 | 日韩欧美综合在线视频 | 一区二区 不卡 | 色中色亚洲| 伊人网站| 亚洲黄色成人 | 久久久免费观看 | 精品伦理一区二区三区 | 国产黄色理论片 | 免费大片黄在线 | 亚洲高清视频在线 | 日韩精品不卡在线 | 久久视频网址 | 久久电影色| 人人舔人人爽 | 亚州精品在线视频 | 亚洲成人午夜在线 | 亚洲精品久久激情国产片 | 亚洲在线免费视频 | 久久成人18免费网站 | 日日夜日日干 | 91久久久久久久一区二区 | 日本公妇色中文字幕 | 日韩av中文在线观看 | 日韩精品中文字幕在线不卡尤物 | 成人性生交大片免费看中文网站 | av中文电影 | 国产精品1区2区在线观看 | 亚洲天堂色婷婷 | 一区精品在线 | 99在线高清视频在线播放 | 婷婷国产v亚洲v欧美久久 | 日本精品一区二区三区在线播放视频 | 日本公乱妇视频 | 久久另类视频 | 97人人精品 | 中文字幕资源站 | 国产午夜在线 | 日韩在线视频线视频免费网站 | 欧美老人xxxx18 | 国产一区视频免费在线观看 | 中文一区在线 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 精品一二 | 亚洲国产高清在线观看视频 | 久久这里只有精品23 | 免费看成人| 国产精品久久麻豆 | 久久激情视频 久久 | 毛片网站免费 | 2023av在线 | 欧美激情视频一区二区三区免费 | 国产精品免费不卡 | 中国一级片在线观看 | 91九色视频在线观看 | 国产精品1区2区3区 久久免费视频7 | 看av免费 | 久久久www成人免费精品 | 区一区二区三在线观看 | 成人在线观看免费 | 成人在线免费看 | 又黄又网站 | 麻豆视频免费看 | 中文字幕在线不卡国产视频 | 亚洲综合色视频在线观看 | 日韩黄色免费 | 国产a高清 | 超碰最新网址 | 亚洲专区免费观看 | 国产精品美女久久久免费 | 亚洲欧洲av在线 | 一区二区激情 | 成人h在线 | 久草视频手机在线 | 四虎海外影库www4hu | 91精品国产一区 | 狠日日| 69久久久久久久 | a视频免费在线观看 | 国产精品免费久久久久久久久久中文 | 99这里只有久久精品视频 | 国产日产精品久久久久快鸭 | 51久久夜色精品国产麻豆 | 欧美三人交| 精品久久久一区二区 | 免费在线观看成人av | 国产精品福利小视频 | 日本高清中文字幕有码在线 | 日韩av男人的天堂 | 久久综合久久综合这里只有精品 | 国产精品视频区 | 亚洲欧美乱综合图片区小说区 | 国产在线小视频 | 中文字幕国产一区二区 | 久久免费大片 | 欧美肥妇free | 日韩电影在线观看一区二区三区 | 国产日韩在线一区 | 久久99最新地址 | 天天做天天干 | 日韩高清黄色 | 国产色女人 | 国产一区二区三区在线 | 四虎免费在线观看视频 | 最新av观看 | 在线国产一区 | 99国产精品视频免费观看一公开 | 久热只有精品 | 丝袜美女在线观看 | 欧美一区中文字幕 | 国产福利小视频在线 | 亚洲三级在线播放 | 91精品免费| 欧美日韩国产三级 | 欧美另类亚洲 | 又色又爽的网站 | 国产高清视频免费在线观看 | 国产色在线视频 | 六月激情久久 | 青青草国产免费 | 精品国内自产拍在线观看视频 | 欧美久久久久久久久久 | 免费av电影网站 | 天天天天综合 | 亚洲免费精品视频 | 91av九色| 成人小视频在线播放 | 黄色a级片在线观看 | 国语黄色片 | 国产高清绿奴videos | 国产91勾搭技师精品 | 97视频在线观看视频免费视频 | 亚洲精品日韩在线观看 | 超碰97国产 | 日韩av成人免费看 | 欧美日韩免费网站 | 国产精品美女久久久久久2018 | 在线小视频国产 |