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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JVM 学习整理

發布時間:2023/12/20 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM 学习整理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、運行時數據區域(內存模型)

1.內存區域

? 是指JVM運行時將數據分區域存儲,強調對內存空間的劃分。

2.內存模型

? 是定義了線程和主內存之間的抽象關系,即JMM定義了JVM在計算機內存中的工作方式。共享內存的并發模型,線程之間主要通過讀-寫共享變量(堆內存中的實例域,靜態域和數組元素)來完成隱式通信。Java 內存模型(JMM)控制 Java 線程之間的通信,決定一個線程對共享變量的寫入何時對另一個線程可見。

主要的運行時數據如下:

3.內存區域圖

jdk8 之前內存區域圖:


jdk8之后內存區域圖:

Java 8 中 PermGen 為什么被移出 HotSpot JVM 了?兩個主要原因:

  • 由于 PermGen 內存經常會溢出,引發惱人的 java.lang.OutOfMemoryError: PermGen,因此 JVM 的開發者希望這一塊內存可以更靈活地被管理,不要再經常出現這樣的 OOM
  • 移除 PermGen 可以促進 HotSpot JVM 與 JRockit VM 的融合,因為 JRockit 沒有永久代。
    ? 根據上面的各種原因,PermGen 最終被移除,方法區移至 Metaspace,字符串常量移至 Java Heap
  • 程序計數器

    ? 是一塊較小的內存空間,它可以看做是當前線程所執行的字節碼的行號指示器。

    ? 由于 Java 虛擬機的多線程是通過線程輪流切換并分配處理器執行時間的方式來實現的,在任何一個確定的時刻,一個處理器內核都只會執行一條線程中的指令。因此,為了線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲,我們稱這類內存區域為“線程私有”的內存。

    • 如果線程正在執行的是一個 Java 方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;

    • 如果正在執行的是 Native 方法,這個計數器值則為空(Undefined)。

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

    java虛擬機棧

    ? 與程序計數器一樣,Java虛擬機棧也是線程私有的,它的生命周期與線程相同。

    ? 虛擬機棧描述的是 Java 方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀(Stack Frame,是方法運行時的基礎數據結構)用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每一個方法從調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中入棧到出棧的過程。

    ? 在活動線程中,只有位千棧頂的幀才是有效的,稱為當前棧幀。正在執行的方法稱為當前方法,棧幀是方法運行的基本結構。在執行引擎運行時,所有指令都只能針對當前棧幀進行操作。

    (1)局部變量表

    ? 局部變量表是存放方法參數和局部變量的區域。局部變量沒有準備階段,必須顯示初始化。如果是非靜態方法,則在index[0]位置上存儲的是方法所屬對象的實例引用,一個引用變量占4個字節,隨后存儲的是參數和局部變量。字節碼指令中的STORE指令就是將操作棧中計算完成的局部變呈寫回局部變量表的存儲空間內。

    ? 虛擬機棧規定了兩種異常狀況:如果線程請求的棧深度大于虛擬機所允許的深度,將拋出 StackOverflowError 異常;如果虛擬機棧可以動態擴展(當前大部分的 Java 虛擬機都可動態擴展),如果擴展時無法申請到足夠的內存,就會拋出 OutOfMemoryError 異常。

    (2)操作棧

    ? 操作棧是個初始狀態為空的桶式結構棧。在方法執行過程中,會有各種指令往棧中寫入和提取信息。JVM的執行引擎是基于棧的執行引擎,其中的棧指的就是操作棧。字節碼指令集的定義都是基于棧類型的,棧的深度在方法元信息的stack屬性中。

    i++ 和 ++i 的區別:

  • i++:從局部變量表取出 i 并壓入操作棧然后對局部變量表中的 i 自增 1,將操作棧棧頂值取出使用,最后,使用棧頂值更新局部變量表,如此線程從操作棧讀到的是自增之前的值。
  • ++i:先對局部變量表的 i 自增 1,然后取出并壓入操作棧,再將操作棧棧頂值取出使用,最后,使用棧頂值更新局部變量表,線程從操作棧讀到的是自增之后的值。
  • 之前之所以說 i++ 不是原子操作,即使使用 volatile 修飾也不是線程安全,就是因為,可能 i 被從局部變量表(內存)取出,壓入操作棧(寄存器),操作棧中自增,使用棧頂值更新局部變量表(寄存器更新寫入內存),其中分為 3 步,volatile 保證可見性,保證每次從局部變量表讀取的都是最新的值,但可能這 3 步可能被另一個線程的 3 步打斷,產生數據互相覆蓋問題,從而導致 i 的值比預期的小。

    (3)動態鏈接

    ? 每個棧幀中包含一個在常量池中對當前方法的引用, 目的是支持方法調用過程的動態連接。

    (4)方法返回地址

    ? 方法執行時有兩種退出情況:正常退出,即正常執行到任何方法的返回字節碼指令,如 RETURN、IRETURN、ARETURN 等;異常退出。

    ? 無論何種退出情況,都將返回至方法當前被調用的位置。方法退出的過程相當于彈出當前棧幀,退出可能有三種方式:返回值壓入上層調用棧幀/異常信息拋給能夠處理的棧幀/PC計數器指向方法調用后的下一條指令。

    本地方法棧

    ? 本地方法棧與虛擬機棧所發揮的作用是非常相似的,它們之間的區別不過是虛擬機棧為虛擬機執行java方法服務,而本地方法棧則為虛擬機使用到的Native方法服務。Sun HotSpot虛擬機直接就把本地方法棧和虛擬機棧合二為一。與虛擬機棧一樣,本地方法棧區域也會拋出StackOverflowErro、rOutOfMemoryError異常。

    ? 線程開始調用本地方法時,會進入 個不再受 JVM 約束的世界。本地方法可以通過 JNI(Java Native Interface)來訪問虛擬機運行時的數據區,甚至可以調用寄存器,具有和 JVM 相同的能力和權限。 當大量本地方法出現時,勢必會削弱 JVM 對系統的控制力,因為它的出錯信息都比較黑盒。對內存不足的情況,本地方法棧還是會拋出 nativeheapOutOfMemory。

    ? JNI 類本地方法最著名的應該是 System.currentTimeMillis() ,JNI使 Java 深度使用操作系統的特性功能,復用非 Java 代碼。 但是在項目過程中, 如果大量使用其他語言來實現 JNI , 就會喪失跨平臺特性。

    Java堆

    ? Java堆是Java虛擬機所管理的內存中最大的一塊。Java堆是被所以線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。

    ? 堆是垃圾收集器管理的主要區域,因此很多時候也被稱做“GC堆”(Garbage Collected Heap)。從內存回收的角度來看,由于現在收集器基本都采用分代收集算法,所以 Java 堆中還可以細分為:新生代和老年代;再細致一點的有 Eden 空間、From Survivor 空間、To Survivor 空間等。從內存分配的角度來看,線程共享的 Java 堆中可能劃分出多個線程私有的分配緩沖區(Thread Local Allocation Buffer,TLAB)。

    ? Java 堆可以處于物理上不連續的內存空間中,只要邏輯上是連續的即可,當前主流的虛擬機都是按照可擴展來實現的(通過 -Xmx 和 -Xms 控制)。如果在堆中沒有內存完成實例分配,并且堆也無法再擴展時,將會拋出 OutOfMemoryError 異常。

    方法區

    ? 方法區與Java堆一樣,是各個線程共享的內存區域,它用于儲存已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。雖然Java虛擬機規范把方法區描述為堆的一個邏輯部分,但是它卻有一個別名叫做Non-Heap(非堆),目的應該是與Java堆區分開來。

    ? Java 虛擬機規范對方法區的限制非常寬松,除了和 Java 堆一樣不需要連續的內存和可以選擇固定大小或者可擴展外,還可以選擇不實現垃圾收集。垃圾收集行為在這個區域是比較少出現的,其內存回收目標主要是針對常量池的回收和對類型的卸載。當方法區無法滿足內存分配需求時,將拋出 OutOfMemoryError 異常。

    JDK8 之前,Hotspot 中方法區的實現是永久代(Perm),JDK8 開始使用元空間(Metaspace),以前永久代所有內容的字符串常量移至堆內存,其他內容移至元空間,元空間直接在本地內存分配。

    為什么要使用元空間取代永久代的實現?

    • 字符串存在永久代中,容易出現性能問題和內存溢出
    • 類及方法的信息等比較難確定其大小,因此對于永久代的大小指定比較困難,大小容易出現永久代溢出,太大則容易導致老年代溢出。
    • 永久代會為GC帶來不必要的復雜度,并且回收效率偏低。
    • 將 HotSpot 與 JRockit 合二為一

    (1)運行時常量池

    ? 運行時常量池是方法區的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池(Constant Pool Table),用于存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載后進入方法區的運行時常量池中存放。

    ? 一般來說,除了保存 Class 文件中描述的符號引用外,還會把翻譯出來的直接引用也存儲在運行時常量池中。

    ? 運行時常量池相對于 Class 文件常量池的另外一個重要特征是具備動態性,Java 語言并不要求常量一定只有編譯期才能產生,也就是并非預置入 Class 文件中常量池的內容才能進入方法區運行時常量池,運行期間也可能將新的常量放入池中,這種特性被開發人員利用得比較多的便是 String 類的 intern() 方法。

    ? 既然運行時常量池是方法區的一部分,自然受到方法區內存的限制,當常量池無法再申請到內存時會拋出 OutOfMemoryError 異常。

    (2)直接內存

    ? 直接內存并不是虛擬機運行時數據區的一部分,也不是Java虛擬機規范中定義的內存區域。

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

    ? 顯然,本機直接內存的分配不會受到 Java 堆大小的限制,但是,既然是內存,肯定還是會受到本機總內存(包括 RAM 以及 SWAP 區或者分頁文件)大小以及處理器尋址空間的限制。服務器管理員在配置虛擬機參數時,會根據實際內存設置 -Xmx 等參數信息,但經常忽略直接內存,使得各個內存區域總和大于物理內存限制(包括物理的和操作系統級的限制),從而導致動態擴展時出現 OutOfMemoryError 異常。

    volatile關鍵字

    volatile 可以說是 JVM 提供的最輕量級的同步機制,當一個變量定義為volatile之后,它將具備兩種特性:

    • 保證此變量對所有線程的可見性。

    而普通變量不能做到這一點,普通變量的值在線程間傳遞均需要通過主內存來完成。注意,volatile 雖然保證了可見性,但是 Java 里面的運算并非原子操作,導致 volatile 變量的運算在并發下一樣是不安全的。而 synchronized 關鍵字則是由“一個變量在同一個時刻只允許一條線程對其進行 lock 操作”這條規則獲得線程安全的。

    • 禁止指令重排序優化。

    普通的變量僅僅會保證在該方法的執行過程中所有依賴賦值結果的地方都能獲取到正確的結果,而不能保證變量賦值操作的順序與程序代碼中的執行順序一致。

    內存分配與回收策略

    對象的內存分配,往大方向講,就是在堆上分配,對象主要分配在新生代的Eden區上。少數情況下也可能會直接分配在老年代中,分配的規則并不是百分之百固定的,其細節取決于當前使用的是哪一種垃圾收集器組合,還有虛擬機中與內存相關的參數的設置。

    二、垃圾回收機制

    [垃圾回收主要關注Java堆,Java內存運行時區域中的程序計數器、虛擬機棧、本地方法棧隨線程而生滅](https://jingyan.baidu.com/article/4ae03de33b2ca87ffe9e6b4b.html);棧中的棧幀隨著方法的進入和退出而有條不紊地執行著出棧和入棧操作。每一個棧幀中分配多少內存基本上是在類結構確定下來時就已知的,因此這幾個區域的內存分配和回收都具備確定性,不需要過多考慮回收的問題,因為方法總結或者線程結束時,內存自然就跟隨著回收了。

    ? 而Java堆不一樣,一個接口中的多個實現類需要的內存可能不一樣,一個方法中的多個分支需要的內存也可能不一樣,我們只有在程序處于運行期間時才能知道會創建那些對象,這部分內存的分配和回收都是動態的,垃圾收集器所關注的是這部分內存。

    判讀哪些對象需要被回收

    • 引用計數法

    給對象添加一引用計數器,被引用一次計數器值就加 1;當引用失效時,計數器值就減 1;計數器為 0 時,對象就是不可能再被使用的,簡單高效,缺點是無法解決對象之間相互循環引用的問題。

    • 可達性分析算法

    通過一系列的稱為 “GC Roots” 的對象作為起始點,從這些節點開始向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain),當一個對象到 GC Roots 沒有任何引用鏈相連時,則證明此對象是不可用的。此算法解決了上述循環引用的問題。

    在Java語言中,可作為 GC Roots 的對象包括下面幾種:

    • a. 虛擬機棧(棧幀中的本地變量表)中引用的對象。
    • b. 方法區中類靜態屬性引用的對象。
    • c. 方法區中常量引用的對象。
    • d. 本地方法棧中 JNI(Native方法)引用的對象

    作為 GC Roots 的節點主要在全局性的引用與執行上下文中。要明確的是,tracing gc必須以當前存活的對象集為 Roots,因此必須選取確定存活的引用類型對象。

    GC 管理的區域是 Java 堆,虛擬機棧、方法區和本地方法棧不被 GC 所管理,因此選用這些區域內引用的對象作為 GC Roots,是不會被 GC 所回收的。其中虛擬機棧和本地方法棧都是線程私有的內存區域,只要線程沒有終止,就能確保它們中引用的對象的存活。而方法區中類靜態屬性引用的對象是顯然存活的。常量引用的對象在當前可能存活,因此,也可能是 GC roots 的一部分。

    可達性分析算法

    不可達的對象將暫時處于“緩刑”階段,要真正宣告一個對象死亡,至少要經歷兩次標記過程:

    • 如果對象在進行可達性分析后發現沒有與 GC Roots 相連接的引用鏈,那它將會被第一次標記并且進行一次篩選,篩選的條件是此對象是否有必要執行 finalize() 方法。
    • 當對象沒有覆蓋 finalize() 方法,或者 finalize() 方法已經被虛擬機調用過,虛擬機將這兩種情況都視為“沒有必要執行”,直接進行第二次標記。
    • 如果這個對象被判定為有必要執行 finalize() 方法,那么這個對象將會放置在一個叫做 F-Queue 的隊列之中,并在稍后由一個由虛擬機自動建立的、低優先級的 Finalizer 線程去執行它。

    這里所謂的“執行”是指虛擬機會觸發這個方法,但并不承諾會等待它運行結束,因為如果一個對象在 finalize() 方法中執行緩慢,將很可能會一直阻塞 F-Queue 隊列,甚至導致整個內存回收系統崩潰。

    值得注意的是,使用 finalize() 方法來“拯救”對象是不值得提倡的,它的運行代價高昂,不確定性大,無法保證各個對象的調用順序。finalize() 能做的工作,使用 try-finally 或者其它方法都更適合、及時。

    強、軟、弱、虛引用

    ? JDK1.2 以前,一個對象只有被引用和沒有被引用兩種狀態。后來,Java 對引用的概念進行了擴充,將引用分為強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)4 種,這 4 種引用強度依次逐漸減弱。

  • 強引用就是指在程序代碼之中普遍存在的,類似"Object obj=new Object()"這類的引用,垃圾收集器永遠不會回收存活的強引用對象。
  • 軟引用:還有用但并非必需的對象。在系統 將要發生內存溢出異常之前 ,將會把這些對象列進回收范圍之中進行第二次回收。
  • 弱引用也是用來描述非必需對象的,被弱引用關聯的對象 只能生存到下一次垃圾收集發生之前 。當垃圾收集器工作時,無論內存是否足夠,都會回收掉只被弱引用關聯的對象。
  • 虛引用是最弱的一種引用關系。 無法通過虛引用來取得一個對象實例 。為一個對象設置虛引用關聯的唯一目的就是能在這個對象被收集器回收時收到一個系統通知。
  • Java堆永久代的回收

    ? 永久代的垃圾收集主要回收二部分內容:廢棄常量和無用的類。

  • 回收廢棄常量與回收 Java 堆中的對象非常類似。以常量池中字面量的回收為例,假如一個字符串"abc"已經進入了常量池中,但是當前系統沒有任何一個 String 對象是叫做"abc"的,也沒有其他地方引用了這個字面量,如果這時發生內存回收,而且必要的話,這個"abc"常量就會被系統清理出常量池。常量池中的其他類(接口)、方法、字段的符號引用也與此類似。

  • 類需要同時滿足下面 3 個條件才能算是“無用的類”:

    a. 該類所有的實例都已經被回收,也就是 Java 堆中不存在該類的任何實例。

    b. 加載該類的 ClassLoader 已經被回收。

    c. 該類對應的 java.lang.Class 對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。

    虛擬機可以對滿足上述 3 個條件的無用類進行回收,這里說的僅僅是“可以”,而并不是和對象一樣,不使用了就必然會回收。

  • 在大量使用反射、動態代理、CGLib 等 ByteCode 框架、動態生成 JSP 以及 OSGi 這類頻繁自定義 ClassLoader 的場景都需要虛擬機具備類卸載的功能,以保證永久代不會溢出

    三、垃圾回收算法

    ? 四種:標記-清除算法、復制算法、標記整理算法、分代收集算法

    1.標記-清除算法

    ? 最基礎的收集算法是標記-清除算法,分為“標記”和“清除”二個階段:首先標記出所有需要回收的對象,在標記完成后統一回收所有被標記的對象。

    它的主要不足有兩個:

    • 效率問題,標記和清除兩個過程的效率都不高;
    • 空間問題,標記清除之后會產生大量不連續的內存碎片,空間碎片太多可能會導致以后在程序運行過程中需要分配較大對象時,無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作。

    2.復制算法

    ? 為了解決效率問題,一種稱為“復制”(Copying)的收集算法出現了,它將可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面,然后再把已使用過的內存空間一次清理掉。

    ? 這樣使得每次都是對整個半區進行內存回收,內存分配時也就不用考慮內存碎片等復雜情況,只要移動堆頂指針,按順序分配內存即可,實現簡單,運行高效。只是這種算法的代價是將內存縮小為了原來的一半。

    現在的商業虛擬機都采用這種算法來回收新生代,IBM 研究指出新生代中的對象 98% 是“朝生夕死”的,所以并不需要按照 1:1 的比例來劃分內存空間,而是將內存分為一塊較大的 Eden 空間和兩塊較小的 Survivor 空間,每次使用 Eden 和其中一塊 Survivor 。

    ? 當回收時,將 Eden 和 Survivor 中還存活著的對象一次性地復制到另外一塊 Survivor 空間上,最后清理掉 Eden 和剛才用過的 Survivor 空間。HotSpot 虛擬機默認 Eden:Survivor = 8:1,也就是每次新生代中可用內存空間為整個新生代容量的 90%(其中一塊Survivor不可用),只有 10% 的內存會被“浪費”。

    ? 當然,98%的對象可回收只是一般場景下的數據,我們沒有辦法保證每次回收都只有不多于 10% 的對象存活,當 Survivor 空間不夠用時,需要依賴其他內存(這里指老年代)進行分配擔保(Handle Promotion)。內存的分配擔保也一樣,如果另外一塊 Survivor 空間沒有足夠空間存放上一次新生代收集下來的存活對象時,這些對象將直接通過分配擔保機制進入老年代。

    3.標記-整理算法

    ? 復制算法在對象存活率較高時就要進行較多的復制操作,效率將會變低。更關鍵的是,如果不想浪費 50% 的空間,就需要有額外的空間進行分配擔保,以應對被使用的內存中所有對象都 100% 存活的極端情況,所以在老年代一般不能直接選用這種算法。

    根據老年代的特點,有人提出了另外一種“標記-整理”(Mark-Compact)算法,標記過程仍然與“標記-清除”算法一樣,但后續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內存。

    4.分代收集算法

    ? 當前商業虛擬機的垃圾收器都采用“分代收集”(Generational Collection)算法,根據對象存活周期的不同將內存劃分為幾塊并采用不用的垃圾收集算法。

    ? 一般是把 Java 堆分為**新生代和老年代,**這樣就可以根據各個年代的特點采用最適當的收集算法。在新生代中,每次垃圾收集時都發現有大批對象死去,只有少量存活,那就選用復制算法,只需要付出少量存活對象的復制成本就可以完成收集。而老年代中因為對象存活率高、沒有額外空間對它進行分配擔保,就必須使用“標記—清理”或者“標記—整理”算法來進行回收。

    四、Minor GC(新生代)和Full GC(老年代)觸發條件

    1.Minor GC(新生代)觸發條件

    ? 當Eden區滿時,觸發MinorGC。

    2.FullGC(老年代)觸發條件

    • System.gc()方法的調用
    • 老年代空間不足
    • 方法區空間不足
    • 通過Minor GC后進入老年代的平均大小大于老年代的可用內存
    • 由Eden區、From Space區向To Space區復制時,對象大小大于To Space可用內存,則把該對象轉存到老年代,且老年代的可用內存小于該對象大小

    3.Minor GC 和 Full GC 有什么不一樣

    • 新生代 GC(Minor GC):指發生在新生代的垃圾收集動作,因為 Java 對象大多都具備朝生夕滅的特性,所以 Minor GC 非常頻繁,一般回收速度也比較快。
    • 老年代 GC(Major GC/Full GC):指發生在老年代的 GC,出現了 Major GC,經常會伴隨至少一次的 Minor GC(但非絕對的,在 Parallel Scavenge 收集器的收集策略里就有直接進行 Major GC 的策略選擇過程)。Major GC 的速度一般會比 Minor GC 慢 10 倍以上。

    五、各垃圾收回器的特點及區別

    ? 如果說收集算法是內存回收的方法論,那么垃圾收集器就是內存回收的具體實現。具體有Serial收集器(串行收集器)、ParNew收集器、Parallel Scavenge收集器、Serial Old 收集器、Parallel Old收集器、CMS收集器、G1收集器。

    ? 下圖中7 種作用于不同分代的收集器,如果兩個收集器之間存在連線,就說明它們可以搭配使用。重點分析 CMS 和 G1 這兩款相對復雜的收集器,了解它們的部分運作細節。

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aldtTU5l-1609403845515)(D:\hsq\img\ljhs.jpg)]

    1.Serial收集器(串行收集器)

    ? Serial 收集器,一個單線程的收集器,但它的“單線程”的意義并不僅僅說明它只會使用一個 CPU 或一條收集線程去完成垃圾收集工作,更重要的是在它進行垃圾收集時,必須暫停其他所有的工作線程,直到它收集結束。Serial 收集器對于運行在 Client 模式下的虛擬機來說是一個很好的選擇。

    2.ParNew收集器

    ? ParNew 收集器其實就是 Serial 收集器的多線程版本,除了使用多條線程進行垃圾收集之外,其余行為包括 Serial 收集器可用的所有控制參數(例如:-XX:SurvivorRatio、-XX:PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集算法、Stop The World、對象分配規則、回收策略等都與 Serial 收集器完全一樣,在實現上,這兩種收集器也共用了相當多的代碼

    ? 注意,從 ParNew 收集器開始,后面還會接觸到幾款并發和并行的收集器。這里有必要先解釋兩個名詞:并發和并行。這兩個名詞都是并發編程中的概念,在談論垃圾收集器的上下文語境中,它們可以解釋如下。

    • 并行(Parallel):指多條垃圾收集線程并行工作,但此時用戶線程仍然處于等待狀態。
    • 并發(Concurrent):指用戶線程與垃圾收集線程同時執行(但不一定是并行的,可能會交替執行),用戶程序在繼續運行,而垃圾收集程序運行于另一個 CPU 上。

    3.Parallel Scavenge收集器

    ? Parallel Scavenge 收集器的特點是它的關注點與其他收集器不同,CMS 等收集器的關注點是盡可能地縮短垃圾收集時用戶線程的停頓時間,而 Parallel Scavenge 收集器的目標則是達到一個可控制的吞吐量(Throughput)。

    ? 所謂吞吐量就是 CPU 用于運行用戶代碼的時間與 CPU 總消耗時間的比值,即吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間),虛擬機總共運行了 100 分鐘,其中垃圾收集花掉1分鐘,那吞吐量就是99% 。停頓時間越短就越適合需要與用戶交互的程序,良好的響應速度能提升用戶體驗,而高吞吐量則可以高效率地利用 CPU 時間,盡快完成程序的運算任務,主要適合在后臺運算而不需要太多交互的任務。

    ? Parallel Scavenge收集器提供了兩個參數用于精確控制吞吐量,分別是控制最大垃圾收集停頓時間的-XX:MaxGCPauseMillis參數以及直接設置吞吐量大小的-XX:GCTimeRatio參數

    • MaxGCPauseMillis參數允許的值是一個大于 0 的毫秒數,收集器將盡可能地保證內存回收花費的時間不超過設定值。不要認為如果把這個參數的值設置得稍小一點就能使得系統的垃圾收集速度變得更快,GC停頓時間縮短是以犧牲吞吐量和新生代空間來換取的:系統把新生代調小一些,收集 300MB 新生代肯定比收集 500MB 快吧,這也直接導致垃圾收集發生得更頻繁一些,原來10秒收集一次、每次停頓100毫秒,現在變成5秒收集一次、每次停頓70毫秒。停頓時間的確在下降,但吞吐量也降下來了。
    • GCTimeRatio 參數的值應當是一個 0 到 100 的整數,也就是垃圾收集時間占總時間的比率,相當于是吞吐量的倒數。如果把此參數設置為 19,那允許的最大 GC 時間就占總時間的 5%(即 1/(1+19)),默認值為 99 ,就是允許最大 1%(即 1/(1+99))的垃圾收集時間。

    4.Serial Old 收集器

    ? Serial Old 是 Serial 收集器的老年代版本,它同樣是一個單線程收集器,使用“標記-整理”算法。這個收集器的主要意義也是在于給 Client 模式下的虛擬機使用。如果在 Server 模式下,那么它主要還有兩大用途:一種用途是在 JDK 1.5 以及之前的版本中與 Parallel Scavenge 收集器搭配使用,另一種用途就是作為 CMS 收集器的后備預案,在并發收集發生 Concurrent Mode Failure 時使用。

    5.Parallel Old收集器

    ? Parallel Old 是 Parallel Scavenge 收集器的老年代版本,使用多線程和“標記-整理”算法。這個收集器是在 JDK 1.6 中才開始提供的,在此之前,新生代的 Parallel Scavenge 收集器一直處于比較尷尬的狀態。原因是:如果新生代選擇了 Parallel Scavenge 收集器,老年代除了 Serial Old(PS MarkSweep)收集器外別無選擇(Parallel Scavenge 收集器無法與 CMS 收集器配合工作)。

    ? 由于老年代 Serial Old 收集器在服務端應用性能上的“拖累”,使用了 Parallel Scavenge 收集器也未必能在整體應用上獲得吞吐量最大化的效果,由于單線程的老年代收集中無法充分利用服務器多 CPU 的處理能力,在老年代很大而且硬件比較高級的環境中,這種組合的吞吐量甚至還不一定有 ParNew 加 CMS 的組合“給力”。

    直到 Parallel Old 收集器出現后,“吞吐量優先”收集器終于有了比較名副其實的應用組合,在注重吞吐量以及 CPU 資源敏感的場合,都可以優先考慮 Parallel Scavenge 加 Parallel Old 收集器。

    6.CMS收集器

    ? CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。目前很大一部分的 Java 應用集中在互聯網站或者 B/S 系統的服務端上,這類應用尤其重視服務的響應速度,希望系統停頓時間最短,以給用戶帶來較好的體驗。CMS 收集器就非常符合這類應用的需求。從名字(包含"Mark Sweep")上就可以看出,CMS 收集器是基于“標記—清除”算法實現的,它的運作過程相對于前面幾種收集器來說更復雜一些,整個過程分為4個步驟,包括:

    • 初始標記(CMS initial mark)
    • 并發標記(CMS concurrent mark)
    • 重新標記(CMS remark)
    • 并發清除(CMS concurrent sweep)

    其中,初始標記、重新標記這兩個步驟仍然需要"Stop The World"。初始標記僅僅只是標記一下 GC Roots 能直接關聯到的對象,速度很快,并發標記階段就是進行 GC RootsTracing 的過程,而重新標記階段則是為了修正并發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄,這個階段的停頓時間一般會比初始標記階段稍長一些,但遠比并發標記的時間短。

    CMS 是一款優秀的收集器,它的主要優點在名字上已經體現出來了:并發收集、低停頓,但是 CMS 還遠達不到完美的程度,

    它有以下 3 個明顯的缺點:

    • 第一、導致吞吐量降低。

    CMS 收集器對 CPU 資源非常敏感。其實,面向并發設計的程序都對 CPU 資源比較敏感。在并發階段,它雖然不會導致用戶線程停頓,但是會因為占用了一部分線程(或者說CPU資源)而導致應用程序變慢,總吞吐量會降低。CMS 默認啟動的回收線程數是(CPU數量+3)/4,也就是當 CPU 在4個以上時,并發回收時垃圾收集線程不少于 25% 的 CPU 資源,并且隨著 CPU 數量的增加而下降。但是當 CPU 不足 4 個(譬如2個)時,CMS 對用戶程序的影響就可能變得很大,如果本來 CPU 負載就比較大,還分出一半的運算能力去執行收集器線程,就可能導致用戶程序的執行速度忽然降低了 50%,其實也讓人無法接受。

    • 第二、CMS 收集器無法處理浮動垃圾(Floating Garbage),可能出現"Concurrent Mode Failure"失敗而導致另一次 Full GC(新生代和老年代同時回收) 的產生。

    由于 CMS 并發清理階段用戶線程還在運行著,伴隨程序運行自然就還會有新的垃圾不斷產生,這一部分垃圾出現在標記過程之后,CMS 無法在當次收集中處理掉它們,只好留待下一次 GC 時再清理掉。這一部分垃圾就稱為“浮動垃圾”。也是由于在垃圾收集階段用戶線程還需要運行,那也就還需要預留有足夠的內存空間給用戶線程使用,因此 CMS 收集器不能像其他收集器那樣等到老年代幾乎完全被填滿了再進行收集,需要預留一部分空間提供并發收集時的程序運作使用。

    要是 CMS 運行期間預留的內存無法滿足程序需要,就會出現一次"Concurrent Mode Failure"失敗,這時虛擬機將啟動后備預案:臨時啟用 Serial Old 收集器來重新進行老年代的垃圾收集,這樣停頓時間就很長了。所以說參數-XX:CM SInitiatingOccupancyFraction設置得太高很容易導致大量"Concurrent Mode Failure"失敗,性能反而降低。

    • 第三、產生空間碎片。

    CMS 是一款基于“標記—清除”算法實現的收集器,這意味著收集結束時會有大量空間碎片產生。空間碎片過多時,將會給大對象分配帶來很大麻煩,往往會出現老年代還有很大空間剩余,但是無法找到足夠大的連續空間來分配當前對象,不得不提前觸發一次 Full GC 。

    7.G1收集器

    ? G1(Garbage-First)收集器是當今收集器技術發展的最前沿成果之一,G1 是一款面向服務端應用的垃圾收集器。HotSpot 開發團隊賦予它的使命是(在比較長期的)未來可以替換掉 JDK 1.5 中發布的 CMS 收集器。

    與其他 GC 收集器相比,G1 具備如下特點:

    • 并行與并發: G1 能充分利用多 CPU、多核環境下的硬件優勢,使用多個CPU(CPU或者CPU核心)來縮短 Stop-The-World 停頓的時間,部分其他收集器原本需要停頓 Java 線程執行的 GC 動作,G1 收集器仍然可以通過并發的方式讓 Java 程序繼續執行。
    • 分代收集: 與其他收集器一樣,分代概念在 G1 中依然得以保留。雖然 G1 可以不需要其他收集器配合就能獨立管理整個 GC 堆,但它能夠采用不同的方式去處理新創建的對象和已經存活了一段時間、熬過多次 GC 的舊對象以獲取更好的收集效果。
    • 空間整合: 與 CMS 的“標記—清理”算法不同,G1 從整體來看是基于“標記—整理”算法實現的收集器,從局部(兩個 Region 之間)上來看是基于“復制”算法實現的,但無論如何,這兩種算法都意味著 G1 運作期間不會產生內存空間碎片,收集后能提供規整的可用內存。這種特性有利于程序長時間運行,分配大對象時不會因為無法找到連續內存空間而提前觸發下一次 GC 。
    • 可預測的停頓: 這是 G1 相對于 CMS 的另一大優勢,降低停頓時間是 G1 和 CMS 共同的關注點,但 G1 除了追求低停頓外,還能建立可預測的停頓時間模型,能讓使用者明確指定在一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒,這幾乎已經是實時 Java(RTSJ)的垃圾收集器的特征了。

    G1和CMS的比較

    • CMS收集器是獲取最短回收停頓時間為目標的收集器,因為CMS工作時,GC工作線程與用戶線程可以并發執行,以此來達到降低停頓時間的目的(只有初始標記和重新標記會STW)。但是CMS收集器對CPU資源非常敏感。在并發階段,雖然不會導致用戶線程停頓,但是會占用CPU資源而導致引用程序變慢,總吞吐量下降。
    • CMS僅作用于老年代,是基于標記清除算法,所以清理的過程中會有大量的空間碎片。
    • **CMS收集器無法處理浮動垃圾,**由于CMS并發清理階段用戶線程還在運行,伴隨程序的運行自熱會有新的垃圾不斷產生,這一部分垃圾出現在標記過程之后,CMS無法在本次收集中處理它們,只好留待下一次GC時將其清理掉。
    • G1是一款面向服務端應用的垃圾收集器,適用于多核處理器、大內存容量的服務端系統。G1能充分利用CPU、多核環境下的硬件優勢,使用多個CPU(CPU或者CPU核心)來縮短STW的停頓時間,它滿足短時間停頓的同時達到一個高的吞吐量。
    • 從JDK 9開始,G1成為默認的垃圾回收器。當應用有以下任何一種特性時非常適合用G1:Full GC持續時間太長或者太頻繁;對象的創建速率和存活率變動很大;應用不希望停頓時間長(長于0.5s甚至1s)。
    • G1將空間劃分成很多塊(Region),然后他們各自進行回收。堆比較大的時候可以采用復制算法,碎片化問題不嚴重。整體上看屬于標記整理算法,局部(region之間)屬于復制算法。
    • G1 需要記憶集 (具體來說是卡表)來記錄新生代和老年代之間的引用關系,這種數據結構在 G1 中需要占用大量的內存,可能達到整個堆內存容量的 20% 甚至更多。而且 G1 中維護記憶集的成本較高,帶來了更高的執行負載,影響效率。所以 CMS 在小內存應用上的表現要優于 G1,而大內存應用上 G1 更有優勢,大小內存的界限是6GB到8GB。

    JVM常見的調優參數包括:

    • -Xmx:指定java程序的最大堆內存, 使用java -Xmx5000M -version判斷當前系統能分配的最大堆內存
    • -Xms:指定最小堆內存, 通常設置成跟最大堆內存一樣,減少GC
    • -Xmn:設置年輕代大小。整個堆大小=年輕代大小 + 年老代大小。所以增大年輕代后,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。
    • -Xss:指定線程的最大棧空間,此參數決定了java函數調用的深度,,值越大調用深度越深,,若值太小則容易出棧溢出錯誤(StackOverflowError)
    • -XX:PermSize:指定方法區(永久區)的初始值,默認是物理內存的1/64, 在Java8永久區移除, 代之的是元數據區, 由-XX:MetaspaceSize指定
    • -XX:MaxPermSize:指定方法區的最大值, 默認是物理內存的1/4, 在java8中由-XX:MaxMetaspaceSize指定元數據區的大小
    • -XX:NewRatio=n:年老代與年輕代的比值,-XX:NewRatio=2, 表示年老代與年輕代的比值為2:1
    • -XX:SurvivorRatio=n:Eden區與Survivor區的大小比值,-XX:SurvivorRatio=8表示Eden區與Survivor區的大小比值是8:1:1,因為Survivor區有兩個(from, to)

    JVM性能監控有哪些?

    JDK的命令行工具

    • jps(虛擬機進程狀況工具):jps可以列出正在運行的虛擬機進程,并顯示虛擬機執行主類(Main Class,main()函數所在的類)名稱 以及這些進程的本地虛擬機唯一ID(Local Virtual Machine Identifier,LVMID)。
    • jstat(虛擬機統計信息監視工具):jstat是用于監視虛擬機各種運行狀態信息的命令行工 具。它可以顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。
    • jinfo(Java配置信息工具):jinfo的作用是實時地查看和調整虛擬機各項參數。
    • jmap(Java內存映像工具):命令用于生成堆轉儲快照(一般稱為heapdump或dump文 件)。如果不使用jmap命令,要想獲取Java堆轉儲快照,還有一些比較“暴力”的手段:譬如 在第2章中用過的-XX:+HeapDumpOnOutOfMemoryError參數,可以讓虛擬機在OOM異常出 現之后自動生成dump文件。jmap的作用并不僅僅是為了獲取dump文件,它還可以查詢finalize執行隊列、Java堆和永 久代的詳細信息,如空間使用率、當前用的是哪種收集器等。
    • jhat(虛擬機堆轉儲快照分析工具):jhat命令與jmap搭配使用,來分析jmap生成的堆 轉儲快照。jhat內置了一個微型的HTTP/HTML服務器,生成dump文件的分析結果后,可以在 瀏覽器中查看。
    • jstack(Java堆棧跟蹤工具):jstack命令用于生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧 的集合,生成線程快照的主要目的是定位線程出現長時間停頓的原因,如線程間死鎖、死循 環、請求外部資源導致的長時間等待等都是導致線程長時間停頓的常見原因。線程出現停頓 的時候通過jstack來查看各個線程的調用堆棧,就可以知道沒有響應的線程到底在后臺做些 什么事情,或者等待著什么資源。

    JDK的可視化工具

    • JConsole
    • VisualVM

    總結

    以上是生活随笔為你收集整理的JVM 学习整理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    8x成人免费视频 | 国产一区福利在线 | 处女av在线 | 国产精品久久久久久久久久久免费看 | 久草成人在线 | 国产高清视频在线播放 | 波多野结衣亚洲一区二区 | 最近免费中文字幕mv在线视频3 | 福利视频网站 | 免费看高清毛片 | www国产亚洲精品久久麻豆 | 久久精品在线视频 | 美女啪啪图片 | 久久艹艹 | 婷婷在线免费视频 | 国产va在线 | www成人av | 日日操日日插 | 国产精品久久久久久影院 | 天天夜夜操| 欧美一级高清片 | 久久深爱网 | www亚洲一区| 国产精品99久久久精品免费观看 | 欧美在线18 | 久久大视频 | 六月色 | 国产成人免费高清 | 91资源在线 | 激情综合五月网 | 亚洲 综合 激情 | 日韩剧 | 高清不卡免费视频 | 97在线看 | 色天天综合网 | 波多野结衣在线观看一区二区三区 | 中文字幕在线日亚洲9 | 国精产品999国精产品岳 | 99久久爱 | 中文字幕在线播放日韩 | 一区二区精品国产 | 日韩欧美在线观看一区二区 | 中字幕视频在线永久在线观看免费 | 久久视频这里有久久精品视频11 | av免费福利 | 99久久精品免费看国产一区二区三区 | 久久久久成人精品 | 欧美日韩1区 | 成人在线观看免费 | 麻豆久久久久 | 日韩伦理片一区二区三区 | 18性欧美xxxⅹ性满足 | 久久久免费视频播放 | 免费a级黄色毛片 | 亚洲美女久久 | 66av99精品福利视频在线 | 又色又爽的网站 | 一区二区三区国产精品 | 又黄又刺激视频 | 国产一二区免费视频 | av解说在线观看 | 久久亚洲综合色 | 国产成人av电影 | 伊人成人精品 | 黄色电影在线免费观看 | 成在人线av | 亚洲va在线va天堂 | 五月婷婷一级片 | 一区三区在线欧 | 91丨精品丨蝌蚪丨白丝jk | 日韩亚洲在线观看 | 亚洲综合精品在线 | 91精品高清 | 337p日本大胆噜噜噜噜 | 成年人在线看片 | 亚洲经典在线 | 亚洲成人动漫在线观看 | 在线看一区 | 人人超碰免费 | 99久精品视频 | 四虎成人网 | 999抗病毒口服液 | 亚洲成人软件 | 久久人人爽人人爽人人 | 成人资源站| 精品国产一区二区三区av性色 | a天堂一码二码专区 | 久久婷亚洲五月一区天天躁 | 手机成人免费视频 | 超碰成人av | 91视频在线播放视频 | 三日本三级少妇三级99 | 在线观看电影av | 欧美日韩一区二区免费在线观看 | 91在线蜜桃臀 | 久久久久久久国产精品视频 | 在线天堂中文www视软件 | 最新国产一区二区三区 | 日本在线观看一区二区三区 | 黄色影院在线免费观看 | 国产精品岛国久久久久久久久红粉 | 久久久久久久久久久久久久电影 | 黄色精品视频 | 在线观看精品一区 | 久久午夜精品视频 | 白丝av在线| 国产精品 日韩 | 免费在线看成人av | 九九久久久久久久久激情 | 中文字幕不卡在线88 | 中文字幕日韩免费视频 | 手机在线小视频 | av在线播放中文字幕 | 久久99精品久久久久久 | 国产亚洲精品久久久久久大师 | 久久天天综合网 | 狠狠色伊人亚洲综合网站野外 | 亚洲久久视频 | 免费三级a| 91av精品 | 久久精品这里都是精品 | 91最新在线观看 | 丁香视频在线观看 | 久久视频这里只有精品 | 69av视频在线观看 | 很污的网站 | 中国一级片在线观看 | www.一区二区三区 | 黄色1级毛片 | 国产最新视频在线 | 欧美一级大片在线观看 | 五月婷婷av| 国产拍揄自揄精品视频麻豆 | 91av视频免费观看 | 久草在线资源观看 | 又色又爽又黄高潮的免费视频 | 国产成本人视频在线观看 | 超碰在线cao | 亚洲成人黄色 | 香蕉视频在线免费 | 麻豆视频免费在线 | 在线电影 你懂得 | 亚洲伊人网在线观看 | 国产福利一区二区三区视频 | 在线精品一区二区 | 一区免费视频 | 久久亚洲在线 | 色视频国产直接看 | 亚洲免费国产视频 | 国产小视频在线免费观看视频 | 欧美日韩在线精品一区二区 | 人人网人人爽 | 四虎在线观看网址 | 久草在线免 | 久久一区二区三区日韩 | 亚洲自拍偷拍色图 | 亚洲精品动漫在线 | 国产 日韩 欧美 在线 | 日韩免费大片 | 国产小视频国产精品 | 91天堂在线观看 | 91精品国自产在线观看 | 91精品啪 | 激情网站五月天 | 久久久久免费观看 | 日日日干 | 特级片免费看 | 婷婷成人亚洲综合国产xv88 | 天天干夜夜 | 欧美久久久久久 | 四虎成人精品永久免费av | 91一区二区三区在线观看 | 欧美日韩一区二区免费在线观看 | 久久人人97超碰国产公开结果 | 日韩一区二区三免费高清在线观看 | 99久久精品久久久久久清纯 | 激情丁香久久 | 久久精品成人热国产成 | 日日干av | 91网在线观看 | 国产精品一区二区在线免费观看 | 黄色在线小网站 | 黄色三级免费片 | 在线免费黄色 | 免费黄在线观看 | 国产精美视频 | 亚洲欧美日韩精品久久久 | 精品国产免费一区二区三区五区 | 444av| 伊人久久精品久久亚洲一区 | 亚洲精品网站 | 制服丝袜一区二区 | 日韩在线无| 国产又粗又猛又黄又爽视频 | 日韩一级黄色片 | 久久久激情网 | jizz999| 国产成人黄色片 | 99精品视频播放 | 天天做天天爱天天爽综合网 | 久久精品国产亚洲精品2020 | 日本激情中文字幕 | 日韩精品久久久久久久电影竹菊 | 狠狠躁日日躁狂躁夜夜躁av | 欧美一级免费高清 | 二区三区中文字幕 | 韩日av在线 | 国产又黄又爽又猛视频日本 | 中文字幕视频免费观看 | 人人网av | 欧美一级日韩三级 | 国产高清无av久久 | 一区二区不卡在线观看 | 久久香蕉电影网 | 久久亚洲综合国产精品99麻豆的功能介绍 | 91精品综合在线观看 | 色a综合 | 中文字幕在线观 | 日韩视频一区二区在线观看 | 狠狠干夜夜 | 国产精品久久久久免费 | 久久福利精品 | 人成免费网站 | 成人丝袜 | 91在线麻豆 | 国产二区免费视频 | 成人一区影院 | 成片视频在线观看 | 国产午夜精品一区二区三区在线观看 | 久久99网站 | 久久有精品 | av电影不卡 | 久久久精品 一区二区三区 国产99视频在线观看 | 91自拍视频在线观看 | 国产成人精品av | www.玖玖玖| 日韩在线视频精品 | 国产一区自拍视频 | 怡春院av| 久久激情视频免费观看 | 玖玖玖国产精品 | 色五月成人 | 中文字幕一区二区在线观看 | 亚洲成人精品在线观看 | 日韩大片免费在线观看 | 国产69久久 | 日日干网 | 国产91大片 | 色久网| 精品久久一区二区三区 | 手机看片国产日韩 | 欧美激情综合色综合啪啪五月 | 玖玖玖精品 | 国产成人久久精品亚洲 | 在线观看视频 | 亚洲精品成人av在线 | 欧美精品日韩 | www.com久久 | 国产美女在线精品免费观看 | 精品国产一区二区三区久久久蜜月 | h视频在线看 | 热九九精品| 超碰公开在线观看 | 日韩字幕在线 | 欧美三人交| 中文字幕在线一区二区三区 | 国产成人在线免费观看 | 中国成人一区 | 久久精品视频18 | 亚洲精品综合一区二区 | 天堂va在线观看 | 天天综合操 | 精品视频国产一区 | 亚洲综合激情小说 | 亚洲一级国产 | 成人黄色片在线播放 | 又大又硬又黄又爽视频在线观看 | 亚洲最大av在线播放 | 中文字幕a∨在线乱码免费看 | 免费福利在线观看 | 亚洲成av人影院 | 特级xxxxx欧美 | 久久9精品 | 天天干天天干天天色 | 日韩在线视频观看 | 欧美性精品| 亚洲国产精品久久久 | 日韩精品欧美视频 | 人人干在线 | 精品久久久久免费极品大片 | 色吊丝在线永久观看最新版本 | 欧美日韩在线视频观看 | 久久综合色一综合色88 | 成人在线电影观看 | 在线播放 日韩专区 | 日韩xxxxxxxxx | 91av原创| 综合在线观看色 | 精品国产诱惑 | 在线观看精品国产 | 久久99国产精品二区护士 | 一级片黄色片网站 | 91大神精品视频在线观看 | 97色婷婷成人综合在线观看 | 久久久久国产精品视频 | 国产91电影在线观看 | 精品视频免费 | 丝袜美腿亚洲综合 | 黄色一级大片在线观看 | 91看片在线| 91九色成人 | 亚洲精品福利在线 | 久久久久久久久久久电影 | 精品国自产在线观看 | 国产日韩精品一区二区三区 | 久久精品二区 | 在线播放国产精品 | 在线 视频 一区二区 | 精品爱爱 | 国产一级免费视频 | 日韩精品久久久免费观看夜色 | 日韩理论在线播放 | 欧美精品少妇xxxxx喷水 | 免费男女网站 | 国产美女精品在线 | 久久久久久国产一区二区三区 | 天天射天 | 久久激情视频 久久 | 国产精品精品 | 又黄又爽又湿又无遮挡的在线视频 | 国产不卡视频在线 | 色婷婷久久久综合中文字幕 | 在线免费观看黄色大片 | 一区二区影院 | 亚州精品一二三区 | 在线观看视频在线 | 在线视频 区 | 久久久久久久久久久久电影 | av3级在线 | 午夜在线观看影院 | 奇米影视999 | a在线免费观看视频 | 国产精品久久久久久久久久久久午夜 | 国产成人精品一区二区三区网站观看 | 午夜国产一区二区三区四区 | 亚洲综合成人在线 | 日韩精品一区二区三区高清免费 | 久操视频在线播放 | 色婷婷av国产精品 | 日韩精品免费在线观看视频 | 免费黄色a网站 | 日日综合网 | 久精品视频 | 在线国产观看 | 97人人模人人爽人人喊网 | 久久久久久久国产精品视频 | 色噜噜色噜噜 | 国产精品 美女 | 亚洲电影影音先锋 | 一本一道久久a久久综合蜜桃 | 在线观看日韩av | 91麻豆免费版 | 久久综合九色综合97_ 久久久 | 丁香综合| 91亚洲网 | 91免费视频网站在线观看 | 国产96精品 | 中文字幕在线国产 | 五月天久久久 | 日本中文字幕在线电影 | 欧美日韩国产欧美 | 日日躁你夜夜躁你av蜜 | 黄色的视频网站 | 99视频在线精品国自产拍免费观看 | 欧美另类重口 | 91成人网在线播放 | 91av国产视频| 波多野结衣精品视频 | 免费在线看成人av | 精品一区av | 久久久久日本精品一区二区三区 | 成人av中文字幕 | 久草在线高清 | 91原创在线观看 | 欧美午夜精品久久久久 | 99精品欧美一区二区三区黑人哦 | 久久一本综合 | 日韩在线观看视频在线 | 国产高清视频 | 久久久网 | 国产精品第10页 | 国产手机在线 | 日韩在线电影 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲专区中文字幕 | 欧美午夜性生活 | 日韩黄色在线观看 | 在线观看免费一级片 | 九九热1| 波多野结衣在线视频免费观看 | 日本一区二区三区视频在线播放 | 992tv在线成人免费观看 | 久久亚洲影院 | 国产精品久久久久久久久久了 | 国产黄色观看 | 婷婷在线色 | 精产嫩模国品一二三区 | 国产精品久久久久久久av大片 | 国产91欧美 | 美女视频久久黄 | 97超视频免费观看 | 麻豆传媒视频在线 | 久久99在线| 在线观看精品视频 | 国产精品视频永久免费播放 | 天天干中文字幕 | 成人资源在线 | 在线99热 | 在线婷婷 | 婷婷午夜| 中文字幕亚洲在线观看 | 国产一级大片在线观看 | 久草资源免费 | 日韩精品电影在线播放 | 夜夜狠狠 | 97在线免费视频观看 | 免费黄色特级片 | 五月天久久精品 | 亚洲精品黄色在线观看 | 在线你懂 | 中文字幕观看av | 国产精品久久久久久久毛片 | 国产精品午夜久久 | 在线免费观看av网站 | 日韩欧美精品一区二区 | 免费a网站 | 亚洲 欧洲av | 欧洲一区精品 | 又污又黄的网站 | 成人a免费视频 | 天天搞夜夜骑 | 欧美一区二区三区免费观看 | 在线观看你懂的网址 | 国产在线观看 | 精品一区二区在线观看 | 香蕉视频色 | 色吊丝在线永久观看最新版本 | 天天射天天干天天操 | www色片| 激情综合婷婷 | 色婷婷电影网 | 国产中文字幕视频在线观看 | 国色天香在线观看 | 天天干干| 97av影院| 国产亚洲视频在线观看 | 爱爱一区| 天堂av网站| 国产精品综合久久 | 亚洲精品毛片一级91精品 | 免费在线91 | 五月婷婷国产 | 久久五月婷婷综合 | 在线视频一区观看 | 午夜视频在线观看一区二区 | 波多野结衣日韩 | 久久99国产精品二区护士 | 国产一区二区精 | 激情综合网在线观看 | 精选久久| 国产第一页精品 | 日韩在线观看第一页 | 香蕉影院在线播放 | 亚洲精品中文在线观看 | 精品国产精品国产偷麻豆 | 婷五月激情 | 在线国产片 | 成 人 黄 色 片 在线播放 | 狠狠操狠狠干天天操 | 最近最新mv字幕免费观看 | 在线成人av| 亚洲乱码精品久久久久 | 亚洲作爱视频 | 日韩成人黄色 | 亚洲va欧美va | 91丨九色丨高潮丰满 | 免费网站观看www在线观看 | 色噜噜噜噜 | 国产精品成人一区二区三区吃奶 | 国产黄色理论片 | 亚洲最大av网站 | 中文字幕中文字幕中文字幕 | 97在线观看视频国产 | 悠悠av资源片 | 在线免费高清一区二区三区 | 在线观看欧美成人 | 亚洲精品字幕 | 久久全国免费视频 | 久久精品99久久 | 成人黄色小说视频 | 青春草免费视频 | 中文字幕中文中文字幕 | 亚洲高清在线视频 | 操操操影院 | 亚洲黄网站 | 九九色在线观看 | 国产精品一区二区三区免费看 | 国产福利免费在线观看 | a黄色大片| 麻豆国产网站 | 在线亚洲欧美日韩 | 日韩乱色精品一区二区 | 成人午夜剧场在线观看 | 日日麻批40分钟视频免费观看 | 国产麻豆剧果冻传媒视频播放量 | 国产在线不卡精品 | 中文字幕乱在线伦视频中文字幕乱码在线 | 亚洲激情视频在线 | 日日干影院 | 在线观看一级片 | 97超视频免费观看 | 久久伊人国产精品 | 欧美精品久久久久久久久久久 | 欧美日韩成人一区 | 国产在线一区二区三区播放 | 国产在线国产 | 精品久久久久久亚洲综合网 | 日韩,精品电影 | 国产 色| 毛片在线播放网址 | 久久久久久欧美二区电影网 | 久久99精品久久久久久 | 久久久资源 | 免费在线播放av电影 | 日本精品一区二区在线观看 | 99热在线这里只有精品 | 日韩精品一区二区在线 | 中文字幕乱码亚洲精品一区 | 超碰97在线看 | 国产精品欧美一区二区三区不卡 | 狠狠操狠狠 | 日韩毛片在线一区二区毛片 | 久久综合狠狠综合久久狠狠色综合 | 91精品老司机久久一区啪 | 黄p网站在线观看 | 欧美久久久久久久久中文字幕 | 黄色a三级| 日本在线观看视频一区 | 很黄很黄的网站免费的 | 伊人电影在线观看 | 久久人网 | 麻豆网站免费观看 | 91精品视频一区二区三区 | 日韩在线观看视频一区二区三区 | 黄色片网站 | www.天天干| 亚洲三级毛片 | 日韩最新中文字幕 | 国产美女免费观看 | 国产一区久久久 | 久久久网站| 国产涩图| 免费在线观看成年人视频 | 色视频 在线 | 精品国产网址 | 91在线区 | 久久精品视频在线观看 | 免费在线观看av的网站 | 色激情在线 | 精品免费久久 | 国产精品a级 | 在线视频日韩一区 | 久久九九免费视频 | 日日操狠狠干 | 日韩欧美在线观看 | 欧美性大战 | 国产精品午夜久久久久久99热 | 九九影视理伦片 | 国产xxxx做受性欧美88 | av免费电影在线 | 2019中文字幕网站 | 黄色网中文字幕 | 天堂黄色片 | 99情趣网视频 | 天天干人人 | 国产精品1区 | 这里只有精品视频在线观看 | 波多野结衣日韩 | 成人av免费在线观看 | 国产高清不卡一区二区三区 | 日韩视频区 | a级片久久久 | 激情视频区 | 久青草视频 | 91爱爱电影| 精品产品国产在线不卡 | 久久国产手机看片 | 成人国产网址 | 久久精品5 | 视频一区二区三区视频 | 91pony九色丨交换 | 九精品 | 丝袜美腿在线 | 久草在线最新 | 免费观看完整版无人区 | 天堂资源在线观看视频 | 久久精品国产亚洲aⅴ | 成人四虎 | 欧美韩国日本在线观看 | 97在线免费视频 | 国产九九精品视频 | 久久久在线免费观看 | 久久久久久久免费观看 | 国产在线视频一区二区三区 | 精品久久网 | 人人爽人人看 | 国产精品手机在线观看 | 亚洲欧洲国产视频 | 天天综合网天天综合色 | 亚洲成人软件 | 97精品伊人| 亚洲 精品在线视频 | 黄色在线免费观看网址 | 午夜影院一级 | 黄p网站在线观看 | 91一区二区三区在线观看 | 99re久久精品国产 | 成人在线观看你懂的 | 中文字幕丝袜制服 | 久久99久久99精品免费看小说 | 天天草天天色 | 亚洲欧美日韩一区二区三区在线观看 | 国产美女精品人人做人人爽 | 婷婷香蕉 | 国产精品女同一区二区三区久久夜 | 色黄久久久久久 | 超碰人人在线观看 | 成人动漫视频在线 | 色婷婷综合久久久久中文字幕1 | 久久久久久高清 | 色综合久久五月天 | 日韩欧美在线观看一区 | 黄色成人av| 天堂网一区 | 亚洲开心色 | 超碰在线观看99 | 超碰97在线资源 | 最新日韩视频 | 国产一区二区三区免费视频 | 婷婷激情小说网 | 在线观看日本高清mv视频 | a级黄色片视频 | 色婷婷免费视频 | 天天色综合1 | 91精品成人久久 | 国内小视频| 99re8这里有精品热视频免费 | 中文字幕视频在线播放 | 毛片在线播放网址 | 国产小视频你懂的 | 中文字幕乱码在线播放 | 成人黄色影片在线 | 日日日日| av大片免费看 | av免费网站 | 国产精品久久视频 | 久久这里 | 在线午夜电影神马影院 | 免费网站污 | 色综合久久综合中文综合网 | 国产在线日本 | 久久中文字幕在线视频 | 亚洲精品国产欧美在线观看 | 婷婷在线色 | 日韩一区二区三区视频在线 | 国产一二区视频 | 色鬼综合网 | 97超碰人人澡人人爱学生 | 久久久久久国产精品免费 | 在线成人中文字幕 | 波多野结衣久久精品 | 国产资源免费 | 欧美日韩国产精品一区二区 | 中文字幕 国产 一区 | 国产成人精品综合久久久久99 | 国产手机免费视频 | 99久热在线精品视频 | 久99久视频| 国产精品视频永久免费播放 | 欧美一级片免费播放 | 久久精品观看 | 最新av网址在线观看 | 欧美在线观看小视频 | 久草视频在线观 | 九九热在线免费观看 | 亚洲欧美国产精品va在线观看 | 久久av伊人 | 五月天激情视频在线观看 | 五月激情久久久 | 亚洲日本色 | 日韩网站在线免费观看 | 91精品视频在线看 | 国产精品毛片一区视频 | 亚洲国产精品99久久久久久久久 | 最近最新中文字幕 | 在线小视频你懂的 | 日韩视频欧美视频 | 久久99网站 | 精品国产电影一区二区 | 国产精品成人一区二区 | 在线免费观看av网站 | 91色视频 | 九九视频在线观看视频6 | 碰超人人| 亚洲极色 | 亚洲国产精久久久久久久 | 欧美专区亚洲专区 | 日韩av电影一区 | 亚洲91网站| 亚洲精品在 | 在线亚洲高清视频 | 国产在线最新 | 亚洲国产精品免费 | 激情婷婷在线观看 | 久久久久免费视频 | 粉嫩av一区二区三区免费 | 日韩欧美高清视频在线观看 | 丝袜+亚洲+另类+欧美+变态 | 91精品入口| 色综合天天天天做夜夜夜夜做 | 91成人精品一区在线播放69 | 久久综合给合久久狠狠色 | 毛片在线播放网址 | 九九久久久 | 免费观看国产视频 | 狠狠干激情 | 中文字幕超清在线免费 | 99色 | 天天草天天 | 国产精品资源在线 | 国产亚洲精品久久久久久久久久 | av东方在线 | 久久在线视频在线 | 国产原创在线观看 | 中文字幕免费不卡视频 | 久久精彩免费视频 | 91久久丝袜国产露脸动漫 | 亚洲成人精品国产 | 国产中文字幕视频 | 久久免费精品国产 | 最近中文字幕视频网 | 色吊丝在线永久观看最新版本 | 黄色毛片视频 | 国产精品原创在线 | 久久精品99精品国产香蕉 | 色综合天天干 | 免费高清无人区完整版 | 成人av地址 | 九九九在线观看视频 | 久操中文字幕在线观看 | 狠狠色丁香婷婷综合视频 | 亚洲一区二区观看 | 国产一级免费在线观看 | 奇米777777 | 亚洲黄色软件 | 国产色在线 | 久久精品欧美视频 | 18做爰免费视频网站 | 久久久18 | 91人人爽人人爽人人精88v | 激情网站 | 在线91观看 | 欧美成人一二区 | 国产精品美女在线观看 | 国产视频在线观看一区 | 五月婷婷在线观看视频 | 制服丝袜一区二区 | 日韩精品久久一区二区 | 麻豆视频在线看 | 最近中文字幕免费观看 | 久久不射网站 | 久久久激情视频 | 91精品免费在线观看 | 波多野结衣电影久久 | 激情综合五月婷婷 | 免费在线a | 成人av高清在线观看 | 日本婷婷色 | 最近免费在线观看 | 亚洲成av人片在线观看无 | 亚洲永久av | 色瓜| 国产精品免费久久久久 | 视频在线观看入口黄最新永久免费国产 | 在线a亚洲视频播放在线观看 | 国产一级免费电影 | 欧美-第1页-屁屁影院 | 亚洲草视频 | 国产精品毛片一区视频播不卡 | av电影不卡在线 | 毛片www | 欧美日韩久久久 | 久久久久97国产 | 国产视频二区三区 | 免费一级片观看 | 九九九热精品免费视频观看网站 | 国产精品久久一区二区无卡 | av免费看网站 | 久久久久免费网 | 欧美日韩三级在线观看 | 色999视频| 怡红院久久 | 超碰99在线 | 亚洲在线视频观看 | 波多野结衣日韩 | 国产精品午夜免费福利视频 | 国产精品v欧美精品 | 黄色片毛片 | 亚洲视频网站在线观看 | 久久免费在线视频 | 国产看片免费 | 国产黑丝一区二区 | 韩国av在线播放 | 久久久亚洲精华液 | 五月天综合婷婷 | 婷婷五月色综合 | 欧美日韩久久不卡 | 天天综合区 | 免费av大全 | 九九久久在线看 | 九九九九精品 | 特级西西444www大精品视频免费看 | 国产一区91 | 综合国产在线观看 | 青青色影院 | 91在线视频免费91 | 伊人五月综合 | 九草视频在线 | 一区二区三区高清在线观看 | 国产成人高清在线 | 欧美精品999 | 欧美性超爽 | 免费在线观看av | 狠狠的日日| 久久国产精品免费一区 | 在线观看视频中文字幕 | 91看片淫黄大片一级在线观看 | 日本中文字幕一二区观 | 久久综合免费视频影院 | 国产精品久久久久久久99 | 久久影院中文字幕 | 亚洲国产av精品毛片鲁大师 | 国产一区二三区好的 | 在线免费亚洲 | 婷婷色5月 | 国产艹b视频 | 91热爆在线观看 | 一区二区三区免费播放 | 人人擦| 天天干天天操av | 国内精品久久久久久久久久久久 | 久久精品视频免费播放 | 欧美一区二区免费在线观看 | 色狠狠狠 | 精品国产乱码久久久久久天美 | 中文字幕视频一区二区 | 国产成人免费在线 | 四虎在线视频免费观看 | 成人国产精品一区 | av一区二区在线观看中文字幕 | 免费在线观看91 | 国产一级大片在线观看 | 美女网站视频免费黄 | 日韩三级成人 | 国产成人av免费在线观看 | 9在线观看免费高清完整版在线观看明 | 日韩精品免费在线观看 | 激情五月婷婷激情 | 欧美成人高清 | 久久公开视频 | 婷婷在线五月 | 激情图片区 | 久久久久久伊人 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 国产精品淫| 99视频在线免费播放 | 国产裸体无遮挡 | 亚洲精品小视频 | 激情视频免费在线观看 | 伊人导航| 亚洲国产精品电影 | 91av视频在线播放 | 九九热在线精品 | 婷婷狠狠操 | 亚洲欧美国产精品va在线观看 | 超碰成人av | 免费精品视频在线观看 | 香蕉网在线观看 | 中文字幕久久亚洲 | 国产一级视频在线观看 | 国产精品毛片一区视频 | 99产精品成人啪免费网站 | 成人久久国产 | 男女啪啪视屏 | 在线观看 亚洲 | 久久国产视频网站 | 免费视频二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲精品国产精品国自产观看浪潮 | 久草精品视频在线看网站免费 | www夜夜操com | 国产馆在线播放 | 亚洲国产免费网站 | 天天做天天干 | 91精品对白一区国产伦 | 国产成人一区二区啪在线观看 | 久久精品一级片 | 日韩欧美一区二区三区黑寡妇 | 三级性生活视频 | 日韩有码专区 | 日韩综合在线观看 | 成人黄色电影视频 | 四虎影视av | 国产精品一区二区在线观看 | 免费又黄又爽视频 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 久久综合综合久久综合 | 99热国产在线| 婷婷激情影院 | 欧美精品视 | 偷拍区另类综合在线 | 国产视频99 | 国产精品97 | 久久一区二区三区国产精品 | 精品专区一区二区 | 国产又粗又猛又爽又黄的视频先 | 国产精品久久99综合免费观看尤物 | 在线国产一区二区 | 2018亚洲男人天堂 | 日韩影视在线观看 | 国产成人精品综合久久久久99 | 99久久激情 | 韩国三级av在线 | 韩国三级一区 | 欧美成年人在线观看 | 免费观看成人av | 91精品久久久久久久久久入口 | 808电影 | 在线成人小视频 | 激情五月六月婷婷 | 国内精品久久久久久 | 婷婷深爱五月 | 精品v亚洲v欧美v高清v | 成人av片免费观看app下载 | 精品女同一区二区三区在线观看 | 国内精品久久久久影院优 | 天天色天天操综合 | 久久精品99国产精品酒店日本 | 天天操天天操天天操天天操天天操天天操 | 97麻豆视频 | 国产一区高清在线 | 六月丁香激情网 | 亚洲精品久久久蜜桃直播 | 国产综合在线视频 | 国产精品美女久久久久久久网站 | 亚洲精品免费在线观看视频 | 日本少妇高清做爰视频 | 中文字幕国内精品 | 成人cosplay福利网站 | 在线成人一区 | 国产群p视频 | 久久久久久久久久久免费av | 久久久久国 | 色播五月婷婷 | 91精品国产91| 久久久久女教师免费一区 | 国产美女被啪进深处喷白浆视频 | 国产成人精品一区二区三区 | 国产精品精品国产婷婷这里av | 丁香五月网久久综合 | 91亚洲影院| 国产91在线观看 | 99在线高清视频在线播放 | 五月天中文字幕mv在线 | 91麻豆网站 | 不卡电影免费在线播放一区 | 五月天视频网 | 手机看片福利 | 麻豆免费视频观看 | www.天天操.com | 黄色国产大片 | 日韩精品视频久久 | 中文在线www | 国产亚洲精品电影 | 美女黄频网站 | 青春草免费视频 | 国产精品都在这里 | 美女国产精品 |