GC常用算法及常見分代:Minor GC育韩、Major GC和Full GC
[TOC]
GC的概念在20世紀(jì)60年代的Lisp語言中就已經(jīng)提出,直到現(xiàn)在新興的語言大都攜帶GC能力俱诸,但是GC的基本算法和原理基本沒有大的改變。
在內(nèi)存區(qū)域的劃分上赊舶,大體按照堆heap睁搭、棧stack來劃分;heap用于存放程序創(chuàng)建的對象笼平,stack用來執(zhí)行程序园骆,比如方法棧,局部變量等寓调。
棧中的棧幀隨著方法入棧出棧進行有序的申請釋放锌唾,heap堆所有線程共享,是GC的主要作用區(qū)域夺英。因此heap又被稱為GC Heap.
一晌涕、GC的幾種回收算法(堆對象回收)
1. 引用計數(shù)
簡單高效,但是無法解決循環(huán)引用造成的內(nèi)存泄露痛悯。php就是使用這個回收算法
2. Mark 追蹤(Trace)回收
建立對象引用圖余黎,遍歷并標(biāo)記,遍歷結(jié)束后沒有標(biāo)記的就是垃圾载萌。jvm使用了這個驯耻。
3. 壓縮回收算法
類似于存儲介質(zhì)的碎片整理亲族,將活動的對象移動到堆的一端炒考。
4. Copy 復(fù)制回收算法
把堆分為大小相同的兩個區(qū)域可缚,一個區(qū)域用完了,中斷程序斋枢,把活動對象移動到另一邊帘靡。缺點浪費內(nèi)存,需要中斷程序瓤帚。
5. 分代回收 Generational Collection
分代收集基于這樣的一個假設(shè): 大多數(shù)對象都很快會死掉描姚。
根據(jù)這個特點對回收進行優(yōu)化,將內(nèi)存中的對象分為多個子堆戈次,每個自堆稱為一代
轩勘,算法運行時優(yōu)先收集"年幼"的對象;
如果一個對象經(jīng)過多次收集仍然存活怯邪,則把該對象移動到高一級的堆中绊寻,減少對其的掃描次數(shù)。
二悬秉、GC stop the world
垃圾回收進行時需要將應(yīng)用程序完全暫停澄步。
三、Minor GC和泌、Major GC和Full GC
Minor GC:新生代GC
Major GC/Full GC:老年代GC.
出現(xiàn)Major GC 通常(非絕對的村缸,在 ParallelScavenge 收集器的收集策略里就有直接進行 Major GC的策略選擇過程)會發(fā)生至少一次的Minor GC(速度是是Major的10倍以上)。
- Full GC:清理整個堆空間——包括新生代(Eden武氓、Survivor)梯皿、老年代(Old Gen)。
MinorGC 效率是Major GC的10倍以上县恕,經(jīng)過多次的Minor GC后觸發(fā)Major GC(不絕對东羹,有反例),此時即Full GC弱睦。
反例是在 ParallelScavenge 收集器的收集策略里就有直接進行 Major GC的策略選擇過程.