如果你想要從太空觀察地球课幕,衛(wèi)星技術(shù)就能夠做到這一點(diǎn)。圖中的海洋流是衛(wèi)星地圖展現(xiàn)的精刷,紫色和粉紅色的漩渦代表更暖的洋流次员,而藍(lán)色和綠色是較冷的洋流。衛(wèi)星地圖為天氣預(yù)報(bào)提供有利的證據(jù)垒酬,我們能夠準(zhǔn)確的知道氣溫以及對(duì)海洋健康做長(zhǎng)期分析監(jiān)控砰嘁。
垃圾回收機(jī)制的意義
Java語(yǔ)言中一個(gè)顯著的特點(diǎn)就是引入了垃圾回收機(jī)制,使c++程序員最頭疼的內(nèi)存管理的問(wèn)題迎刃而解勘究,它使得Java程序員在編寫程序的時(shí)候不再需要考慮內(nèi)存管理矮湘。由于有個(gè)垃圾回收機(jī)制,Java中的對(duì)象不再有“作用域”的概念口糕,只有對(duì)象的引用才有“作用域”缅阳。垃圾回收可以有效的防止內(nèi)存泄露,有效的使用空閑的內(nèi)存景描。
ps:內(nèi)存泄露是指該內(nèi)存空間使用完畢之后未回收十办,在不涉及復(fù)雜數(shù)據(jù)結(jié)構(gòu)的一般情況下秀撇,Java 的內(nèi)存泄露表現(xiàn)為一個(gè)內(nèi)存對(duì)象的生命周期超出了程序需要它的時(shí)間長(zhǎng)度,我們有時(shí)也將其稱為“對(duì)象游離”向族。
垃圾回收機(jī)制中的算法
Java語(yǔ)言規(guī)范沒(méi)有明確地說(shuō)明JVM使用哪種垃圾回收算法呵燕,但是任何一種垃圾回收算法一般要做2件基本的事情:
(1)發(fā)現(xiàn)無(wú)用信息對(duì)象炸枣;
÷驳取(2)回收被無(wú)用對(duì)象占用的內(nèi)存空間弄唧,使該空間可被程序再次使用适肠。
Jvm(Java虛擬機(jī))內(nèi)存模型
在了解垃圾回收算法之前先簡(jiǎn)單了解一下jvm內(nèi)存模型.
從Jvm內(nèi)存模型中入手對(duì)于理解GC會(huì)有很大的幫助,不過(guò)這里只需要了解一個(gè)大概候引,說(shuō)多了反而混淆視線侯养。
Jvm(Java虛擬機(jī))主要管理兩種類型內(nèi)存:堆和非堆。
- 堆是運(yùn)行時(shí)數(shù)據(jù)區(qū)域澄干,所有類實(shí)例和數(shù)組的內(nèi)存均從此處分配逛揩。
- 非堆是JVM留給自己用的,包含方法區(qū)麸俘、JVM內(nèi)部處理或優(yōu)化所需的內(nèi)存(如 JIT Compiler辩稽,Just-in-time Compiler,即時(shí)編譯后的代碼緩存)从媚、每個(gè)類結(jié)構(gòu)(如運(yùn)行時(shí)常數(shù)池逞泄、字段和方法數(shù)據(jù))以及方法和構(gòu)造方法的代碼。
簡(jiǎn)言之拜效,Java程序內(nèi)存主要(這里強(qiáng)調(diào)主要二字)分兩部分喷众,堆和非堆。大家一般new的對(duì)象和數(shù)組都是在堆中的紧憾,而GC主要回收的內(nèi)存也是這塊堆內(nèi)存到千。
配一張示意圖總結(jié)一下:
[圖片上傳失敗...(image-4de587-1517713417487)]
堆內(nèi)存(Heap Memory): 存放Java對(duì)象
非堆內(nèi)存(Non-Heap Memory): 存放類加載信息和其它meta-data
其它(Other): 存放JVM 自身代碼等
重點(diǎn)是堆內(nèi)存,我們就再看看堆的內(nèi)存模型赴穗。
- 堆內(nèi)存由垃圾回收器的自動(dòng)內(nèi)存管理系統(tǒng)回收憔四。
- 堆內(nèi)存分為兩大部分:新生代和老年代。比例為1:2般眉。
- 老年代主要存放應(yīng)用程序中生命周期長(zhǎng)的存活對(duì)象了赵。
- 新生代又分為三個(gè)部分:一個(gè)Eden區(qū)和兩個(gè)Survivor區(qū),比例為8:1:1煤篙。
- Eden區(qū)存放新生的對(duì)象斟览。
- Survivor存放每次垃圾回收后存活的對(duì)象。
[圖片上傳失敗...(image-c20973-1517713417487)]
其實(shí)只需要關(guān)注這幾個(gè)問(wèn)題:
- 為什么要分新生代和老年代辑奈?
- 新生代為什么分一個(gè)Eden區(qū)和兩個(gè)Survivor區(qū)?
- 一個(gè)Eden區(qū)和兩個(gè)Survivor區(qū)的比例為什么是8:1:1苛茂?
現(xiàn)在還不能解釋為什么已烤,但這幾個(gè)問(wèn)題都是垃圾回收機(jī)制所采用的算法決定的。
所以問(wèn)題轉(zhuǎn)化為妓羊,是何種算法胯究?為什么要采用此種算法?
可回收對(duì)象的判定
講算法之前躁绸,我們先要搞清楚一個(gè)問(wèn)題裕循,什么樣的對(duì)象是垃圾(無(wú)用對(duì)象),需要被回收净刮?
目前市面上有兩種算法用來(lái)判定一個(gè)對(duì)象是否為垃圾剥哑。
- 引用計(jì)數(shù)算法
- 可達(dá)性分析算法(根搜索算法)
引用計(jì)數(shù)法(Reference Counting Collector)
算法分析
引用計(jì)數(shù)是垃圾收集器中的早期策略。在這種方法中淹父,堆中每個(gè)對(duì)象實(shí)例都有一個(gè)引用計(jì)數(shù)株婴。當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí),且將該對(duì)象實(shí)例分配給一個(gè)變量暑认,該變量計(jì)數(shù)設(shè)置為1困介。當(dāng)任何其它變量被賦值為這個(gè)對(duì)象的引用時(shí),計(jì)數(shù)加1(a = b,則b引用的對(duì)象實(shí)例的計(jì)數(shù)器+1)蘸际,但當(dāng)一個(gè)對(duì)象實(shí)例的某個(gè)引用超過(guò)了生命周期或者被設(shè)置為一個(gè)新值時(shí)座哩,對(duì)象實(shí)例的引用計(jì)數(shù)器減1。任何引用計(jì)數(shù)器為0的對(duì)象實(shí)例可以被當(dāng)作垃圾收集粮彤。當(dāng)一個(gè)對(duì)象實(shí)例被垃圾收集時(shí)根穷,它引用的任何對(duì)象實(shí)例的引用計(jì)數(shù)器減1。
[圖片上傳失敗...(image-40d1e0-1517713417487)]
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn): 簡(jiǎn)單驾诈,高效
引用計(jì)數(shù)收集器可以很快的執(zhí)行缠诅,交織在程序運(yùn)行中。對(duì)程序需要不被長(zhǎng)時(shí)間打斷的實(shí)時(shí)環(huán)境比較有利乍迄。 - 缺點(diǎn): 無(wú)法檢測(cè)出循環(huán)引用
如父對(duì)象有一個(gè)對(duì)子對(duì)象的引用管引,子對(duì)象反過(guò)來(lái)引用父對(duì)象。這樣闯两,他們的引用計(jì)數(shù)永遠(yuǎn)不可能為0.
public class Main {
public static void main(String[] args) {
MyObject object1 = new MyObject();
MyObject object2 = new MyObject();
object1.object = object2;
object2.object = object1;
object1 = null;
object2 = null;
}
}
最后面兩句將object1和object2賦值為null褥伴,也就是說(shuō)object1和object2指向的對(duì)象已經(jīng)不可能再被訪問(wèn),但是由于它們互相引用對(duì)方漾狼,導(dǎo)致它們的引用計(jì)數(shù)器都不為0重慢,那么垃圾收集器就永遠(yuǎn)不會(huì)回收它們。
可達(dá)性分析算法(根搜索算法)
算法分析
根搜索算法是從離散數(shù)學(xué)中的圖論引入的逊躁,程序把所有的引用關(guān)系看作一張圖似踱,從一個(gè)節(jié)點(diǎn)GC ROOT開(kāi)始,尋找對(duì)應(yīng)的引用節(jié)點(diǎn),找到這個(gè)節(jié)點(diǎn)以后核芽,繼續(xù)尋找這個(gè)節(jié)點(diǎn)的引用節(jié)點(diǎn)囚戚,當(dāng)所有的引用節(jié)點(diǎn)尋找完畢之后,剩余的節(jié)點(diǎn)則被認(rèn)為是沒(méi)有被引用到的節(jié)點(diǎn)轧简,即無(wú)用的節(jié)點(diǎn)驰坊。
java中可作為GC Root的對(duì)象有:
- 虛擬機(jī)棧中引用的對(duì)象(本地變量表)
- 方法區(qū)中靜態(tài)屬性引用的對(duì)象
- 方法區(qū)中常量引用的對(duì)象
- 本地方法棧中引用的對(duì)象(Native對(duì)象)
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):
解決循環(huán)引用問(wèn)題 - 缺點(diǎn):
Stop The World
在學(xué)習(xí)GC前,你應(yīng)該知道一個(gè)技術(shù)名詞:這個(gè)詞是“stop-the-world哮独∪剑“ 無(wú)論你選擇哪種GC算法,Stop-the-world都會(huì)發(fā)生皮璧。Stop-the-world意味著JVM停止應(yīng)用程序舟扎,而去進(jìn)行垃圾回收。當(dāng)stop-the-world發(fā)生時(shí)恶导,除了進(jìn)行垃圾回收的線程浆竭,其他所有線程都將停止運(yùn)行。被中斷的任務(wù)將在GC任務(wù)完成后恢復(fù)執(zhí)行惨寿。GC調(diào)優(yōu)往往意味著減少stop-the-world的時(shí)間.
垃圾回收的時(shí)候,需要整個(gè)的引用狀態(tài)保持不變删窒,否則判定是判定垃圾裂垦,等我稍后回收的時(shí)候它又被引用了,這就全亂套了肌索。所以蕉拢,GC的時(shí)候,其他所有的程序執(zhí)行處于暫停狀態(tài)诚亚,卡住了晕换。
幸運(yùn)的是,這個(gè)卡頓是非常短(尤其是新生代)站宗,對(duì)程序的影響微乎其微 (關(guān)于其他GC比如并發(fā)GC之類的闸准,在此不討論)。
所以GC的卡頓問(wèn)題由此而來(lái)梢灭,也是情有可原夷家,暫時(shí)無(wú)可避免。
垃圾回收算法
標(biāo)記清除算法 (Mark-Sweep)
原理
分為兩個(gè)階段: 標(biāo)記階段(Mark) 和清除階段(Sweep):
- 標(biāo)記階段:
collector從mutator根對(duì)象開(kāi)始進(jìn)行遍歷敏释,對(duì)從mutator根對(duì)象可以訪問(wèn)到的對(duì)象都打上一個(gè)標(biāo)識(shí)库快,一般是在對(duì)象的header中,將其記錄為可達(dá)對(duì)象钥顽。 - 清除階段:
collector對(duì)堆內(nèi)存(heap memory)從頭到尾進(jìn)行線性的遍歷义屏,如果發(fā)現(xiàn)某個(gè)對(duì)象沒(méi)有標(biāo)記為可達(dá)對(duì)象-通過(guò)讀取對(duì)象的header信息,則就將其回收。
collector指的就是垃圾收集器闽铐,而mutator是指除了垃圾收集器之外的部分膀曾,比如說(shuō)我們應(yīng)用程序本身。mutator的職責(zé)一般是NEW(分配內(nèi)存),READ(從內(nèi)存中讀取內(nèi)容),WRITE(將內(nèi)容寫入內(nèi)存)阳啥,而collector則就是回收不再使用的內(nèi)存來(lái)供mutator進(jìn)行NEW操作的使用添谊。
mutator根對(duì)象一般指的是分配在堆內(nèi)存之外,可以直接被mutator直接訪問(wèn)到的對(duì)象察迟,一般是指靜態(tài)/全局變量以及Thread-Local變量
可達(dá)對(duì)象的定義斩狱,從mutator根對(duì)象開(kāi)始進(jìn)行遍歷,可以被訪問(wèn)到的對(duì)象都稱為是可達(dá)對(duì)象扎瓶。這些對(duì)象也是mutator(你的應(yīng)用程序)正在使用的對(duì)象所踊。
[圖片上傳失敗...(image-4e7592-1517713417487)]
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):簡(jiǎn)單,容易實(shí)現(xiàn)
- 缺點(diǎn):容易產(chǎn)生內(nèi)存碎片,碎片太多可能會(huì)導(dǎo)致后續(xù)過(guò)程中需要為大對(duì)象分配空間時(shí)無(wú)法找到足夠的空間而提前觸發(fā)新的一次垃圾收集動(dòng)作概荷。
復(fù)制算法 (Copying)
原理
復(fù)制算法將內(nèi)存劃分為兩個(gè)區(qū)間,活動(dòng)區(qū)和空閑區(qū)秕岛,在任意時(shí)間點(diǎn),所有動(dòng)態(tài)分配的對(duì)象都只能分配在活動(dòng)區(qū)
當(dāng)有效內(nèi)存空間耗盡時(shí)误证,JVM將暫停程序運(yùn)行继薛,開(kāi)啟復(fù)制算法GC線程。接下來(lái)GC線程會(huì)將活動(dòng)區(qū)間內(nèi)的存活對(duì)象愈捅,全部復(fù)制到空閑區(qū)間遏考,且嚴(yán)格按照內(nèi)存地址依次排列,與此同時(shí)蓝谨,GC線程將更新存活對(duì)象的內(nèi)存引用地址指向新的內(nèi)存地址灌具。
此時(shí),空閑區(qū)間已經(jīng)與活動(dòng)區(qū)間交換譬巫,而垃圾對(duì)象現(xiàn)在已經(jīng)全部留在了原來(lái)的活動(dòng)區(qū)間咖楣,也就是現(xiàn)在的空閑區(qū)間。事實(shí)上芦昔,在活動(dòng)區(qū)間轉(zhuǎn)換為空間區(qū)間的同時(shí)诱贿,垃圾對(duì)象已經(jīng)被一次性全部回收。
清理前:
清理后:
通俗的講,就是:
復(fù)制算法將可用內(nèi)存按容量劃分為大小相等的兩塊烟零,每次只使用其中的一塊瘪松。當(dāng)這一塊的內(nèi)存用完了,就將還存活著的對(duì)象復(fù)制到另外一塊上面锨阿,然后再把已使用的內(nèi)存空間一次清理掉宵睦,這樣一來(lái)就不容易出現(xiàn)內(nèi)存碎片的問(wèn)題。
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單墅诡,運(yùn)行高效且不容易產(chǎn)生內(nèi)存碎片
- 缺點(diǎn):浪費(fèi)內(nèi)存
標(biāo)記整理算法 (Mark-Compact)
原理
分為兩個(gè)階段: 標(biāo)記階段(Mark) 和整理階段(Compact)
- 標(biāo)記階段: 與標(biāo)記/清除算法是一模一樣
- 整理階段: 移動(dòng)所有存活的對(duì)象壳嚎,且按照內(nèi)存地址次序依次排列桐智,然后將末端內(nèi)存地址以后的內(nèi)存全部回收。
標(biāo)記-整理算法采用標(biāo)記-清除算法一樣的方式進(jìn)行對(duì)象的標(biāo)記烟馅,但在清除時(shí)不同说庭,在回收不存活的對(duì)象占用的空間后,會(huì)將所有的存活對(duì)象往左端空閑空間移動(dòng)郑趁,并更新對(duì)應(yīng)的指針刊驴。標(biāo)記-整理算法是在標(biāo)記-清除算法的基礎(chǔ)上,又進(jìn)行了對(duì)象的移動(dòng)寡润,因此成本更高捆憎,但是卻解決了內(nèi)存碎片的問(wèn)題。
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn): 標(biāo)記/整理算法不僅可以彌補(bǔ)標(biāo)記/清除算法當(dāng)中梭纹,內(nèi)存區(qū)域分散的缺點(diǎn)躲惰,也消除了復(fù)制算法當(dāng)中,內(nèi)存減半的高額代價(jià)
- 缺點(diǎn): 低效
分代回收算法(Generational Collector)
分代回收算法其實(shí)不算一種新的算法变抽,而是根據(jù)復(fù)制算法和標(biāo)記整理算法的的特點(diǎn)綜合而成础拨。這種綜合是考慮到j(luò)ava的語(yǔ)言特性的。
這里重復(fù)一下兩種老算法的適用場(chǎng)景:
- 復(fù)制算法:適用于存活對(duì)象很少绍载」钭冢回收對(duì)象多
- 適用用于存活對(duì)象多,回收對(duì)象少
復(fù)習(xí)下面這個(gè)圖:
[圖片上傳失敗...(image-1560a8-1517713417487)]
解析:
- 堆內(nèi)存分為兩大部分:新生代和老年代逛钻。比例為1:2僚焦。
- 新生代又分為三個(gè)部分:一個(gè)Eden區(qū)和兩個(gè)Survivor區(qū),比例為8:1:1曙痘。
- Eden區(qū)存放新生的對(duì)象。new
- Survivor存放每次垃圾回收后存活的對(duì)象立肘。
- 老年代主要存放應(yīng)用程序中生命周期長(zhǎng)的存活對(duì)象边坤。
原理(過(guò)程)
所有新生成的對(duì)象首先都是放在年輕代的。年輕代的目標(biāo)就是盡可能快速的收集掉那些生命周期短的對(duì)象谅年。
- 分配對(duì)象時(shí)茧痒,保存在Eden區(qū)
- Eden區(qū)滿,觸發(fā)GC(Minor GC), 將Eden區(qū)存活對(duì)象復(fù)制到一個(gè)survivor0區(qū)融蹂,然后清空Eden區(qū)
- 當(dāng)這個(gè)survivor0區(qū)也存放滿了時(shí)旺订,則將eden區(qū)和survivor0區(qū)存活對(duì)象復(fù)制到另一個(gè)survivor1區(qū),然后清空eden和這個(gè)survivor0區(qū)
- 此時(shí)survivor0區(qū)是空的超燃,然后將survivor0區(qū)和survivor1區(qū)交換区拳,即保持survivor1區(qū)為空, 如此往復(fù)
- 當(dāng)survivor1區(qū)不足以存放 eden和survivor0的存活對(duì)象時(shí)意乓,就將存活對(duì)象直接存放到老年代樱调。若是老年代也滿了就會(huì)觸發(fā)一次Full GC,也就是新生代、老年代都進(jìn)行回收
年輕代 年老代 持久代
- 年輕代(Young Generation):
所有新生成的對(duì)象首先都是放在年輕代的笆凌。年輕代的目標(biāo)就是盡可能快速的收集掉那些生命周期短的對(duì)象圣猎。
新生代發(fā)生的GC也叫做Minor GC,MinorGC發(fā)生頻率比較高(不一定等Eden區(qū)滿了才觸發(fā)) - 年老代(Old Generation):
年老代中存放的都是一些生命周期較長(zhǎng)的對(duì)象乞而。
老年代內(nèi)存滿時(shí)觸發(fā)Major GC即Full GC送悔,F(xiàn)ull GC發(fā)生頻率比較低,老年代對(duì)象存活時(shí)間比較長(zhǎng)爪模,存活率標(biāo)記高欠啤。 - 持久代(Permanent Generation):
用于存放靜態(tài)文件,如Java類呻右、方法等跪妥。持久代對(duì)垃圾回收沒(méi)有顯著影響,但是有些應(yīng)用可能動(dòng)態(tài)生成或者調(diào)用一些class声滥,例如Hibernate 等眉撵,在這種時(shí)候需要設(shè)置一個(gè)比較大的持久代空間來(lái)存放這些運(yùn)行過(guò)程中新增的類。
深入理解分代回收算法
為什么不是一塊Survivor空間而是兩塊落塑?
這里涉及到一個(gè)新生代和老年代的存活周期的問(wèn)題纽疟,比如一個(gè)對(duì)象在新生代經(jīng)歷15次(僅供參考)GC,就可以移到老年代了憾赁。問(wèn)題來(lái)了污朽,當(dāng)我們第一次GC的時(shí)候,我們可以把Eden區(qū)的存活對(duì)象放到Survivor A空間龙考,但是第二次GC的時(shí)候蟆肆,Survivor A空間的存活對(duì)象也需要再次用Copying算法,放到Survivor B空間上晦款,而把剛剛的Survivor A空間和Eden空間清除炎功。第三次GC時(shí),又把Survivor B空間的存活對(duì)象復(fù)制到Survivor A空間缓溅,如此反復(fù)蛇损。
所以,這里就需要兩塊Survivor空間來(lái)回倒騰
為什么Eden空間這么大而Survivor空間要分的少一點(diǎn)坛怪?
新創(chuàng)建的對(duì)象都是放在Eden空間淤齐,這是很頻繁的,尤其是大量的局部變量產(chǎn)生的臨時(shí)對(duì)象袜匿,這些對(duì)象絕大部分都應(yīng)該馬上被回收更啄,能存活下來(lái)被轉(zhuǎn)移到survivor空間的往往不多。所以沉帮,設(shè)置較大的Eden空間和較小的Survivor空間是合理的锈死,大大提高了內(nèi)存的使用率贫堰,緩解了Copying算法的缺點(diǎn)。
我看8:1:1就挺好的待牵,當(dāng)然這個(gè)比例是可以調(diào)整的其屏,包括上面的新生代和老年代的1:2的比例也是可以調(diào)整的。
新的問(wèn)題又來(lái)了缨该,從Eden空間往Survivor空間轉(zhuǎn)移的時(shí)候Survivor空間不夠了怎么辦偎行?直接放到老年代去
垃圾收集器
- 新生代收集器使用的收集器:Serial、PraNew贰拿、Parallel Scavenge
- 老年代收集器使用的收集器:Serial Old蛤袒、Parallel Old、CMS
Serial收集器(復(fù)制算法)
新生代單線程收集器膨更,標(biāo)記和清理都是單線程妙真,優(yōu)點(diǎn)是簡(jiǎn)單高效。
Serial Old收集器(標(biāo)記-整理算法)
老年代單線程收集器荚守,Serial收集器的老年代版本珍德。
ParNew收集器(停止-復(fù)制算法)
新生代收集器,可以認(rèn)為是Serial收集器的多線程版本,在多核CPU環(huán)境下有著比Serial更好的表現(xiàn)矗漾。
Parallel Scavenge收集器(停止-復(fù)制算法)
并行收集器锈候,追求高吞吐量,高效利用CPU敞贡。吞吐量一般為99%泵琳, 吞吐量= 用戶線程時(shí)間/(用戶線程時(shí)間+GC線程時(shí)間)。適合后臺(tái)應(yīng)用等對(duì)交互相應(yīng)要求不高的場(chǎng)景誊役。
Parallel Old收集器(停止-復(fù)制算法)
Parallel Scavenge收集器的老年代版本获列,并行收集器,吞吐量?jī)?yōu)先
CMS(Concurrent Mark Sweep)收集器(標(biāo)記-清理算法)
高并發(fā)蛔垢、低停頓蛛倦,追求最短GC回收停頓時(shí)間,cpu占用比較高啦桌,響應(yīng)時(shí)間快,停頓時(shí)間短及皂,多核cpu 追求高響應(yīng)時(shí)間的選擇
GC的執(zhí)行機(jī)制
Scavenge GC(Minor GC)
一般情況下甫男,當(dāng)新對(duì)象生成,并且在Eden申請(qǐng)空間失敗時(shí)验烧,就會(huì)觸發(fā)Scavenge GC板驳,對(duì)Eden區(qū)域進(jìn)行GC,清除非存活對(duì)象碍拆,并且把尚且存活的對(duì)象移動(dòng)到Survivor區(qū)若治。然后整理Survivor的兩個(gè)區(qū)慨蓝。這種方式的GC是對(duì)年輕代的Eden區(qū)進(jìn)行,不會(huì)影響到年老代端幼。因?yàn)榇蟛糠謱?duì)象都是從Eden區(qū)開(kāi)始的礼烈,同時(shí)Eden區(qū)不會(huì)分配的很大,所以Eden區(qū)的GC會(huì)頻繁進(jìn)行婆跑。因而此熬,一般在這里需要使用速度快、效率高的算法滑进,使Eden去能盡快空閑出來(lái)犀忱。
Full GC
對(duì)整個(gè)堆進(jìn)行整理,包括Young扶关、Tenured和Perm阴汇。Full GC因?yàn)樾枰獙?duì)整個(gè)堆進(jìn)行回收,所以比Scavenge GC要慢节槐,因此應(yīng)該盡可能減少Full GC的次數(shù)搀庶。在對(duì)JVM調(diào)優(yōu)的過(guò)程中,很大一部分工作就是對(duì)于FullGC的調(diào)節(jié)疯淫。有如下原因可能導(dǎo)致Full GC:
- 年老代(Tenured)被寫滿
- 持久代(Perm)被寫滿
- System.gc()被顯示調(diào)用
- 上一次GC之后Heap的各域分配策略動(dòng)態(tài)變化
參考: