深入理解Java垃圾回收機(jī)制

衛(wèi)星圖像展現(xiàn)出的美洲海洋流 (? Karsten Schneider/Science Photo Library)

如果你想要從太空觀察地球课幕,衛(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)變化

參考:

深入理解java垃圾回收機(jī)制
理解Java垃圾回收機(jī)制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末地来,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子熙掺,更是在濱河造成了極大的恐慌未斑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件币绩,死亡現(xiàn)場(chǎng)離奇詭異蜡秽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)缆镣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門芽突,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人董瞻,你說(shuō)我怎么就攤上這事寞蚌。” “怎么了钠糊?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵挟秤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我抄伍,道長(zhǎng)艘刚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任截珍,我火速辦了婚禮攀甚,結(jié)果婚禮上箩朴,老公的妹妹穿的比我還像新娘。我一直安慰自己秋度,他們只是感情好炸庞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著静陈,像睡著了一般燕雁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲸拥,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天拐格,我揣著相機(jī)與錄音,去河邊找鬼刑赶。 笑死捏浊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撞叨。 我是一名探鬼主播金踪,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼牵敷!你這毒婦竟也來(lái)了胡岔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枷餐,失蹤者是張志新(化名)和其女友劉穎靶瘸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體毛肋,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怨咪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了润匙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诗眨。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖孕讳,靈堂內(nèi)的尸體忽然破棺而出匠楚,到底是詐尸還是另有隱情,我是刑警寧澤厂财,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布油啤,位于F島的核電站,受9級(jí)特大地震影響蟀苛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逮诲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一帜平、第九天 我趴在偏房一處隱蔽的房頂上張望幽告。 院中可真熱鬧,春花似錦裆甩、人聲如沸冗锁。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冻河。三九已至,卻和暖如春茉帅,著一層夾襖步出監(jiān)牢的瞬間叨叙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工堪澎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擂错,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓樱蛤,卻偏偏與公主長(zhǎng)得像钮呀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昨凡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容