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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JVM中垃圾收集算法总结

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

??通過前面的介紹我們了解了對象創建和銷毀的過程。那么JVM中垃圾收集器具體對對象回收采用的是什么算法呢?本文主要記錄下JVM中垃圾收集的幾種算法。

文章目錄

  • JVM的垃圾回收的算法
    • 標記-清除算法(Mark-Sweep)
    • 復制算法(Copying)
    • 標記-整理算法(Mark-Compact)
    • 分代收集算法
      • 1.年輕代
      • 2.老年代
      • 3.永久代

JVM的垃圾回收的算法

標記-清除算法(Mark-Sweep)

??標記清除算法是最基礎的回收算法,該算法分為兩個階段,即標記階段和清除階段。

階段說明
標記階段先根據可達性分析算法找出需要回收的對象進行標記
清除階段統一回收被標記的對象

參考《深入理解java虛擬機》:

從可達性分析算法角度看標記-清除算法

該算法不足有兩點:

  • 效率問題:標記和清理的效率都不高
  • 空間問題:造成很多不連續的空間,如果要存儲大對象,從而不得不提前觸發GC回收操作
  • 復制算法(Copying)

    ??復制算法是為了解決標記清除算法效率不高的問題而產生的,該算法的思路是。將內存空間一分為二(大小相等)。每次只使用其中一塊來存儲對象,當一塊內存使用的差不多的時候就將這塊中還存活的對象就復制到另一塊內存中,然后清理掉已經使用過的那塊內存。如下


    這種算法的好處是每次直接對一半空間進行回收而且也不用考慮內存碎片的問題了,但是直接把空間砍掉一半。代價有點兒大。

    標記-整理算法(Mark-Compact)

    ??標記-整理算法采用標記-清除算法一樣的方式進行對象的標記,但在清除時不同,在回收不存活的對象占用的空間后,會將所有的存活對象往左端空閑空間移動,并更新對應的指針。標記-整理算法是在標記-清除算法的基礎上,又進行了對象的移動,因此成本更高,但是卻解決了內存碎片的問題

    分代收集算法

    ??分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根據對象存活的生命周期將內存劃分為若干個不同的區域。一般情況下將堆區劃分為老年代(Tenured Generation)和新生代(Young Generation),在堆區之外還有一個代就是永久代(Permanet Generation)。老年代的特點是每次垃圾收集時只有少量對象需要被回收,而新生代的特點是每次垃圾回收時都有大量的對象需要被回收,那么就可以根據不同代的特點采取最適合的收集算法。

    1.年輕代

    ??回收算法以Copying為主,新創建的對象都存放在這里。因為大多數對象很快變得不可達,所以大多數對象在年輕代中創建,然后消失。當對象從這塊內存區域消失時,我們說發生了一次“minor GC”

  • 所有新生成的對象首先都是放在年輕代的。年輕代的目標就是盡可能快速的收集掉那些生命周期短的對象。
  • 新生代內存按照8:1:1的比例分為一個eden區和兩個survivor(survivor0,survivor1)區。一個Eden區,兩個 Survivor區(一般而言)。大部分對象在Eden區中生成。回收時先將eden區存活對象復制到一個survivor0區,然后清空eden區,當這個survivor0區也存放滿了時,則將eden區和survivor0區存活對象復制到另一個survivor1區,然后清空eden和這個survivor0區,此時survivor0區是空的,然后將survivor0區和survivor1區交換,即保持survivor1區為空, 如此往復。
  • 當survivor1區不足以存放 eden和survivor0的存活對象時,就將存活對象直接存放到老年代。若是老年代也滿了就會觸發一次Full GC(Major GC),也就是新生代、老年代都進行回收。
  • 新生代發生的GC叫做Minor GC,MinorGC發生頻率比較高(不一定等Eden區滿了才觸發)。
  • 2.老年代

    ??回收算法主要以Mark-Compact為主,沒有變得不可達,存活下來的年輕代對象被復制到這里。這塊內存區域一般大于年輕代。因為它更大的規模,GC發生的次數比在年輕代的少。對象從老年代消失時,我們說“major GC”(或“full GC”)發生了

  • 在年輕代中經歷了N次垃圾回收后仍然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命周期較長的對象。

  • 內存比新生代也大很多(大概比例是1:2),當老年代內存滿時觸發Major GC即Full GC,Full GC發生頻率比較低,老年代對象存活時間比較長,存活率標記高。

  • 3.永久代

    ??用于存放靜態文件,如Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態生成或者調用一些class,例如Hibernate 等,在這種時候需要設置一個比較大的永久代空間來存放這些運行過程中新增的類。永久代也稱方法區,
    ??注意:這塊內存區域絕對不是永久的存放從老年代存活下來的對象的!!!在這塊內存中有可能發生垃圾回收。發生在這里垃圾回收也被稱為major GC

    總結

    以上是生活随笔為你收集整理的JVM中垃圾收集算法总结的全部內容,希望文章能夠幫你解決所遇到的問題。

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