日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JVM之垃圾收集机制四种GC算法详解

發(fā)布時間:2024/2/28 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM之垃圾收集机制四种GC算法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JVM之四種GC算法詳解


目錄:

  • 什么是GC?
  • GC算法之引用計數法
  • GC算法之復制算法(Copying)
  • GC算法之標記清除(Mark-Sweep)
  • GC算法之標記壓縮(Mark-Compact)
  • GC算法之標記清除壓縮(Mark-Sweep-Compact)
  • 小結

  • 1. 什么是GC?


    先看圖:

    GC是分代收集算法(更為專業(yè))

  • JVM在進行GC時,并非每次都對上面三個內存區(qū)域一起回收的,大部分時候回收的都是指新生代。
  • 因此GC按照回收的區(qū)域又分兩種類型,一種是普通GC(minor GC),一種是全局GC(major GC or Full GC)

  • Minor GC 和 Full GC的區(qū)別
  • 普通GC(minor GC):只針對在新生代區(qū)域的GC,指發(fā)生在新生代的垃圾收集動作,因為大多數Java對象存活率都不高,所以Minor GC非常頻繁,一般回收速度也比較快。
  • 全局GC(major GC or Full GC):指發(fā)生在老年代的垃圾收集動作,出現了Major GC,經常會伴隨至少一次的Minor GC(但不是絕對的)。Major GC的速度一般要比Minor GC慢上10倍以上。

  • 2. GC算法之引用計數法


    即當對象的引用為0的時候會被回收。


    3. GC算法之復制算法(Copying)


    (1)概述:

  • 年輕代使用的是Minor GC,這種GC算法采用的是復制算法。

  • (2)原理

  • Minor GC會把Eden中的所有活的對象都移到Survivor區(qū)域中,如果Survivor區(qū)放不下,那么剩下的活的對象就被移到Old generation中,也即一旦收集后,Eden是變成空的了。
  • 當對象在Eden(包括一個Survivor區(qū)域,這里假設是from區(qū)域)出生后,在經過一次Minor GC后,如果對象還存活,并且能夠被另一塊Survivor區(qū)域所容納(上面假設是from區(qū)域,這里應為to區(qū)域,即to區(qū)域有足夠的內存空間來存儲Eden和from區(qū)域存活的對象),則使用復制算法將這些仍然還存活的對象復制到另外一款Survivor區(qū)域(即to區(qū)域)中,然后清理所使用的Eden和Survivor(即from區(qū)域),并且這些對象的年齡設置為1,以后對象在Survivor區(qū)域每熬過一次Minor GC,就將對象的年齡+1,當對象的年齡達到某個值時(默認是15歲,通過 -XX:MaxTenuringThreshold來設定對象在新生代中存活的次數),這些對象就會成為老年代。
  • 復制算法的基本思想是將內存分為兩塊,每次只用到其中一塊,當這一塊內存用完,就將活著的對象復制到另外一塊上面。復制算法不會產生空間碎片。

  • (3)復制算法的缺點:

  • 浪費了一般的內存
  • 如果對象的存活率很高,我們可以極端一點,假設100%存活,那么我們需要將所有對象都復制一遍,并將所有引用地址重置一遍,復制這一工作所花費的時間,在對象存活率達到一定程度時,將會變得不可忽視。所以從以上的描述中不難看出,復制算法要想使用,最起碼對象的存活率要非常低才行,而且最重要的是,我們必須克服50%內存的浪費。


  • 4. GC算法之標記清除(Mark-Sweep)


    (1)概述:

  • 老年代一般是由標記清除或者是標記清除與標記整理的混合實現

  • (2)原理

    當堆中的有效內存空間(available memory)被耗盡的時候,就會停止整個程序(也被稱為stop the world),然后進行兩項工作,第一項則是標記,第二項則是清除。
  • 標記:從引用根節(jié)點開始標記所有的被引用的對象。標記的過程其實就是遍歷所有的GC Roots,然后將所有GC Roots可達的對象標記為存活的對象
  • 清除:遍歷整個堆,把未標記的對象清除。

  • (3)標記清除算法的缺點

  • 此算法需要暫停整個應用,會產生內存碎片。
  • 用通俗的話解釋一下標記清除算法,就是當程序運行期間,若可以使用的內存被耗盡的時候,GC線程就會被觸發(fā)并將程序暫停,隨后將依舊存活的對象標記一遍,最終再將堆中所以沒被標記的對象全部清除掉,接下來便讓程序恢復運行。


    (4)簡單圖:





    5. GC算法之標記壓縮(Mark-Compact)


    (1)概述:

  • 老年代一般是由標記清除或者是標記清除與標記整理的混合實現。

  • (2)原理


    (3)標記壓縮算法的缺點:

    1.標記整理算法的唯一的缺點就是效率也不高,不僅要標記所有存活對象,還要整理所有存活對象的引用地址。從效率上來說,標記整理算法要低于復制算法。


    6. GC算法之標記清除壓縮(Mark-Sweep-Compact)


    (1)概念:

  • 標記清除壓縮,不屬于四種GC算法。

  • 流程圖:



    7. 小結



    總結

    以上是生活随笔為你收集整理的JVM之垃圾收集机制四种GC算法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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