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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

(七)Java垃圾收集器详解

發(fā)布時間:2023/12/20 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (七)Java垃圾收集器详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

面試官問:Java垃圾收集器了解過多少,說一下 JVM 有哪些垃圾回收器?這些問題在你面試高級Java的時候經(jīng)常會問到。本篇文章結(jié)合著【深入理解Java虛擬機】一書當中整理了本篇博客。

如果想要對收集器了解的更深,建議一點一點讀,如果想大概了解一下,只是為了面試問到可以簡單說一下,那么可以直接看我下方寫的總結(jié),總結(jié)相對來說內(nèi)容不是很多,但是每個收集器優(yōu)缺點都整理到了。

目錄

    • 一、概述
    • 二、Java垃圾收集器
      • 2.1、Serial收集器
      • 2.2、ParNew收集器
      • 2.3、Parallel Scavenge收集器
      • 2.4、Serial Old收集器
      • 2.5、Parallel Old收集器
      • 2.6、CMS收集器
      • 2.7、Garbage First收集器
    • 三、總結(jié)
      • 3.1、JVM默認用的哪個收集器?
      • 3.2、Serial收集器
      • 3.3、ParNew收集器
      • 3.4、Parallel Scavenge收集器
      • 3.5、Serial Old收集器
      • 3.6、Parallel Old收集器
      • 3.7、CMS收集器
      • 3.8、G1收集器

JVM的知識是連貫性的,如果你連Java內(nèi)存分布,以及垃圾回收相關(guān)知識都不知道,建議您不要讀這篇文章,讀起來會讓你失去學習的興致。可以先去讀讀我前面所寫的JVM相關(guān)知識。

一、概述

如果說收集算法是內(nèi)存回收的方法論,那垃圾收集器就是內(nèi)存回收的實踐者。

Java垃圾收集器這個不學就不能工作嗎?答案是不是,這個代表你掌握JVM的深度。Java離開JVM就不行嗎,答案是肯定的,這個問就好似程序員離開電腦能行嗎,之前我是深深體會到JVM不學好,會吃多大的虧。項目內(nèi)存出現(xiàn)瓶頸問題根本無從下手,這都是需要依靠這些知識的積累,才能全方面的去解決JVM優(yōu)化問題。

我們都知道Java默認的虛擬機類型是HotSpot虛擬機,HotSpot虛擬機有多種不同的收集器,既然實現(xiàn)這么多種,意味著每一種都有每一種的作用。針對這一點,我們進行深入學習Java垃圾收集器。

垃圾收集器是干什么的?為什么要了解他呢?

很多人其實對這塊根本不理解,只知道面試的時候會經(jīng)常問垃圾回收算法,而且還知道有三種,標記清除法、標記復(fù)制法、標記整理法,如果再問你,虛擬機用的哪個算法你還知道嗎?答案是,三種都用到了。

各款經(jīng)典收集器之間的關(guān)系 如圖所示。

七種作用于不同分代的收集器,如果兩個收集器之間存在連線,就說明它們可以搭配 使用,圖中收集器所處的區(qū)域,則表示它是屬于新生代收集器抑或是老年代收集器。接下來筆者將 逐一介紹這些收集器的目標、特性、原理和使用場景,并重點分析CMS和G1這兩款相對復(fù)雜而又廣泛 使用的收集器,深入了解它們的部分運作細節(jié)。

雖然垃圾收集器的技術(shù)在不斷進步,但直到現(xiàn)在還沒有 最好的收集器出現(xiàn),更加不存在“萬能”的收集器,所以我們選擇的只是對具體應(yīng)用最合適的收集器。

二、Java垃圾收集器

2.1、Serial收集器

Serial收集器是最基礎(chǔ)、歷史最悠久的收集器,曾經(jīng)(在JDK 1.3.1之前)是HotSpot虛擬機新生代 收集器的唯一選擇。大家只看名字就能夠猜到,這個收集器是一個單線程工作的收集器,但它的“單線 程”的意義并不僅僅是說明它只會使用一個處理器或一條收集線程去完成垃圾收集工作,更重要的是強 調(diào)在它進行垃圾收集時,必須暫停其他所有工作線程,直到它收集結(jié)束。“Stop The World”這個詞語也 許聽起來很酷,但這項工作是由虛擬機在后臺自動發(fā)起和自動完成的,在用戶不可知、不可控的情況 下把用戶的正常工作的線程全部停掉,這對很多應(yīng)用來說都是不能接受的。讀者不妨試想一下,要是 你的電腦每運行一個小時就會暫停響應(yīng)五分鐘,你會有什么樣的心情?下圖示意了Serial/Serial Old收 集器的運行過程。


為什么要停止所有用戶線程?

對于“Stop The World”帶給用戶的惡劣體驗,早期HotSpot虛擬機的設(shè)計者們表示完全理解,但也 同時表示非常委屈:因為你要進行清理的時候,你正清理著,還有用戶線程在造著,這清理到什么時候是個頭。

從JDK 1.3開始,一直到現(xiàn)在最新的JDK 13,HotSpot虛擬機開發(fā)團隊為消除或者降低用戶線程因 垃圾收集而導致停頓的努力一直持續(xù)進行著,從Serial收集器到Parallel收集器,再到Concurrent Mark Sweep(CMS)和Garbage First(G1)收集器,最終至現(xiàn)在垃圾收集器的最前沿成果Shenandoah和ZGC 等,我們看到了一個個越來越構(gòu)思精巧,越來越優(yōu)秀,也越來越復(fù)雜的垃圾收集器不斷涌現(xiàn),用戶線 程的停頓時間在持續(xù)縮短。

迄今為止,Serial收集器依然是HotSpot虛擬機運行在客戶端模式下的默認新生 代收集器。

什么是Java客戶端?

客戶端就是指的的桌面可以直接點擊的應(yīng)用,有的會直接在客戶端里面集成JDK,用戶便可以點擊直接運行,當關(guān)閉應(yīng)用的時候,就相當于JVM停止,點擊應(yīng)用的時候,JVM開始運行,所以一般客戶端的JVM我們要的是單線程性價比最高的。

