Java垃圾收集算法介紹

Java垃圾收集算法介紹

垃圾回收器GC(Garbage Collection)

  一厦取、引用計數(shù)算法(Reference Counting)

介紹:給對象添加一個引用計數(shù)器,每當一個地方引用它時就谜,數(shù)據(jù)器加1;當引用失效時,計數(shù)器減1腰懂;計數(shù)器為0的即可被回收玻粪。

優(yōu)點:實現(xiàn)簡單隅津,判斷效率高

缺點:很難解決對象之間的相互循環(huán)引用(objA.instance = objB; objB.instance = objA)的問題,所以java語言并沒有選用引用計數(shù)法管理內存

  二劲室、根搜索算法(GC Root Tracing)

Java和C#都是使用根搜索算法來判斷對象是否存活伦仍。通過一系列的名為“GC Root”的對象作為起始點,從這些節(jié)點開始向下搜索很洋,搜索所有走過的路徑稱為引用鏈(Reference Chain),當一個對象到GC Root沒有任何引用鏈相連時(用圖論來說就是GC Root到這個對象不可達時)充蓝,證明該對象是可以被回收的。

在Java中哪些對象可以成為GC Root?

  • 虛擬機棧(棧幀中的本地變量表)中的引用對象
  • 方法區(qū)中的類靜態(tài)屬性引用的對象
  • 方法區(qū)中的常量引用對象
  • 本地方法棧中JNI(即Native方法)的引用對象
image

  三喉磁、標記-清除算法(Mark-Sweep)

首先標記出需要回收的對象谓苟,在標記完成后統(tǒng)一回收掉所有的被標記對象。

缺點:效率問題和空間問題(標記清除后會產(chǎn)生大量的不連續(xù)內存碎片协怒,內存碎片過多可能會導致程序需要分配較大對象時找不到足夠大的連續(xù)內存空間而不得不提前觸發(fā)另一次垃圾回收動作)

image

  四涝焙、復制算法(Copying)

將內存劃分為大小相等的兩塊,每次只使用其中的一塊孕暇。當這塊內存用完了仑撞,就將還存活的對象復制到另一塊內存上赤兴,然后把已使用過的內存空間一次清理掉。

優(yōu)點:每次只對其中一塊進行GC,不用考慮內存碎片的問題隧哮,并且實現(xiàn)簡單桶良,運行高效

缺點:內存縮小了一半

image

注:現(xiàn)在的商業(yè)虛擬機都是用這種收集算法回收新生代。內存分為一塊較大的Eden空間和兩塊較小的Survior空間近迁,每次使用Eden和其中的一塊Survior.當回收時艺普,將Eden和Survior中還存活的對象一次性拷貝到另外一塊Survior空間上,最后清理Eden和剛才用過的Survior空間鉴竭。

  五歧譬、標記-整理算法(Mark-Compact)

讓所有存活對象都向一端移動,然后直接清理掉端邊界以外的所有內存搏存。

image

  六瑰步、分代收集算法(Generational Collection)

根據(jù)對象的存活周期的不同將內存劃分為幾塊,一般就分為新生代和老年代璧眠,根據(jù)各個年代的特點采用不同的收集算法缩焦。新生代(少量存活)用復制算法,老年代(對象存活率高)“標記-清理”算法

補充:分代劃分內存介紹

整個JVM內存總共劃分為三代:年輕代(Young Generation)责静、年老代(Old Generation)袁滥、持久代(Permanent Generation)

1、年輕代:所有新生成的對象首先都放在年輕代內存中灾螃。年輕代的目標就是盡可能快速的手機掉那些生命周期短的對象题翻。年輕代內存分為一塊較大的Eden空間和兩塊較小的Survior空間,每次使用Eden和其中的一塊Survior.當回收時腰鬼,將Eden和Survior中還存活的對象一次性拷貝到另外一塊Survior空間上嵌赠,最后清理Eden和剛才用過的Survior空間。

2熄赡、年老代:在年輕代經(jīng)歷了N次GC后姜挺,仍然存活的對象,就會被放在老年代中彼硫。因此可以認為老年代存放的都是一些生命周期較長的對象炊豪。

3、持久代:基本固定不變乌助,用于存放靜態(tài)文件溜在,例如Java類和方法。持久代對GC沒有顯著的影響他托。持久代可以通過-XX:MaxPermSize=<N>進行設置。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末仆葡,一起剝皮案震驚了整個濱河市赏参,隨后出現(xiàn)的幾起案子志笼,更是在濱河造成了極大的恐慌,老刑警劉巖把篓,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纫溃,死亡現(xiàn)場離奇詭異,居然都是意外死亡韧掩,警方通過查閱死者的電腦和手機紊浩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疗锐,“玉大人坊谁,你說我怎么就攤上這事』” “怎么了口芍?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雇卷。 經(jīng)常有香客問我鬓椭,道長,這世上最難降的妖魔是什么关划? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任小染,我火速辦了婚禮,結果婚禮上贮折,老公的妹妹穿的比我還像新娘裤翩。我一直安慰自己,他們只是感情好脱货,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布岛都。 她就那樣靜靜地躺著,像睡著了一般振峻。 火紅的嫁衣襯著肌膚如雪臼疫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天扣孟,我揣著相機與錄音烫堤,去河邊找鬼。 笑死凤价,一個胖子當著我的面吹牛鸽斟,可吹牛的內容都是我干的。 我是一名探鬼主播利诺,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼富蓄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慢逾?” 一聲冷哼從身側響起立倍,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灭红,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后口注,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體变擒,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年寝志,在試婚紗的時候發(fā)現(xiàn)自己被綠了娇斑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡材部,死狀恐怖毫缆,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情败富,我是刑警寧澤悔醋,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站兽叮,受9級特大地震影響芬骄,放射性物質發(fā)生泄漏。R本人自食惡果不足惜鹦聪,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一账阻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泽本,春花似錦淘太、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赌莺,卻和暖如春冰抢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背艘狭。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工挎扰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巢音。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓遵倦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親官撼。 傳聞我的和親對象是個殘疾皇子梧躺,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內容