優(yōu)點:

  • 簡單而高效(與其他收集器的單線程相比)
  • 它是所有收集器里額外內(nèi)存消耗(Memory Footprint)最小的
  • 對于單核處理 器或處理器核心數(shù)較少的環(huán)境來說,Serial收集器由于沒有線程交互的開銷,專心做垃圾收集自然可以 `獲得最高的單線程收集效率
  • 在用戶桌面的應(yīng)用場景以及近年來流行的部分微服務(wù)應(yīng)用中,分配給虛 擬機管理的內(nèi)存一般來說并不會特別大,收集幾十兆甚至一兩百兆的新生代,垃圾收集的停頓時間完全可以控制在十幾、幾十毫秒,最多一 百多毫秒以內(nèi),只要不是頻繁發(fā)生收集,這點停頓時間對許多用戶來說是完全可以接受的。所以,Serial收集器對于運行在客戶端模式下的虛擬機來說是一個很好的選擇。

    2.2、ParNew收集器

    ParNew收集器實質(zhì)上是Serial收集器的多線程并行版本,除了同時使用多條線程進行垃圾收集之 外,其余的行為包括Serial收集器可用的所有控制參數(shù)(例如:-XX:SurvivorRatio、-XX: PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集算法、Stop The World、對象分配規(guī) 則、回收策略等都與Serial收集器完全一致,在實現(xiàn)上這兩種收集器也共用了相當多的代碼。ParNew收 集器的工作過程如圖所示。

    ParNew在JDK7之前是服務(wù)端模式下的HotSpot虛擬機 首選的新生代收集 器,原因:除了Serial收集器外,目前只有它能與CMS 收集器配合工作。

    在JDK 5發(fā)布時,HotSpot推出了一款在強交互應(yīng)用中幾乎可稱為具有劃時代意義的垃圾收集器 ——CMS收集器。這款收集器是HotSpot虛擬機中第一款真正意義上支持并發(fā)的垃圾收集器,它首次 實現(xiàn)了讓垃圾收集線程與用戶線程(基本上)同時工作。

    遺憾的是,CMS作為老年代的收集器,卻無法與JDK 1.4.0中已經(jīng)存在的新生代收集器Parallel Scavenge配合工作,所以在JDK 5中使用CMS來收集老年代的時候,新生代只能選擇ParNew或者 Serial收集器中的一個。ParNew收集器是激活CMS后(使用-XX:+UseConcMarkSweepGC選項)的默 認新生代收集器,也可以使用-XX:+/-UseParNewGC選項來強制指定或者禁用它。

    可以說直到CMS的出現(xiàn)才鞏固了ParNew的地位,但成也蕭何敗也蕭何,隨著垃圾收集器技術(shù)的不 斷改進,更先進的G1收集器帶著CMS繼承者和替代者的光環(huán)登場。G1是一個面向全堆的收集器,不 再需要其他新生代收集器的配合工作。所以自JDK 9開始,ParNew加CMS收集器的組合就不再是官方 推薦的服務(wù)端模式下的收集器解決方案了。官方希望它能完全被G1所取代,甚至還取消了ParNew加 Serial Old以及Serial加CMS這兩組收集器組合的支持(其實原本也很少人這樣使用),并直接取消了- XX:+UseParNewGC參數(shù),這意味著ParNew和CMS從此只能互相搭配使用,再也沒有其他收集器能 夠和它們配合了。讀者也可以理解為從此以后,ParNew合并入CMS,成為它專門處理新生代的組成部 分。ParNew可以說是HotSpot虛擬機中第一款退出歷史舞臺的垃圾收集器。

    ParNew收集器在單核處理器的環(huán)境中絕對不會有比Serial收集器更好的效果,甚至由于存在線程 交互的開銷,該收集器在通過超線程(Hyper-Threading)技術(shù)實現(xiàn)的偽雙核處理器環(huán)境中都不能百分之百保證超越Serial收集器。當然,隨著可以被使用的處理器核心數(shù)量的增加,ParNew對于垃圾收集時 系統(tǒng)資源的高效利用還是很有好處的。它默認開啟的收集線程數(shù)與處理器核心數(shù)量相同,可以使用-XX:ParallelGCThreads參數(shù)來限制垃圾收集的線程數(shù)。

    注意 從ParNew收集器開始,后面還將會接觸到若干款涉及“并發(fā)”和“并行”概念的收集器。 在大家可能產(chǎn)生疑惑之前,有必要先解釋清楚這兩個名詞。并行和并發(fā)都是并發(fā)編程中的專業(yè)名詞, 在談?wù)摾占鞯纳舷挛恼Z境中,它們可以理解為:

    • 并行(Parallel):并行描述的是多條垃圾收集器線程之間的關(guān)系,說明同一時間有多條這樣的線 程在協(xié)同工作,通常默認此時用戶線程是處于等待狀態(tài)。

    • 并發(fā)(Concurrent):并發(fā)描述的是垃圾收集器線程與用戶線程之間的關(guān)系,說明同一時間垃圾 收集器線程與用戶線程都在運行。由于用戶線程并未被凍結(jié),所以程序仍然能響應(yīng)服務(wù)請求,但由于 垃圾收集器線程占用了一部分系統(tǒng)資源,此時應(yīng)用程序的處理的吞吐量將受到一定影響。

    Parallel Scavenge收集器及 后面提到的G1收集器等都沒有使用HotSpot中原本設(shè)計的垃圾收集器的分代框架,而選擇另外獨立實 現(xiàn)。Serial、ParNew收集器則共用了這部分的框架代碼,
    詳細可參考: https://blogs.oracle.com/jonthecollector/our_collectors。

    2.3、Parallel Scavenge收集器

    Parallel Scavenge收集器也是一款新生代收集器,它同樣是基于標記-復(fù)制算法實現(xiàn)的收集器,也是 能夠并行收集的多線程收集器……Parallel Scavenge的諸多特性從表面上看和ParNew非常相似,那它有 什么特別之處呢?

    Parallel Scavenge收集器的特點是它的關(guān)注點與其他收集器不同,CMS等收集器的關(guān)注點是盡可能 地縮短垃圾收集時用戶線程的停頓時間,而Parallel Scavenge收集器的目標則是達到一個可控制的吞吐 量(Throughput)。所謂吞吐量就是處理器用于運行用戶代碼的時間與處理器總消耗時間的比值, 即

    可以的當做是一個輸入和輸出的比值。


    如果虛擬機完成某個任務(wù),用戶代碼加上垃圾收集總共耗費了100分鐘,其中垃圾收集花掉1分 鐘,那吞吐量就是99%。停頓時間越短就越適合需要與用戶交互或需要保證服務(wù)響應(yīng)質(zhì)量的程序,良 好的響應(yīng)速度能提升用戶體驗;而高吞吐量則可以最高效率地利用處理器資源,盡快完成程序的運算 任務(wù),主要適合在后臺運算而不需要太多交互的分析任務(wù)。

    Parallel Scavenge收集器提供了兩個參數(shù)用于精確控制吞吐量:

    • -XX:MaxGCPauseMillis :控制最大垃圾收集停頓時間
    • -XX:GCTimeRatio :設(shè)置吞吐量大小
    • -XX:+UseAdaptiveSizePolicy :這是一 個開關(guān)參數(shù),當這個參數(shù)被激活之后,就不需要人工指定新生代的大小(-Xmn)、Eden與Survivor區(qū) 的比例(-XX:SurvivorRatio)、晉升老年代對象大小(-XX:PretenureSizeThreshold)等細節(jié)參數(shù) 了,虛擬機會根據(jù)當前系統(tǒng)的運行情況收集性能監(jiān)控信息,動態(tài)調(diào)整這些參數(shù)以提供最合適的停頓時 間或者最大的吞吐量。這種調(diào)節(jié)方式稱為垃圾收集的自適應(yīng)的調(diào)節(jié)策略(GC Ergonomics)。

    -XX:MaxGCPauseMillis參數(shù)允許的值是一個大于0的毫秒數(shù),收集器將盡力保證內(nèi)存回收花費的 時間不超過用戶設(shè)定值。不過大家不要異想天開地認為如果把這個參數(shù)的值設(shè)置得更小一點就能使得 系統(tǒng)的垃圾收集速度變得更快,垃圾收集停頓時間縮短是以犧牲吞吐量和新生代空間為代價換取的: 系統(tǒng)把新生代調(diào)得小一些,收集300MB新生代肯定比收集500MB快,但這也直接導致垃圾收集發(fā)生得 更頻繁,原來10秒收集一次、每次停頓100毫秒,現(xiàn)在變成5秒收集一次、每次停頓70毫秒。停頓時間 的確在下降,但吞吐量也降下來了。

    -XX:GCTimeRatio參數(shù)的值則應(yīng)當是一個大于0小于100的整數(shù),也就是垃圾收集時間占總時間的 比率,相當于吞吐量的倒數(shù)。譬如把此參數(shù)設(shè)置為19,那允許的最大垃圾收集時間就占總時間的5% (即1/(1+19)),默認值為99,即允許最大1%(即1/(1+99))的垃圾收集時間。

    優(yōu)點:

    對于收集器運作不太了解,手工優(yōu)化存在困難的話,使用Parallel Scavenge收集器配合自適應(yīng)調(diào)節(jié)策 略,把內(nèi)存管理的調(diào)優(yōu)任務(wù)交給虛擬機去完成也許是一個很不錯的選擇。只需要把基本的內(nèi)存數(shù)據(jù)設(shè) 置好(如-Xmx設(shè)置最大堆),然后使用-XX:MaxGCPauseMillis參數(shù)(更關(guān)注最大停頓時間)或- XX:GCTimeRatio(更關(guān)注吞吐量)參數(shù)給虛擬機設(shè)立一個優(yōu)化目標,那具體細節(jié)參數(shù)的調(diào)節(jié)工作就 由虛擬機完成了。自適應(yīng)調(diào)節(jié)策略也是Parallel Scavenge收集器區(qū)別于ParNew收集器的一個重要特性。

    官方介紹:http://download.oracle.com/javase/1.5.0/docs/guide/vm/gc-ergonomics.html。

    2.4、Serial Old收集器

    Serial Old是Serial收集器的老年代版本,它同樣是一個單線程收集器,使用標記-整理算法。這個收 集器的主要意義也是供客戶端模式下的HotSpot虛擬機使用。如果在服務(wù)端模式下,它也可能有兩種用 途:

    • JDK 5以及之前的版本中與Parallel Scavenge新生代收集器搭配使用
    • 作為CMS 收集器發(fā)生失敗時的后備預(yù)案,在并發(fā)收集發(fā)生Concurrent Mode Failure時使用。這兩點都將在后面的 內(nèi)容中繼續(xù)講解。Serial Old收集器的工作過程如圖所示。

      需要說明一下,Parallel Scavenge新生代收集器架構(gòu)中本身有PS MarkSweep收集器來進行老年代收集,并非 直接調(diào)用Serial Old收集器,但是這個PS MarkSweep收集器與Serial Old的實現(xiàn)幾乎是一樣的,所以在官 方的許多資料中都是直接以Serial Old代替PS MarkSweep進行講解,這里筆者也采用這種方式。

    2.5、Parallel Old收集器

    Parallel Old是Parallel Scavenge收集器的老年代版本,支持多線程并發(fā)收集,基于標記-整理算法實 現(xiàn)。這個收集器是直到JDK 6時才開始提供的。

    在此之前,新生代的Parallel Scavenge收集器一直處于相 當尷尬的狀態(tài),原因是如果新生代選擇了Parallel Scavenge收集器,老年代除了Serial Old(PS MarkSweep)收集器以外別無選擇,其他表現(xiàn)良好的老年代收集器,如CMS無法與它配合工作。由于 老年代Serial Old收集器在服務(wù)端應(yīng)用性能上的“拖累”,使用Parallel Scavenge收集器也未必能在整體上 獲得吞吐量最大化的效果。

    同樣,由于單線程的老年代收集中無法充分利用服務(wù)器多處理器的并行處 理能力,在老年代內(nèi)存空間很大而且硬件規(guī)格比較高級的運行環(huán)境中,Parallel Scavenge新生代+老年代Serial Old這種組合的總吞吐量甚至不一 定比ParNew加CMS的組合來得優(yōu)秀。

    直到Parallel Old收集器出現(xiàn)后,“吞吐量優(yōu)先”收集器終于有了比較名副其實的搭配組合,在注重 吞吐量或者處理器資源較為稀缺的場合,都可以優(yōu)先考慮Parallel Scavenge加Parallel Old收集器這個組 合。Parallel Old收集器的工作過程如圖所示。

    2.6、CMS收集器

    CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。目前很 大一部分的Java應(yīng)用集中在互聯(lián)網(wǎng)網(wǎng)站或者基于瀏覽器的B/S系統(tǒng)的服務(wù)端上,這類應(yīng)用通常都會較為 關(guān)注服務(wù)的響應(yīng)速度,希望系統(tǒng)停頓時間盡可能短,以給用戶帶來良好的交互體驗。CMS收集器就非 常符合這類應(yīng)用的需求。

    從名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于標記-清除算法實現(xiàn)的,它的運作 過程相對于前面幾種收集器來說要更復(fù)雜一些,整個過程分為四個步驟,包括:

  • 初始標記(CMS initial mark) :初始標記僅僅標記一下GC Roots能直接關(guān)聯(lián)到的對象,速度很快。
  • 并發(fā)標記(CMS concurrent mark) :并發(fā)標記階段就是從GC Roots的直接關(guān)聯(lián)對象開始遍歷整個對 象圖的過程,這個過程耗時較長但是不需要停頓用戶線程,可以與垃圾收集線程一起并發(fā)運行;
  • 重新標記(CMS remark) :重 新標記階段則是為了修正并發(fā)標記期間,因用戶程序繼續(xù)運作而導致標記產(chǎn)生變動的那一部分對象的 標記記錄,這個階段的停頓時間通常會比初始標記階段稍長一 些,但也遠比并發(fā)標記階段的時間短;
  • 并發(fā)清除(CMS concurrent sweep):并發(fā)清除階段,清理刪除掉標記階段判斷的已經(jīng)死亡的 對象,由于不需要移動存活對象,所以這個階段也是可以與用戶線程同時并發(fā)的。
  • 其中初始標記、重新標記這兩個步驟仍然需要“Stop The World”。`;

    通過下圖可以比較清楚地看到CMS收集器的運作步驟中并發(fā)和需要停頓的階段。


    CMS是一款優(yōu)秀的收集器,它最主要的優(yōu)點在名字上已經(jīng)體現(xiàn)出來:并發(fā)收集、低停頓,一些官 方公開文檔里面也稱之為“并發(fā)低停頓收集器”(Concurrent Low Pause Collector)。CMS收集器是 HotSpot虛擬機追求低停頓的第一次成功嘗試,但是它還遠達不到完美的程度,至少有以下三個明顯的 缺點:

    缺點一:CMS收集器,雖然不會導致用戶線程停頓,但卻會因為占用了一部分線程(或者說處理器的計 算能力)而導致應(yīng)用程序變慢,降低總吞吐量。CMS默認啟動的回收線程數(shù)是(處理器核心數(shù)量 +3)/4,也就是只占用不超過25%的 處理器運算資源。處理器核心數(shù)量不足四個時, CMS對用戶程序的影響就可能變得很大。就可能導致用戶程序的執(zhí)行速度忽然大幅降低。

    為了緩解這種情況,虛擬機提 供了一種稱為“增量式并發(fā)收集器”(Incremental Concurrent Mark Sweep/i-CMS)的CMS收集器變種,他是在并發(fā)標記、清理的時候讓收集器線程、用戶線程交替運行,盡量減少垃圾收集線程的獨占資源的 時間,這樣整個垃圾收集的過程會更長,但對用戶程序的影響就會顯得較少一些。這就好比長痛不如短痛,交替執(zhí)行,用戶訪問會長時間一直卡頓,盡可能不會說直接卡死,但是資源有限,訪問會很慢。從 JDK 7開始,i-CMS模式已經(jīng)被聲明不再提倡用戶使用。

    缺點二:CMS收集器無法處理“浮動垃圾”(Floating Garbage),有可能出現(xiàn)“Con-current Mode Failure”失敗進而導致另一次完全“Stop The World”的Full GC的產(chǎn)生。

    什么是浮動垃圾?

    在CMS的并發(fā)標記和并發(fā)清理階 段,用戶線程是還在繼續(xù)運行的,程序在運行自然就還會伴隨有新的垃圾對象不斷產(chǎn)生,但這一部分 垃圾對象是出現(xiàn)在標記過程結(jié)束以后,CMS無法在當次收集中處理掉它們,只好留待下一次垃圾收集 時再清理掉。這一部分垃圾就稱為“浮動垃圾。

    浮動垃圾帶來的危害?

    同樣也是由于在垃圾收集階段用戶線程還需要持續(xù)運 行,那就還需要預(yù)留足夠內(nèi)存空間提供給用戶線程使用,因此CMS收集器不能像其他收集器那樣等待 到老年代幾乎完全被填滿了再進行收集。

    在JDK 5的默認設(shè)置下,CMS收集器當老年代使用了68%的空間后就會被激活,這是一個偏保守的設(shè)置,如果 在實際應(yīng)用中老年代增長并不是太快,可以適當調(diào)高參數(shù)-XX:CMSInitiatingOccu-pancyFraction的值 來提高CMS的觸發(fā)百分比,降低內(nèi)存回收頻率,獲取更好的性能。

    到了JDK 6時,CMS收集器的啟動 閾值就已經(jīng)默認提升至92%。但這又會更容易面臨另一種風險:要是CMS運行期間預(yù)留的內(nèi)存無法滿 足程序分配新對象的需要,就會出現(xiàn)一次“并發(fā)失敗”(Concurrent Mode Failure),這時候虛擬機將不 得不啟動后備預(yù)案:凍結(jié)用戶線程的執(zhí)行,臨時啟用Serial Old收集器來重新進行老年代的垃圾收集, 但這樣停頓時間就很長了。所以參數(shù)-XX:CMSInitiatingOccupancyFraction設(shè)置得太高將會很容易導致 大量的并發(fā)失敗產(chǎn)生,性能反而降低,用戶應(yīng)在生產(chǎn)環(huán)境中根據(jù)實際應(yīng)用情況來權(quán)衡設(shè)置。

    缺點三:CMS是一款基于“標記-清除”算法實現(xiàn)的收集器,這意味著收集結(jié)束時會有大量空間碎片產(chǎn)生。空間 碎片過多時,將會給大對象分配帶來很大麻煩,往往會出現(xiàn)老年代還有很多剩余空間,但就是無法找 到足夠大的連續(xù)空間來分配當前對象,而不得不提前觸發(fā)一次Full GC的情況。

    為了解決這個問題, CMS收集器提供了一個-XX:+UseCMS-CompactAtFullCollection開關(guān)參數(shù)(默認是開啟的,此參數(shù)從 JDK 9開始廢棄),用于在CMS收集器不得不進行Full GC時開啟內(nèi)存碎片的合并整理過程,由于這個 內(nèi)存整理必須移動存活對象,(在Shenandoah和ZGC出現(xiàn)前)是無法并發(fā)的。這樣空間碎片問題是解 決了,但停頓時間又會變長.

    因此虛擬機設(shè)計者們還提供了另外一個參數(shù)-XX:CMSFullGCsBefore- Compaction(此參數(shù)從JDK 9開始廢棄),這個參數(shù)的作用是要求CMS收集器在執(zhí)行過若干次(數(shù)量 由參數(shù)值決定)不整理空間的Full GC之后,下一次進入Full GC前會先進行碎片整理(默認值為0,表 示每次進入Full GC時都進行碎片整理)。

    2.7、Garbage First收集器

    Garbage First(簡稱G1)收集器被Oracle官方稱為“全功能的垃圾收集器”。

    JDK 9發(fā)布之 日,G1宣告取代Parallel Scavenge加Parallel Old組合,成為服務(wù)端模式下的默認垃圾收集器,而CMS則 淪落至被聲明為不推薦使用(Deprecate)的收集器。

    在G1收集器出現(xiàn)之前的所有 其他收集器,包括CMS在內(nèi),垃圾收集的目標范圍要么是整個新生代(Minor GC),要么就是整個老 年代(Major GC),再要么就是整個Java堆(Full GC)。

    G1不再堅持固定大小以及固定數(shù)量的 分代區(qū)域劃分,而是把連續(xù)的Java堆劃分為多個大小相等的獨立區(qū)域(Region),Region中還有一類特殊的Humongous區(qū)域,專門用來存儲大對象。每個Region的大小可以通過參數(shù)-XX:G1HeapRegionSize設(shè) 定。對于那些超過了整個Region容量的超級大對象, 將會被存放在N個連續(xù)的Humongous Region之中,G1的大多數(shù)行為都把Humongous Region作為老年代 的一部分來進行看待,如下圖所示。

    用戶設(shè)定允許的收集停頓時間(使用參數(shù)-XX:MaxGCPauseMillis指定,默 認值是200毫秒)

    既然有這個參數(shù)那說明他有控制停頓時間的功能,他是怎么控制的?

    因為它將Region作 為單次回收的最小單元,G1收集器去跟蹤各個Region里面的垃 圾堆積的“價值”大小 (價值即回收所獲得的空間大小以及回收所需時間的經(jīng)驗值),然后在后臺維護一 個優(yōu)先級列表,根據(jù)用戶設(shè)置的時間,優(yōu)先處理回收價值收益最大的那些Region,這也就是“Garbage First”名字的由來。
    這里可以這么理解:他把內(nèi)存分成了多個小塊,每個塊占用的內(nèi)存給記錄起來了,根據(jù)用戶設(shè)置的可停頓大小來決定回收塊的大小。


    將Java堆分成多個獨立Region后,Region里面存在的跨Region引用對象如何解決?

    使用記憶集避免全堆作為GC Roots掃描,每個Region都維護有自己的記憶集,使用到了雙向卡表(卡表是“我指向誰”,這種結(jié)構(gòu)還記錄了“誰指向我”)。Region數(shù)量比傳統(tǒng)收集器的分代數(shù)量明顯要多得多,故此G1至少要耗費大約相當于Java堆容量10%至20%的額 外內(nèi)存來維持收集器工作。

    在并發(fā)標記階段如何保證收集線程與用戶線程互不干擾地運行?

    這里首先要解決的是用戶線程改變對象引用關(guān)系時,必須保證其不能打破原本的對象圖結(jié)構(gòu),導致標記結(jié)果出現(xiàn)錯誤,CMS收集器采用增量更新算法實現(xiàn),而G1 收集器則是通過原始快照(SATB)算法來實現(xiàn)的。G1把Region中的一部分空間劃分出來用于并發(fā)回收過 程中的新對象分配,這部分空間不納入回收范圍。與CMS中類似,如果內(nèi)存回收的速度趕不上內(nèi)存分配的速度, G1收集器也要被迫凍結(jié)用戶線程執(zhí)行,導致Full GC而產(chǎn)生長時間“Stop The World”。

    如果我們不去計算用戶線程運行過程中的動作(如使用寫屏障維護記憶集的操作),G1收集器的 運作過程大致可劃分為以下四個步驟:

    • 初始標記(Initial Marking):僅僅只是標記一下GC Roots能直接關(guān)聯(lián)到的對象,并且修改TAMS 指針的值,讓下一階段用戶線程并發(fā)運行時,能正確地在可用的Region中分配新對象。這個階段需要 停頓線程,但耗時很短,而且是借用進行Minor GC的時候同步完成的,所以G1收集器在這個階段實際 并沒有額外的停頓。

    • 并發(fā)標記(Concurrent Marking):從GC Root開始對堆中對象進行可達性分析,遞歸掃描整個堆 里的對象圖,找出要回收的對象,這階段耗時較長,但可與用戶程序并發(fā)執(zhí)行。當對象圖掃描完成以 后,還要重新處理SATB記錄下的在并發(fā)時有引用變動的對象。

    • 最終標記(Final Marking):對用戶線程做另一個短暫的暫停,用于處理并發(fā)階段結(jié)束后仍遺留 下來的最后那少量的SATB記錄。

    • 篩選回收(Live Data Counting and Evacuation):負責更新Region的統(tǒng)計數(shù)據(jù),對各個Region的回 收價值和成本進行排序,根據(jù)用戶所期望的停頓時間來制定回收計劃,可以自由選擇任意多個Region 構(gòu)成回收集,然后把決定回收的那一部分Region的存活對象復(fù)制到空的Region中,再清理掉整個舊 Region的全部空間。這里的操作涉及存活對象的移動,是必須暫停用戶線程,由多條收集器線程并行 完成的。

    從上述階段的描述可以看出,G1收集器除了并發(fā)標記外,其余階段也是要完全暫停用戶線程的, 換言之,它并非純粹地追求低延遲,官方給它設(shè)定的目標是在延遲可控的情況下獲得盡可能高的吞吐 量,所以才能擔當起“全功能收集器”的重任與期望。

    毫無疑問,可以由用戶指定期望的停頓時間是G1收集器很強大的一個功能,設(shè)置不同的期望停頓 時間,可使得G1在不同應(yīng)用場景中取得關(guān)注吞吐量和關(guān)注延遲之間的最佳平衡。它默認的停頓目標為兩百毫秒,如果我們把停頓時間調(diào)得非常低,譬如設(shè)置為二十毫秒,很可能出現(xiàn)的結(jié) 果就是由于停頓目標時間太短,導致每次選出來的回收集只占堆內(nèi)存很小的一部分,收集器收集的速 度逐漸跟不上分配器分配的速度,導致垃圾慢慢堆積。所以通常 把期望停頓時間設(shè)置為一兩百毫秒或者兩三百毫秒會是比較合理的。

    從G1開始,不追求一次把整個Java堆全部清理干凈。只要收集的速度能跟得上對象分配的速度,那一切就能運作得很完美。

    G1和CMS區(qū)別:

  • G1是分Region的內(nèi)存布局、CMS采用分代
  • CMS“標記-清除”算法,G1基于“標記-整理”算法實現(xiàn)的收集器
  • G1每個Region都有一個記憶集,存儲對象的引用情況,主要是防止跨區(qū)引用。Region比較多,內(nèi)存占用自然大。CMS的記憶集只有一個,只需要處理老年代到新生代的引用。
  • 目前在小內(nèi)存應(yīng)用上CMS的表現(xiàn)大概率仍然要會優(yōu)于G1,而在大內(nèi)存應(yīng)用上G1則大多能發(fā)揮其 優(yōu)勢,這個優(yōu)劣勢的Java堆容量平衡點通常在6GB至8GB之間,當然,以上這些也僅是經(jīng)驗之談,不 同應(yīng)用需要量體裁衣地實際測試才能得出最合適的結(jié)論,隨著HotSpot的開發(fā)者對G1的不斷優(yōu)化,也 會讓對比結(jié)果繼續(xù)向G1傾斜。

    三、總結(jié)

    Java垃圾收集器也是在不斷的進化當中,從第一版Serial單線程收集器,再到ParNew收集器,再到吞吐量優(yōu)先Parallel Scavenge收集器,再到以獲取最短回收停頓時間為目標的CMS收集器,再到G1全功能的垃圾收集器。其實很多情況下,我們對收集器是無感知的。甚至很少一部分才會去真正了解收集器,甚至只知道垃圾回收是JVM做的,其他不關(guān)我的事。

    我個人感覺收集器就好比手機,雖然我們?nèi)巳嗽谟?#xff0c;但是根本沒人關(guān)心他到底是怎么做到的。不說別的,在了解完收集器之后,最起碼能讓你對JVM的了解更上一個檔次,在面試的時候也會讓自己游刃有余。

    3.1、JVM默認用的哪個收集器?

    查看當前JVM的垃圾收集器
    cmd中輸入以下命令:

    java -XX:+PrintCommandLineFlags -version

    JDK1.7 默認垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
    JDK1.8 默認垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
    JDK1.9 默認垃圾收集器G1

    在jdk8可以切換收集器嗎?

    可以,通過-XX:+UseG1GC便可以切換G1收集器。但是一般情況下不要切換,JDK8默認用了Parallel收集器,那他一定有他的原因,不管是版本兼容還是什么問題,總之肯定有他的原因,所以一般情況下不建議自己更改收集器,采用默認的即可。真正需要優(yōu)化了,可以選擇更改Parallel收集器的參數(shù),例如新生代老年代大小等等。

    3.2、Serial收集器

    特點

  • JDK 1.3.1之前是HotSpot虛擬機新生代 收集器的唯一選擇
  • 采用了整理復(fù)制算法
  • 單線程工作的收集器
  • 優(yōu)點

    • 占用內(nèi)存少,適合用在客戶端,客戶端一般是單線程并且占用內(nèi)存少,而Serial收集器完全可以滿足。

    缺點

    • 進行垃圾收集時,必須暫停其他所有工作線程,直到它收集結(jié)束

    3.3、ParNew收集器

    特點

  • 在JDK7首選的新生代收集器
  • ParNew收集器實質(zhì)上是Serial收集器的多線程并行版本
  • 采用了整理復(fù)制算法
  • 能與CMS 收集器配合工作
  • 優(yōu)點

    • 能與CMS 收集器配合工作

    缺點

  • 進行垃圾收集時,必須暫停其他所有工作線程,直到它收集結(jié)束
  • ParNew收集器在單核處理器的環(huán)境中絕對不會比Serial收集器有更好的效果,反而會有線程切換開銷。
  • 3.4、Parallel Scavenge收集器

    特點

  • 新生代收集器
  • 基于標記-復(fù)制算法
  • 目標是達到一個可控制的吞吐 量
  • 優(yōu)點

    • 提供了兩個參數(shù)可以控制停頓時間還有吞吐量大小,相比用其他的收集器,假如不懂收集器機制調(diào)優(yōu)很困難,而Parallel Scavenge收集器,我們只需要設(shè)置這兩個參數(shù)再加上堆大小,其他的交給虛擬機來控制即可。

    缺點

    • 控制停頓時間,就是將新生代調(diào)小,反而會導致頻繁GC

    可控制參數(shù)

    • -XX:MaxGCPauseMillis :控制最大垃圾收集停頓時間
    • -XX:GCTimeRatio :設(shè)置吞吐量大小
    • -XX:+UseAdaptiveSizePolicy :這是一 個開關(guān)參數(shù),當這個參數(shù)被激活之后,就不需要人工指定新生代的大小(-Xmn)、Eden與Survivor區(qū) 的比例(-XX:SurvivorRatio)、晉升老年代對象大小(-XX:PretenureSizeThreshold)等細節(jié)參數(shù) 了,虛擬機會根據(jù)當前系統(tǒng)的運行情況收集性能監(jiān)控信息,動態(tài)調(diào)整這些參數(shù)以提供最合適的停頓時 間或者最大的吞吐量。

    3.5、Serial Old收集器

  • Serial Old是Serial收集器的老年代版本
  • 標記-整理
  • 3.6、Parallel Old收集器

  • Parallel Old是Parallel Scavenge收集器的老年代版本
  • 標記-整理
  • Parallel Scavenge新生代收集器,當時老年代除了Serial Old(PS MarkSweep)收集器以外別無選擇,直到Parallel Old收集器出世,。
  • 3.7、CMS收集器

    特點

  • 以獲取最短回收停頓時間為目標
  • 標記-清除
  • 老年代收集器
  • 優(yōu)點:通過分步驟來降低停頓時間

  • 初始標記(CMS initial mark) :初始標記僅僅標記一下GC Roots能直接關(guān)聯(lián)到的對象,速度很快。
  • 并發(fā)標記(CMS concurrent mark) :并發(fā)標記階段就是從GC Roots的直接關(guān)聯(lián)對象開始遍歷整個對 象圖的過程。
  • 重新標記(CMS remark) :重 新標記階段則是為了修正并發(fā)標記期間,因用戶程序繼續(xù)運作而導致標記產(chǎn)生變動的那一部分對象的 標記記錄。
  • 并發(fā)清除(CMS concurrent sweep):并發(fā)清除階段,清理刪除掉標記階段判斷的已經(jīng)死亡的 對象。
  • 其中初始標記、重新標記這兩個步驟仍然需要“Stop The World”。
  • 缺點

  • CMS收集器,雖然將垃圾回收分成了幾步,間接的來區(qū)分出來哪些需要停止用戶線程,雖然這樣做可以在某程度上不會導致用戶線程停頓,卻會占用了一部分線程(或者說處理器的計 算能力),而導致應(yīng)用程序變慢,降低總吞吐量。
  • 邊清理邊運行的垃圾,垃圾回收沒辦法及時清理,因此還需要空出來很大的內(nèi)存來備用存放浮動垃圾。浮動垃圾的多少在于項目并發(fā)情況,假如那一瞬間訪問特別多,那自然占用堆內(nèi)存會很大,浮動垃圾空留空間是可以通過參數(shù)調(diào)的。
  • 基于標記清除,就會有內(nèi)存碎片問題。
  • 可控制參數(shù)

    • -XX:+UseCMS-CompactAtFullCollection:開啟標記整理,整理階段是沒辦法運行用戶線程的。
    • -XX:CMSFullGCsBefore- Compaction:該參數(shù)可以設(shè)置次數(shù),也就是gc幾次的時候,用一次標記整理,避免了非得到無法分配的情況才去整理,導致線程停頓。

    3.8、G1收集器

    特點

  • JDK 9 G1宣告取代Parallel Scavenge加Parallel Old組合
  • 目標是在延遲可控的情況下獲得盡可能高的吞吐量
  • 不再采用年輕代、老年代,而是把連續(xù)的Java堆劃分為多個大小相等的獨立區(qū)域(Region),那也就是說別的收集器都采用了分代,老年代和新生代各自有各自的收集器,所以必須要組合起來用,而G1被Oracle官方稱為“全功能的垃圾收集器”,也就是只需要用這一個收集器。
  • 優(yōu)點

  • G1收集器去跟蹤各個Region里面的垃 圾堆積的“價值”大小,維護一 個優(yōu)先級列表,根據(jù)用戶設(shè)置的時間,優(yōu)先處理回收價值收益最大的那些Region。說白了,就是你能接受的停頓時間大,收集器就能多釋放點內(nèi)存,假如你設(shè)置的小,他就只能少釋放點,盡可能減少停頓時間,但是不可能控制的那么精準。

  • 他跟CMS一樣,采用了分步來完成收集:

  • 初始標記(Initial Marking):僅僅只是標記一下GC Roots能直接關(guān)聯(lián)到的對象,停頓線程,但耗時很短,而且是借用進行Minor GC的時候同步完成的
  • 并發(fā)標記(Concurrent Marking):從GC Root開始對堆中對象進行可達性分析,找出要回收的對象
  • 最終標記(Final Marking):用于處理并發(fā)階段結(jié)束后仍遺留 下來的最后那少量的SATB記錄(SATB記錄我理解的就是回收和用戶線程并行時候所產(chǎn)生的記錄)。
  • 篩選回收(Live Data Counting and Evacuation):負責更新Region的統(tǒng)計數(shù)據(jù),對各個Region的回 收價值和成本進行排序,根據(jù)用戶所期望的停頓時間來制定回收計劃
  • 除了并發(fā)標記外,其余階段也是要完全暫停用戶線程的
  • 缺點

  • 使用記憶集來記錄夸區(qū)域引用對象,使用記憶集避免全堆作為GC Roots掃描,每個Region都維護有自己的記憶集,Region數(shù)量多,故此G1至少要耗費大約相當于Java堆容量10%至20%的額 外內(nèi)存來維持收集器工作。
  • 可控制參數(shù)

    • -XX:G1HeapRegionSize:設(shè)置每個Region的大小
    • -XX:MaxGCPauseMillis:設(shè)定允許的收集停頓時間

    總結(jié)

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

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

    91在线最新 | 亚洲精品动漫在线 | 国产一线二线三线性视频 | 在线观看91av| 亚洲女人天堂成人av在线 | 亚洲永久国产精品 | 天天干天天色2020 | 久久高清免费视频 | 国产精品国产三级国产不产一地 | 91在线小视频 | 美女精品在线 | 98超碰在线观看 | 麻豆传媒一区二区 | 日韩资源在线 | 99在线观看视频网站 | 日韩r级在线 | 久久免费视频7 | 视频一区二区免费 | 人人爽久久久噜噜噜电影 | 中文十次啦 | 涩av在线| 亚洲成a人片在线www | 久久国产精品第一页 | 亚洲精品国产综合久久 | 视频一区二区在线 | 国产精品久久伊人 | 96久久久 | 四季av综合网站 | 激情网色| 久草99| 国产精品电影一区二区 | 69中文字幕 | 美女黄视频免费看 | 国产精品影音先锋 | 中文字幕人成乱码在线观看 | 五月激情亚洲 | 久久综合丁香 | 高清免费av在线 | 又黄又爽的视频在线观看网站 | 看片网站黄 | 日日夜夜天天射 | 国产一区二区影院 | 国产精品第54页 | 在线不卡视频 | 综合色天天 | 日韩在线免费视频观看 | 国产视频一二区 | h视频在线看 | 视频二区在线 | 91桃色国产在线播放 | 深爱激情五月综合 | 国产在线高清精品 | 国产香蕉视频在线播放 | 国产精品电影一区 | 日韩一区二区免费播放 | 又黄又爽又无遮挡免费的网站 | 成人久久久久久久久 | 国产美女在线观看 | 亚洲成免费 | 国产精品久久久久一区 | 中文字幕日韩国产 | 成年人免费电影 | 欧美日韩免费一区二区 | 国产精品av免费在线观看 | 在线观看一级片 | 久久日韩精品 | 国产精品免费久久久久久久久久中文 | 在线观看国产区 | 国产专区免费 | 超碰在线最新网址 | 欧美日韩网址 | 国产v在线 | 国产亚洲欧美精品久久久久久 | 欧美在线一级片 | 五月天丁香视频 | 午夜精品久久久久久久爽 | 在线看日韩av | 亚洲精品1区2区3区 超碰成人网 | 一区二区三区日韩在线 | 国产精品毛片久久 | av观看在线观看 | 日日爱网站 | 色综合久久精品 | 国产白浆在线观看 | 成人免费网站视频 | 亚洲精品国偷自产在线91正片 | 亚洲精品国产精品国自产观看 | 日本二区三区在线 | 午夜三级福利 | 久久男人视频 | 天天鲁一鲁摸一摸爽一爽 | 手机av在线不卡 | 国产中文字幕久久 | 亚洲成人国产精品 | 国产视频在线一区二区 | 国产精品爽爽久久久久久蜜臀 | 国产精品第一页在线观看 | 婷婷激情五月 | 欧美 日韩 视频 | 九九九九九精品 | 天堂av网在线 | 成人午夜在线电影 | 国产淫片| 国产精品18久久久久久不卡孕妇 | 啪啪免费观看网站 | 亚洲九九九 | 久久精品高清视频 | 亚洲成色777777在线观看影院 | 99热精品久久 | 国产剧在线观看片 | 久久午夜电影院 | 日韩精品免费在线 | 99免费在线视频 | 中文在线字幕免费观看 | 超碰在线人人艹 | 精品极品在线 | 在线观看 国产 | 国产一区二区在线播放视频 | 国产精品麻豆三级一区视频 | 成人免费观看在线视频 | 91亚洲精 | 国产中文字幕国产 | 欧美日韩在线第一页 | 亚洲少妇自拍 | 精品乱码一区二区三四区 | 国内丰满少妇猛烈精品播放 | 日韩电影在线观看一区二区 | 992tv人人网tv亚洲精品 | 日韩在线视频免费播放 | 91久久国产综合精品女同国语 | 久久精品www人人爽人人 | 久久久久久久久久免费 | 国产精品久免费的黄网站 | 中文字幕中文字幕在线一区 | 欧美色图亚洲图片 | 亚州黄色一级 | 久久久久综合视频 | 欧美在线观看视频一区二区三区 | 超碰在线1 | av网址最新 | 九九精品久久 | 成人av.com| 久草在线在线视频 | 婷婷深爱| 精品国产一二三四区 | 日本mv大片欧洲mv大片 | 操老逼免费视频 | 在线观看免费91 | 国产成人99久久亚洲综合精品 | 国产做aⅴ在线视频播放 | 日本精品久久久一区二区三区 | 黄色小说免费在线观看 | 干 操 插| 手机看片午夜 | 成人av在线一区二区 | 欧美成人一区二区 | 日日夜色| 国产日韩三级 | 国产免费a| 久久久精品国产一区二区电影四季 | 狠狠色丁香婷婷综合久久片 | 69国产盗摄一区二区三区五区 | 成年人视频在线免费观看 | 在线v片| 中文网丁香综合网 | 国产白浆在线观看 | 国产小视频91 | 91九色免费视频 | 99在线看 | 成人av在线直播 | 亚洲午夜精品久久久久久久久久久久 | 日韩av资源站| 国产色视频网站 | 日韩精品视频在线免费观看 | 免费在线观看日韩 | 国产aaa大片 | 精品国产人成亚洲区 | 精品福利网站 | а天堂中文最新一区二区三区 | 国产又粗又长的视频 | 中文字幕一二 | 午夜久久美女 | 99精品国产99久久久久久福利 | 欧美孕妇与黑人孕交 | 日本爽妇网 | 国产精品视频永久免费播放 | 久久成人国产精品入口 | 欧美日韩国产区 | 天天操狠狠操 | 欧美日韩国产在线精品 | 手机在线永久免费观看av片 | 久久影视精品 | 天天人人综合 | 日韩免费观看一区二区三区 | 一本一本久久a久久精品牛牛影视 | 国产精品美女久久久久久免费 | 一级成人网 | 亚洲激情六月 | 国产生活一级片 | a天堂最新版中文在线地址 久久99久久精品国产 | 天天弄天天操 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 久久久精品国产一区二区三区 | 就要色综合 | 日韩精品免费一线在线观看 | 首页国产精品 | 玖玖在线播放 | 久久久免费高清视频 | 99精品国产一区二区 | 亚洲精品日韩在线观看 | 999视频在线播放 | 日日爱av| 美国av大片 | 久草视频在线看 | 中文字幕一区二区三区视频 | 欧美精彩视频在线观看 | 一区二区av | 亚洲天堂毛片 | 国产一二区视频 | 91原创在线观看 | 中文字幕亚洲欧美日韩 | 99日精品| 欧美色黄 | 午夜aaaa| 99亚洲精品 | 亚洲视频在线播放 | 日韩激情片在线观看 | 六月丁香婷婷久久 | 久久精品三级 | 国产在线欧美 | 久久99网站 | 18久久久 | 亚洲精品视频在线观看免费视频 | 国产高清专区 | 婷婷色五 | 三级在线播放视频 | 91亚洲视频在线观看 | 欧美-第1页-屁屁影院 | 超碰在97 | 中文字幕视频三区 | 九九免费观看视频 | 亚州精品在线视频 | 久久天天草| 狠狠躁夜夜躁人人爽超碰97香蕉 | 国产一区二区不卡视频 | 亚洲激情网站免费观看 | 日本电影久久 | 免费观看的黄色片 | 国产一级片不卡 | 亚洲精品综合在线 | 成人在线视频论坛 | 99视频在线观看视频 | 中文字幕在线看片 | 久久精品欧美日韩精品 | 国产糖心vlog在线观看 | 激情喷水 | 91精品一区二区三区久久久久久 | 久久激情小说 | 缴情综合网五月天 | 五月婷婷综合激情 | 天天操天天艹 | 国产精品美女久久久久久久 | 久久国产午夜精品理论片最新版本 | 色综久久 | 欧美 日韩 性 | av+在线播放在线播放 | 91九色综合 | 操操操av | 99精品视频免费看 | 亚洲伊人第一页 | 99久久国产免费,99久久国产免费大片 | 亚洲一二三久久 | 国产在线日本 | 97色资源| 国产一区二区在线精品 | 超碰在线91 | 青青河边草手机免费 | 国产精品一区二区av麻豆 | 黄色在线视频网址 | 免费av大片 | 久久麻豆精品 | 99九九99九九九视频精品 | 88av网站| 成人av视屏 | 国产精品网红福利 | 人人插人人舔 | 中文字幕91 | 玖玖在线观看视频 | 99精品视频一区二区 | 国产免码va在线观看免费 | 日韩精品电影在线播放 | 国产精品美女999 | 成人一级在线观看 | 免费视频色 | 日韩在线看片 | 国产一级免费在线 | 国产精品99久久久久久武松影视 | 亚洲美女免费精品视频在线观看 | 国产成人精品一二三区 | 国产精品私人影院 | 91色国产| 国产成人专区 | 婷婷成人综合 | 久久夜靖品 | 国产日韩三级 | 日韩二区三区 | 欧美日韩一区二区在线观看 | 久久伦理网 | 日韩在线免费高清视频 | 亚洲最新在线 | 精品国产免费看 | 国产精品成人自产拍在线观看 | 欧美激情精品久久久久久变态 | 国产手机视频在线播放 | 天天玩夜夜操 | 中文字幕一区二区三区四区在线视频 | 美腿丝袜一区二区三区 | 亚洲自拍偷拍色图 | 精品国产精品久久 | 成人黄色短片 | 日韩一二三| 亚洲一区精品人人爽人人躁 | 日韩久久片 | 成人av免费 | 99久久精品国产网站 | 懂色av一区二区三区蜜臀 | 最新色站 | 天天操天天操天天操天天 | 免费看三级网站 | 四虎成人免费影院 | 激情丁香 | 狠狠狠综合| 懂色av一区二区三区蜜臀 | .国产精品成人自产拍在线观看6 | 日本黄网站 | 亚洲 欧美 精品 | 国产精品白浆 | 亚洲一级二级三级 | 欧美吞精| 精品国产三级a∨在线欧美 免费一级片在线观看 | 在线观看国产一区 | 国产精品白虎 | 色99之美女主播在线视频 | 国产青春久久久国产毛片 | 黄色软件视频大全免费下载 | 四虎国产| 91在线观看高清 | 成人毛片一区 | 中文字幕中文字幕在线中文字幕三区 | 日韩在线高清免费视频 | 国产高清视频在线免费观看 | 人人草在线视频 | 91久久人澡人人添人人爽欧美 | 91久久久久久久一区二区 | 亚洲精品动漫在线 | www五月天com| av青草 | 中文资源在线播放 | 日韩欧三级| 国内精品美女在线观看 | 亚洲视频,欧洲视频 | 日韩一二三在线 | 在线国产一区 | av大片免费在线观看 | 成人中文字幕在线观看 | 国产不卡免费av | 五月天激情综合 | 97精品在线观看 | 国产精品中文久久久久久久 | 日本美女xx | av免费在线网站 | 亚洲精品一区中文字幕乱码 | av网站在线观看免费 | 一区二区视频播放 | 婷婷丁香激情综合 | 久久国产精品影视 | 亚洲视频免费 | 激情五月婷婷激情 | 国产精品久久久久久久久久直播 | av在线播放不卡 | 亚洲色图27p | 91九色在线视频观看 | 激情中文在线 | 91桃色在线免费观看 | 五月婷婷视频在线 | 免费又黄又爽的视频 | 国产精品一区二区av | 亚洲精品456在线播放 | 99热只有精品在线观看 | 欧美日韩激情视频8区 | 99精品视频免费看 | 久草精品电影 | 伊人五月天av| 六月婷婷网 | av在线官网| 天天干夜夜爱 | 欧美日韩国产精品一区二区 | 欧美大片aaa | 日韩网 | 午夜久久久久久久 | 久久精品国产免费看久久精品 | 韩国av三级 | 在线а√天堂中文官网 | 成人免费看电影 | 精品99在线观看 | 97视频在线免费 | 日批网站在线观看 | www.婷婷com| 国产麻豆视频免费观看 | 免费av片在线 | 日韩视频中文 | 国产精品大片在线观看 | 特级片免费看 | 久久特级毛片 | 久久国产精品久久w女人spa | 免费色视频网址 | 精品91久久久久 | 日本午夜在线观看 | 综合激情网... | 久久国内精品99久久6app | 一级片视频在线 | 婷婷激情综合五月天 | 91色蜜桃 | 精品国产乱码久久久久 | av片在线观看 | 国产福利一区二区在线 | 国产在线最新 | 国产成人久久精品亚洲 | 亚洲激情网站免费观看 | 在线观看的av网站 | 欧美成人一二区 | 五月婷婷伊人网 | 午夜在线看片 | 在线观看日韩专区 | 久久一区二区三区国产精品 | 日韩免费视频网站 | 在线观看爱爱视频 | 国产超碰在线 | 国产a视频免费观看 | 精品国产一区二区三区四区vr | 91高清不卡 | 99夜色 | 蜜臀av性久久久久av蜜臀妖精 | 午夜美女福利直播 | 亚洲国产成人高清精品 | 99精品免费 | 国产精品资源 | 91在线资源 | 国产美女主播精品一区二区三区 | 香蕉视频在线播放 | 美女视频黄的免费的 | 欧美一区在线看 | 国产色视频网站2 | 国产精品久久一区二区三区, | 国产一区二区三区午夜 | 97超碰人人干| 91看片看淫黄大片 | 亚洲精品乱码久久久久久蜜桃91 | 色播激情五月 | 在线国产一区 | 精品999 | 欧美成人aa | 久久99久久99精品免观看粉嫩 | 麻豆视频一区 | 欧美日韩国产在线 | 91理论电影| 国产一级电影免费观看 | 在线观看成年人 | av在线免费播放网站 | 天天做天天爱天天综合网 | 国产视频欧美视频 | 久久久久久欧美二区电影网 | 久久精品国产久精国产 | 欧美影片| 日韩三级免费 | 麻豆一区二区三区视频 | 午夜电影一区 | 国产精品久99 | 国产精品a级 | 久久综合婷婷国产二区高清 | 色婷婷av国产精品 | 天天干天天干天天 | 综合网天天 | www.com黄| 日韩v在线 | 成人毛片久久 | 成人免费看视频 | 玖玖视频精品 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 六月丁香激情综合色啪小说 | 国产美女搞久久 | 97国产小视频 | 九九精品久久久 | 综合久久久 | 狠狠的干狠狠的操 | 国产中文字幕在线 | 91免费在线视频 | 亚洲精品国产精品久久99热 | 久久久精品小视频 | 激情图片区 | 2021国产在线视频 | 国产一区二区三精品久久久无广告 | 日批在线看 | 天天操综| 麻豆94tv免费版 | 中文字幕在线观看免费 | 99热这里| 在线观看欧美成人 | 国产亚洲精品久久久久秋 | 9在线观看免费高清完整版在线观看明 | 日本视频久久久 | 最近日本韩国中文字幕 | 黄色成人影院 | 欧美有色| 色综合 久久精品 | 四虎在线免费 | 黄色小网站在线 | 欧美五月婷婷 | 天天色天天综合 | 精品九九九九 | 国产群p | 午夜av在线免费 | 一区二区三区免费在线播放 | 99精品系列| av免费在线网站 | 久久久久久久久福利 | 日韩在线 | avv天堂| 国产偷国产偷亚洲清高 | 亚洲一区天堂 | 亚洲人毛片 | www.狠狠色.com | 成年人av在线播放 | 天天天色综合 | 国产午夜在线 | 97视频免费在线观看 | 欧美激情操 | 日本久久免费电影 | 精品国产一区二区在线 | 国产午夜精品久久久久久久久久 | 国产中文字幕在线观看 | 免费在线观看污 | 1024在线看片| 日韩在线视 | 99中文字幕| 免费亚洲视频在线观看 | 丁香花在线观看视频在线 | www.亚洲精品视频 | 蜜桃av人人夜夜澡人人爽 | 国产成人福利 | 米奇狠狠狠888 | 亚洲一区在线看 | 五月婷婷国产 | 91精品啪在线观看国产81旧版 | 激情动态 | 亚洲成人频道 | 99精品免费久久久久久久久日本 | 久久精品综合 | 91成人网在线观看 | 欧美一二区视频 | 91成人欧美 | 久久精品欧美一区二区三区麻豆 | 亚洲精品麻豆视频 | 久久久九九 | 免费久草视频 | 久久精品之| 81精品国产乱码久久久久久 | 亚洲国产精品成人综合 | 国产福利资源 | 日本久久久精品视频 | 美女久久久久久久久久 | 成人久久18免费网站麻豆 | 欧美激情精品久久久久久免费印度 | 久久精品欧美日韩精品 | 欧美大荫蒂xxx | 久久久www成人免费精品张筱雨 | 99在线精品视频观看 | 国产大尺度视频 | 九九久久久久久久久激情 | 日色在线视频 | 在线精品视频免费播放 | 在线天堂视频 | 在线精品亚洲一区二区 | 麻豆一精品传二传媒短视频 | 亚洲jizzjizz日本少妇 | 最近2019好看的中文字幕免费 | 欧美日本中文字幕 | 免费国产在线观看 | 五月婷丁香网 | 国产黄色片网站 | 国产一级片视频 | 欧美性色黄大片在线观看 | 天天做天天爽 | 久久国产一区二区三区 | 丰满少妇一级片 | 玖玖爱在线观看 | 国产电影一区二区三区四区 | 婷婷视频导航 | 高清在线观看av | 精品国产观看 | 天天摸夜夜操 | 亚洲精品国偷拍自产在线观看 | 成人免费精品 | 国产资源av | 亚洲激情国产精品 | 综合久久影院 | 五月婷在线播放 | 久久精品毛片 | 丰满少妇在线观看网站 | 国内精品久久久久影院优 | 精品国产伦一区二区三区 | 久久精品网址 | 婷婷综合五月天 | 人人狠狠综合久久亚洲 | 成人免费xxx在线观看 | 亚洲在线网址 | 免费看一级一片 | 精品久久久免费视频 | 亚洲精品乱码久久久久久写真 | 欧美91成人网 | 久久亚洲欧美 | 婷婷成人亚洲综合国产xv88 | 国产综合在线观看视频 | 欧美一级网站 | 精品久久久久久久久中文字幕 | 欧美污污视频 | 91人人澡人人爽人人精品 | 欧美日韩中字 | 在线v片免费观看视频 | 91在线看视频免费 | 美女黄频网站 | 狠狠色狠狠色合久久伊人 | 久久草草热国产精品直播 | 亚洲精品高清一区二区三区四区 | 国产一级片久久 | 久草在线视频免费资源观看 | 五月激情久久 | 精品国产免费看 | 免费看国产黄色 | 中文在线免费一区三区 | 成人久久精品视频 | 一区中文字幕在线观看 | 欧美乱淫视频 | 福利视频一二区 | 免费精品久久久 | 国产成人久久精品亚洲 | 久久xx视频 | 久久国产精品久久精品国产演员表 | 亚洲永久字幕 | 色婷婷久久一区二区 | 国产亚洲精品久久网站 | 天天爱综合 | 国产亚洲精品久久久久久电影 | 国内精品久久久久久久97牛牛 | 在线中文字幕视频 | 射射色| 黄色成年 | 成 人 免费 黄 色 视频 | 中文不卡视频 | 97国产人人| 欧美日韩精品区 | 日韩网页| 在线 视频 亚洲 | 久草在线观看视频免费 | 五月婷婷视频在线观看 | 亚洲欧洲精品在线 | 99久久精品国产一区二区三区 | 91成人破解版 | 成人毛片在线观看视频 | 国产精品毛片一区二区 | 成年人国产视频 | 麻豆免费视频网站 | 在线观看av小说 | 欧美国产日韩在线观看 | 日韩一区在线免费观看 | 久久69av | 日韩欧美不卡 | 在线三级播放 | 成人h在线 | 国产91精品一区二区绿帽 | 91毛片视频| 黄色毛片网站在线观看 | 一区二区中文字幕在线播放 | 亚洲最新av在线网站 | 亚洲人成综合 | 亚洲午夜精品一区 | 久久黄网站 | 国产正在播放 | 成人毛片一区 | 久久中文字幕在线视频 | 99久久精品国产一区二区成人 | 欧美日韩久久 | 欧美日韩三级在线观看 | 国产女人40精品一区毛片视频 | 一本一本久久aa综合精品 | av一级片| 国产精品美女视频网站 | 99久久99视频只有精品 | 午夜精品一区二区三区可下载 | 久久久久久久久福利 | 日韩精品一区二区三区中文字幕 | 97成人超碰 | 天天综合网久久综合网 | 激情综合啪啪 | 久久精品久久精品久久精品 | 色噜噜狠狠狠狠色综合久不 | 中文字幕视频网 | 国产成人精品三级 | 97超在线视频 | 日韩在线视频一区 | 人人插人人做 | 成人免费视频播放 | 精品久久久久久久久久久久久久久久久久 | 国产大陆亚洲精品国产 | 日韩久久久久久久久 | 久久久久久久久久免费 | 99色亚洲 | 99re久久资源最新地址 | 久久久久国产精品午夜一区 | av黄色国产 | 日韩一级电影网站 | av在线小说 | 午夜黄色一级片 | 久久久蜜桃一区二区 | 日本少妇久久久 | 不卡的一区二区三区 | 中文av资源站 | 久久精品一级片 | 免费成人av电影 | 国产麻豆精品久久一二三 | 中文字幕第| 亚洲国产成人av网 | 在线观看日韩中文字幕 | 日本中文字幕在线观看 | 亚洲视频在线观看免费 | 久久超碰在线 | 欧美日韩在线精品一区二区 | 久久久久免费视频 | 免费看片网页 | 亚洲黄色高清 | 久久视频精品 | 国产 字幕 制服 中文 在线 | 久久久久久久久网站 | 美女视频黄,久久 | 免费在线播放黄色 | 成人在线免费看视频 | 成人啪啪18免费游戏链接 | 国产小视频在线播放 | 91人人爽久久涩噜噜噜 | a黄色片在线观看 | 黄色一级大片免费看 | 91人人网| 国产精品色婷婷视频 | 激情五月看片 | 一本一本久久a久久精品综合 | 日韩av一区二区在线 | 成人一区影院 | 国产在线观看黄 | 欧美资源在线观看 | 免费网站在线观看人 | 日韩av电影中文字幕 | 亚洲人成人在线 | 久久视频精品在线观看 | 久久国产精品电影 | 夜夜视频资源 | 国产精品99蜜臀久久不卡二区 | 精品国产一二三 | 欧美在线视频免费 | 国产精品 999| 97视频在线免费 | 亚洲另类在线视频 | 日本精品一区二区三区在线观看 | 亚洲人成人99网站 | 免费观看91视频大全 | 日本老少交| 国产主播大尺度精品福利免费 | 就要色综合 | 成年人免费观看在线视频 | 伊人伊成久久人综合网小说 | 欧美一区二区免费在线观看 | 色wwww| 天天射天 | 欧美精品亚州精品 | 中文字幕日韩在线播放 | 麻豆视屏| 国产在线观看你懂得 | 久久男人中文字幕资源站 | 亚洲天堂网在线播放 | 久久激情五月婷婷 | 美腿丝袜一区二区三区 | 久久精品三 | 日韩一级片网址 | 国产精品久久久久av福利动漫 | 久99精品 | 99在线精品视频在线观看 | 国产 精品 资源 | 亚洲欧美精品一区 | 久久66热这里只有精品 | 99精品视频在线免费观看 | 摸阴视频 | av资源免费观看 | 国产精品亚洲视频 | 久久在线观看视频 | 美女黄频在线观看 | 99久久婷婷国产综合精品 | 伊人五月天.com | 国产一级免费电影 | 久久综合毛片 | 国产一区二区不卡视频 | 丰满少妇一级 | 丁香 婷婷 激情 | 久久黄色a级片 | 久久午夜色播影院免费高清 | 国产综合精品久久 | 99久久99热这里只有精品 | 国产三级午夜理伦三级 | 久久久国际精品 | 国产一区二区三区黄 | 中文字幕亚洲精品日韩 | 最近中文字幕 | 亚洲天堂精品视频 | 91亚洲国产成人 | 青青草国产在线 | 97免费在线观看 | 最新国产精品久久精品 | 国产一级淫片免费看 | 欧美成人基地 | 五月丁色| 免费日韩一级片 | www.在线观看视频 | 日韩一级片大全 | 国产丝袜制服在线 | 成人黄色免费观看 | 日韩无在线| 奇米网在线观看 | 日韩a欧美| 在线观看视频你懂得 | 精品在线观看一区二区 | 中文字幕视频网站 | 欧美小视频在线 | 成片免费观看视频999 | 亚洲黄色在线 | japanesefreesexvideo高潮 | 国产va精品免费观看 | 国产资源在线观看 | 久久天天躁夜夜躁狠狠躁2022 | 四虎在线视频免费观看 | 麻豆国产在线视频 | 91丨九色丨国产在线 | 六月色播 | 久久久一本精品99久久精品66 | 国产精品自产拍在线观看中文 | 国产男女爽爽爽免费视频 | 欧美日韩久久不卡 | 免费观看www7722午夜电影 | 怡春院av | 亚洲人成人在线 | 精品在线一区二区 | 午夜精品一区二区三区在线播放 | 国内综合精品午夜久久资源 | 久久综合给合久久狠狠色 | 久久久久欠精品国产毛片国产毛生 | 国产精品theporn| 91.dizhi永久地址最新 | 久久看片| 日本中出在线观看 | 人人超碰人人 | 国产精品一区二区三区免费视频 | 在线观看免费黄色 | 中文av在线免费观看 | 成人国产精品免费观看 | 日韩高清一区二区 | 四虎影视国产精品免费久久 | 亚洲一级特黄 | 午夜视频在线观看一区二区三区 | 婷婷在线免费视频 | 九九热在线观看视频 | 久久视频中文字幕 | 久久久久久国产精品 | 91精品国产高清 | 搡bbbb搡bbb视频| 超碰97中文 | 欧美日韩在线视频观看 | 在线观看免费视频 | 精品国产乱码久久久久久1区二区 | 久草在线一免费新视频 | 中文字幕一区二区三区四区 | 国产免费观看视频 | 亚洲成av人片在线观看香蕉 | 日本性生活免费看 | 成人va视频 | 免费高清影视 | 国产高h视频 | 国产精品小视频网站 | 欧美特一级 | 成人电影毛片 | 99视频+国产日韩欧美 | 香蕉网在线观看 | 精品国偷自产在线 | 国产乱码精品一区二区蜜臀 | 国产第一页在线播放 | 久久人人添人人爽添人人88v | 日韩av网站在线播放 | 亚洲欧美日韩中文在线 | 国产精品手机视频 | 日本黄网站 | 精品 一区 在线 | 日韩av高清 | 国产成人精品免费在线观看 | aaa毛片视频| 日韩高清一区在线 | 色.www| 欧美日韩另类在线观看 | 亚洲经典视频在线观看 | 亚洲中字幕 | 亚洲h在线播放在线观看h | 国产精品99久久久久的智能播放 | 久久综合五月 | 又黄又刺激又爽的视频 | 在线视频观看你懂的 | 免费a级观看 | 91在线视频网址 | 国产精品久久久久久69 | 欧美日韩亚洲精品在线 | 亚洲精品久久久久www | 精品三级av | 色婷婷综合久久久久 | 日韩av电影免费观看 | 视频在线99re | 亚洲伦理一区 | 操少妇视频 | 91桃色在线观看视频 | 亚洲精品国内 | 亚洲四虎影院 | 成年人在线免费看视频 | 香蕉精品视频在线观看 | 9999免费视频 | 午夜精品久久久久久久99无限制 | 免费在线成人 | 免费观看丰满少妇做爰 | 国产高清在线观看av | 日韩字幕 | 韩日精品在线 | 成人观看视频 | 伊人开心激情 | 久久69精品久久久久久久电影好 | 中文在线免费视频 | 久久国产精品久久久久 | 91在线视频观看 | 亚洲精品动漫成人3d无尽在线 | 亚洲欧美日韩精品久久久 | 激情欧美在线观看 | 中文字幕在线观看免费观看 | 成人污视频在线观看 | 天天干天天干天天 | 91在线小视频 | 久久精品日本啪啪涩涩 | 中文乱幕日产无线码1区 | 超碰av在线免费观看 | 五月天.com| 精品国产一区二区三区免费 | 麻豆视频一区二区 | 日韩精品视频免费 | 免费日韩 精品中文字幕视频在线 | 日韩精品一区二区久久 | 亚洲视频 视频在线 | 亚洲欧美日韩国产精品一区午夜 | 国产精品成人在线 | 中文字幕av在线播放 | 国产在线精品视频 | 日本在线中文 | 性色av免费在线观看 | 最新日本中文字幕 | www..com黄色片| 最近中文字幕大全中文字幕免费 | av免费观看高清 | 国产成人精品午夜在线播放 | 日韩动漫免费观看高清完整版在线观看 | 久久久久免费网站 | 欧美黑人xxxx猛性大交 | 免费在线黄| 国产91精品一区二区麻豆网站 | 四虎影视av | 国产精品久久久久久久久久久久午夜 | 最近最新mv字幕免费观看 | 亚洲精品免费在线 | 成人午夜免费剧场 | www.国产在线观看 | 国产亚洲一区二区在线观看 | 成人黄色在线播放 | 国产在线最新 | 一区二区欧美在线观看 | av福利在线播放 | 久久五月婷婷综合 | 国产精品一区二区麻豆 | 在线三级av| 五月婷婷色丁香 | 天堂网在线视频 |