JAVA虛擬機(jī)-垃圾收集器

JAVA虛擬機(jī)-垃圾收集器

從上一章節(jié),我們知道運(yùn)行期數(shù)據(jù)區(qū)域可能發(fā)生內(nèi)存泄露問(wèn)題箫津,那么為了有效防止內(nèi)存泄露問(wèn)題,我們引入垃圾收集機(jī)制,將垃圾回收苏遥,釋放更多的內(nèi)存來(lái)送挑。說(shuō)起垃圾收集器,我們需要先考慮三個(gè)問(wèn)題:

  1. 哪些對(duì)象需要回收暖眼?

  2. 什么時(shí)候回收?(new 的時(shí)候纺裁,就會(huì)檢查內(nèi)存是否夠诫肠,然后是否回收之類(lèi)的事情)

  3. 回收策略?

先來(lái)回答第一個(gè)問(wèn)題欺缘,哪些對(duì)象需要回收呢栋豫?所謂的垃圾,就是沒(méi)用的谚殊,這里可以說(shuō)是已死的對(duì)象丧鸯,或者說(shuō)是沒(méi)有任何用處的對(duì)象,那么我們?nèi)绾闻袛噙@個(gè)對(duì)象已死呢嫩絮?Stop-the-World丛肢,在討論垃圾收集時(shí),我們一定要記得這個(gè)詞語(yǔ)剿干,Stop-the-world意味著JVM由于要執(zhí)行GC而停止了應(yīng)用程序的執(zhí)行蜂怎,并且這種情形會(huì)在任何一種GC算法中發(fā)生,也就是說(shuō)當(dāng)JVM在GC時(shí),其他線程都必須出于等待狀態(tài)置尔。

1.判斷對(duì)象已死

如何判斷這個(gè)對(duì)象已死杠步,就是任何地方都沒(méi)有引用到這個(gè)對(duì)象了就說(shuō)明它已死,垃圾回收器可以回收了榜轿,這里介紹

1.1 引用技術(shù)算法
  • 概念

    給每個(gè)對(duì)象添加一個(gè)引用計(jì)數(shù)器幽歼,對(duì)象被引用,則引用計(jì)數(shù)器加1谬盐。當(dāng)引用失效時(shí)甸私,則引用計(jì)數(shù)器減1。當(dāng)引用計(jì)數(shù)器為0時(shí)设褐,表示該對(duì)象已死颠蕴,可以被回收。

  • 優(yōu)點(diǎn)

    • 實(shí)現(xiàn)簡(jiǎn)單助析,判定效率高犀被。
  • 缺點(diǎn)

    • 無(wú)法判斷互相循環(huán)引用的對(duì)象是否已死。比如:A,B都有一個(gè)object對(duì)象外冀,A.object = B,B.object=A,此時(shí)我們讓A=null,B= null,我們知道這個(gè)時(shí)候A,B此時(shí)這兩個(gè)對(duì)象也沒(méi)有任何其他引用寡键,但是由于彼此相互有引用,因此引用計(jì)數(shù)器不可能為0雪隧,此時(shí)A,B都無(wú)法回收西轩。
1.2 根搜索算法
  • 概念

    通過(guò)一些列名為“GC roots”的結(jié)點(diǎn)作為起始點(diǎn)员舵,從這些結(jié)點(diǎn)開(kāi)始向下搜索,搜索所走過(guò)的路徑稱(chēng)為引用鏈藕畔,當(dāng)一個(gè)對(duì)象沒(méi)有任何到達(dá)GC root的引用鏈時(shí)马僻,這個(gè)對(duì)象不可達(dá),可以被回收注服。簡(jiǎn)而言之就是從GC Roots到某個(gè)對(duì)象不可達(dá)就表示這個(gè)對(duì)象可以被回收韭邓。

    在java中,可以被用作GC roots的對(duì)象包含:

    • java虛擬機(jī)棧中變量表中的引用的對(duì)象

    • 方法區(qū)中類(lèi)靜態(tài)常量的引用的對(duì)象

    • 方法區(qū)中常量引用的對(duì)象

    • 本地方法區(qū)JNI的引用的對(duì)象

2.引用

如果說(shuō)引用溶弟,我們只是以為引用可以被回收和不可以被回收的區(qū)別女淑,那么就太單調(diào)了,我們其實(shí)更希望辜御,如果有內(nèi)存的時(shí)候鸭你,可以不回收,如果沒(méi)有內(nèi)存的時(shí)候擒权,可以被回收袱巨,或者認(rèn)為內(nèi)存經(jīng)過(guò)垃圾回收之后仍然不夠,可以拋棄這些引用碳抄。這個(gè)時(shí)候瓣窄,引用就需要更精細(xì)的分類(lèi)了。分為:強(qiáng)引用纳鼎,弱引用俺夕,軟引用,虛引用贱鄙。

  • 強(qiáng)引用

    強(qiáng)引用就是代碼中常見(jiàn)的那種劝贸,諸如:Object obj = new Object();obj就是強(qiáng)引用逗宁,只要這個(gè)強(qiáng)引用還存在映九,垃圾回收器是不能回收這個(gè)引用的。

  • 軟引用

    軟引用用來(lái)描述一些還有用瞎颗,但是不是必須的對(duì)象件甥。對(duì)于軟引用關(guān)聯(lián)的對(duì)象,在拋出內(nèi)存溢出異常之前哼拔,這些對(duì)象會(huì)被列為回收范圍進(jìn)行第二次垃圾回收引有,只有在這之后如果內(nèi)存仍然不夠,才拋出內(nèi)存溢出異常倦逐。

    軟引用主要用戶(hù)實(shí)現(xiàn)類(lèi)似緩存的功能譬正,在內(nèi)存足夠的情況下直接通過(guò)軟引用取值,無(wú)需從繁忙的真實(shí)來(lái)源查詢(xún)數(shù)據(jù),提升速度曾我;當(dāng)內(nèi)存不足時(shí)粉怕,自動(dòng)刪除這部分緩存數(shù)據(jù),從真正的來(lái)源查詢(xún)這些數(shù)據(jù)抒巢。

  • 弱引用

    被弱引用關(guān)聯(lián)的對(duì)象贫贝,只要下一次垃圾回收器開(kāi)始回收,無(wú)論當(dāng)前內(nèi)存是否足夠蛉谜,就會(huì)把這類(lèi)對(duì)象回收了平酿。

  • 虛引用

    虛引用是每次垃圾回收的時(shí)候都會(huì)被回收,虛引用主要用于檢測(cè)對(duì)象是否已經(jīng)從內(nèi)存中刪除悦陋。

3.垃圾收集算法

3.1 標(biāo)記-清除算法
  • 概念

    標(biāo)記-清除算法是最基本的垃圾收集算法官边,分為兩個(gè)過(guò)程:先標(biāo)記能被垃圾收集的磕昼,然后清除掉這些被標(biāo)記的對(duì)象。

  • 缺點(diǎn)

    • 效率問(wèn)題巡雨。標(biāo)記和清除兩個(gè)過(guò)程效率都不高棍辕。

    • 空間問(wèn)題暮现。標(biāo)記-清除算法回收之后,可能存在大片不連續(xù)的空間楚昭,這樣就導(dǎo)致如果后面有一個(gè)需要連續(xù)空間的大對(duì)象被分配內(nèi)存栖袋,就會(huì)又觸動(dòng)一次垃圾回收。

3.2 復(fù)制算法
  • 概念

    就是將內(nèi)存分為大小相等的兩塊A,B抚太,每次只使用一塊塘幅。每次垃圾回收時(shí),先把A內(nèi)存中存活的對(duì)象復(fù)制到另一塊空的內(nèi)存B中尿贫,然后一次性清除掉A內(nèi)存电媳。

  • 缺點(diǎn)

    可使用的內(nèi)存邊小了一半,代價(jià)太高庆亡。這樣有可能在對(duì)象實(shí)例化時(shí)匾乓,提前觸發(fā)垃圾回收。

3.3 標(biāo)記-整理算法
  • 概念

    和標(biāo)記-清理算法很像又谋,首先要做的是標(biāo)記出能被回收的拼缝,但后續(xù)不是直接清理掉這些被標(biāo)記的對(duì)象,而是刪除了未引用對(duì)象后彰亥,將剩下的存活對(duì)象放到內(nèi)存的一端A咧七,這樣內(nèi)存的另一端B就是一塊連續(xù)未被占用的空間。

3.4 分代收集算法
  • 概念

    實(shí)際上任斋,我們內(nèi)存中很多對(duì)象存活時(shí)間很短猪叙,IBM專(zhuān)門(mén)研究表明,新生代中98%的對(duì)象是朝生夕死的,因此以上三種算法都不是最好的穴翩。當(dāng)前商業(yè)虛擬機(jī)采用的是這種分代收集算法犬第。主要根據(jù)對(duì)象的存活周期將內(nèi)存分為:新生代,老年代芒帕,永生代歉嗓。

    堆按照對(duì)象生命周期分類(lèi).png

我們來(lái)看看分代收集算法是如何針對(duì)堆內(nèi)存進(jìn)行回收的:

*   新生代

    新生代采用的是復(fù)制算法。新生代先分為eden背蟆,s0,s1三塊區(qū)域鉴分,新對(duì)象一般都分配在eden區(qū)域,如果eden區(qū)域滿了觸動(dòng)垃圾回收带膀,就把eden存活的對(duì)象復(fù)制到S0區(qū)域志珍,然后清除掉eden區(qū)域。在下一次垃圾收集時(shí)垛叨,如果eden區(qū)域滿了伦糯,S0和eden區(qū)域的存活對(duì)象會(huì)被復(fù)制到S1中,然后eden和S0會(huì)被清空嗽元。在這個(gè)過(guò)程中敛纲,幸存的對(duì)象會(huì)隨著每次觸動(dòng)垃圾收集,年齡也在增長(zhǎng)剂癌。如果觸動(dòng)下一次垃圾收集淤翔,過(guò)程是一樣的,但是這次換成把所有的存活對(duì)象復(fù)制到S0中佩谷,然后清理掉eden和S1區(qū)域,而此時(shí)谐檀,這些存活對(duì)象的年齡也增長(zhǎng)了寡具。當(dāng)這些存活的對(duì)象年齡達(dá)到了新生代年齡閾值,就會(huì)進(jìn)入到下一個(gè)區(qū)域稚补,老年代童叠。

*   老年代

    老年代中使用“標(biāo)記-清除”或者“標(biāo)記-整理”算法進(jìn)行垃圾回收,回收次數(shù)相對(duì)較少课幕,每次回收時(shí)間比較長(zhǎng)厦坛。在垃圾收集整個(gè)過(guò)程中,不管是處于新生代乍惊,還是老年代杜秸,都必須記住**Stop the World 事件** ,就是說(shuō)在這種事件發(fā)生時(shí)润绎,所有的程序線程都要暫停撬碟,直到事件完成(比如這里就是完成了所有回收工作)為止诞挨。Major GC 也會(huì)觸發(fā)STW(Stop the World)。通常呢蛤,Major GC會(huì)慢很多惶傻,因?yàn)樗婕暗剿写婊顚?duì)象。所以其障,對(duì)于響應(yīng)性的應(yīng)用程序银室,應(yīng)該盡量避免Major GC。

*   永久代

    包含JVM用于描述應(yīng)用程序中類(lèi)和方法的元數(shù)據(jù)励翼。永久代是由JVM在運(yùn)行時(shí)根據(jù)應(yīng)用程序使用的類(lèi)來(lái)填充的蜈敢。如果JVM發(fā)現(xiàn)某些類(lèi)不再需要,并且其他類(lèi)可能需要空間汽抚,則這些類(lèi)可能會(huì)被回收抓狭。

4.垃圾收集器

4.1 Serial收集器

Serial收集器是最基本,也是歷史最久的收集器造烁。在垃圾收集過(guò)程中是單線程的否过,會(huì)發(fā)生STW事件(stop the word事件)。

Serial收集器依然是虛擬機(jī)運(yùn)行在Client模式下默認(rèn)新生代收集器膨蛮,對(duì)于運(yùn)行在Client模式下的虛擬機(jī)來(lái)說(shuō)是一個(gè)很好的選擇。

serial垃圾收集器.png
4.2 ParNew收集器

ParNew收集器其實(shí)就是Serial收集器的多線程版本季研,除了使用多線程進(jìn)行垃圾收集之外敞葛,其余行為包括Serial收集器可用的所有控制參數(shù)、收集算法与涡、Stop The Worl惹谐、對(duì)象分配規(guī)則、回收策略等都與Serial 收集器完全一樣驼卖。

ParNew收集器是許多運(yùn)行在Server模式下的虛擬機(jī)中首選新生代收集器氨肌,其中有一個(gè)與性能無(wú)關(guān)但很重要的原因是,除Serial收集器之外酌畜,目前只有ParNew它能與CMS收集器配合工作怎囚。

4.3 Parallel Scavenge收集器

Parallel Scavenge收集器也是一個(gè)新生代收集器,并行的多線程收集器桥胞。

該收集器的目標(biāo)是達(dá)到一個(gè)可控制的吞吐量(Throughput)恳守。所謂吞吐量就是CPU用于運(yùn)行用戶(hù)代碼的時(shí)間與CPU總消耗時(shí)間的比值,即 吞吐量=運(yùn)行用戶(hù)代碼時(shí)間/(運(yùn)行用戶(hù)代碼時(shí)間+垃圾收集時(shí)間)

停頓時(shí)間越短就越適合需要與用戶(hù)交互的程序贩虾,良好

的響應(yīng)速度能提升用戶(hù)體驗(yàn)催烘,而高吞吐量則可用高效率地利用CPU時(shí)間,盡快完成程序的運(yùn)算任務(wù)缎罢,主要適合在后臺(tái)運(yùn)算而不需要太多交互的任務(wù)伊群。

Parallel Scavenge收集器提供兩個(gè)參數(shù)用于精確控制吞吐量考杉,分別是控制最大垃圾收起停頓時(shí)間的

-XX:MaxGCPauseMillis參數(shù)以及直接設(shè)置吞吐量大小的-XX:GCTimeRatio參數(shù)

Parallel Scavenge收集器還有一個(gè)參數(shù):-XX:+UseAdaptiveSizePolicy。這是一個(gè)開(kāi)關(guān)參數(shù)舰始,當(dāng)這個(gè)參數(shù)打開(kāi)后崇棠,就不需要手工指定新生代的大小(-Xmn)蔽午、Eden與Survivor區(qū)的比例(-XX:SurvivorRatio)易茬、晉升老年代對(duì)象年齡(-XX:PretenureSizeThreshold)等細(xì)節(jié)參數(shù),只需要把基本的內(nèi)存數(shù)據(jù)設(shè)置好(如-Xmx設(shè)置最大堆)及老,然后使用MaxGVPauseMillis參數(shù)或GCTimeRation參數(shù)給虛擬機(jī)設(shè)立一個(gè)優(yōu)化目標(biāo)抽莱。

自適應(yīng)調(diào)節(jié)策略也是Parallel Scavenge收集器與ParNew收集器的一個(gè)重要區(qū)別

4.4 Serial Old收集器

Serial Old是Serial收集器的老年代版本,它同樣是一個(gè)單線程收集器骄恶,使用標(biāo)記整理算法食铐。這個(gè)收集器的主要意義也是在于給Client模式下的虛擬機(jī)使用。

如果在Server模式下僧鲁,主要兩大用途:

(1)在JDK1.5以及之前的版本中與Parallel Scavenge收集器搭配使用

(2)作為CMS收集器的后備預(yù)案虐呻,在并發(fā)收集發(fā)生Concurrent Mode Failure時(shí)使用

4.5 Parallel Old收集器

Parallel Old 是Parallel Scavenge收集器的老年代版本,使用多線程和“標(biāo)記-整理”算法寞秃。這個(gè)收集器在1.6中才開(kāi)始提供斟叼。

4.6 CMS收集器

CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器。目前很大一部分的Java應(yīng)用集中在互聯(lián)網(wǎng)站或者B/S系統(tǒng)的服務(wù)端上春寿,這類(lèi)應(yīng)用尤其重視服務(wù)器的響應(yīng)速度朗涩,希望系統(tǒng)停頓時(shí)間最短,以給用戶(hù)帶來(lái)較好的體驗(yàn)绑改。CMS收集器就非常符合這類(lèi)應(yīng)用的需求

CMS收集器是基于“標(biāo)記-清除”算法實(shí)現(xiàn)的谢床。它的運(yùn)作過(guò)程相對(duì)前面幾種收集器來(lái)說(shuō)更復(fù)雜一些,整個(gè)過(guò)程分為4個(gè)步驟:

(1)初始標(biāo)記

(2)并發(fā)標(biāo)記

(3)重新標(biāo)記

(4)并發(fā)清除

其中厘线,初始標(biāo)記识腿、重新標(biāo)記這兩個(gè)步驟仍然需要“Stop The World”.

CMS收集器主要優(yōu)點(diǎn):并發(fā)收集,低停頓造壮。

CMS三個(gè)明顯的缺點(diǎn):

(1)CMS收集器對(duì)CPU資源非常敏感渡讼。CPU個(gè)數(shù)少于4個(gè)時(shí),CMS對(duì)于用戶(hù)程序的影響就可能變得很大耳璧,為了應(yīng)付這種情況硝全,虛擬機(jī)提供了一種稱(chēng)為“增量式并發(fā)收集器”的CMS收集器變種。所做的事情和單CPU年代PC機(jī)操作系統(tǒng)使用搶占式來(lái)模擬多任務(wù)機(jī)制的思想

(2)CMS收集器無(wú)法處理浮動(dòng)垃圾楞抡,可能出現(xiàn)“Concurrent Mode Failure”失敗而導(dǎo)致另一次Full GC的產(chǎn)生伟众。在JDK1.5的默認(rèn)設(shè)置下,CMS收集器當(dāng)老年代使用了68%的空間后就會(huì)被激活召廷,這是一個(gè)偏保守的設(shè)置凳厢,如果在應(yīng)用中藍(lán)年代增長(zhǎng)不是太快账胧,可以適當(dāng)調(diào)高參數(shù)-XX:CMSInitiatingOccupancyFraction的值來(lái)提高觸發(fā)百分比,以便降低內(nèi)存回收次數(shù)從而獲取更好的性能先紫,在JDK1.6中治泥,CMS收集器的啟動(dòng)閥值已經(jīng)提升至92%。

(3)CMS是基于“標(biāo)記-清除”算法實(shí)現(xiàn)的收集器遮精,收集結(jié)束時(shí)會(huì)有大量空間碎片產(chǎn)生居夹。空間碎片過(guò)多本冲,可能會(huì)出現(xiàn)老年代還有很大空間剩余准脂,但是無(wú)法找到足夠大的連續(xù)空間來(lái)分配當(dāng)前對(duì)象,不得不提前觸發(fā)FullGC檬洞。為了解決這個(gè)問(wèn)題狸膏,CMS收集器提供了一個(gè)-XX:+UseCMSCompactAtFullCollection開(kāi)關(guān)參數(shù)(默認(rèn)就是開(kāi)啟的),用于在CMS收集器頂不住要進(jìn)行FullGC時(shí)開(kāi)啟內(nèi)存碎片合并整理過(guò)程添怔,內(nèi)存整理的過(guò)程是無(wú)法并發(fā)的湾戳,空間碎片問(wèn)題沒(méi)有了,但停頓時(shí)間變長(zhǎng)了广料。虛擬機(jī)設(shè)計(jì)者還提供了另外一個(gè)參數(shù)-XX:CMSFullGCsBeforeCompaction,這個(gè)參數(shù)是用于設(shè)置執(zhí)行多少次不壓縮的Full GC后砾脑,跟著來(lái)一次帶壓縮的(默認(rèn)值為0,標(biāo)識(shí)每次進(jìn)入Full GC時(shí)都進(jìn)行碎片整理)

4.7 G1收集器

G1收集器的優(yōu)勢(shì):

(1)并行與并發(fā)

(2)分代收集

(3)空間整理 (標(biāo)記整理算法艾杏,復(fù)制算法)

(4)可預(yù)測(cè)的停頓(G1處處理追求低停頓外韧衣,還能建立可預(yù)測(cè)的停頓時(shí)間模型,能讓使用者明確指定在一個(gè)長(zhǎng)度為M毫秒的時(shí)間片段內(nèi)糜颠,消耗在垃圾收集上的時(shí)間不得超過(guò)N毫秒汹族,這幾乎已經(jīng)實(shí)現(xiàn)Java(RTSJ)的來(lái)及收集器的特征)

使用G1收集器時(shí)萧求,Java堆的內(nèi)存布局是整個(gè)規(guī)劃為多個(gè)大小相等的獨(dú)立區(qū)域(Region),雖然還保留有新生代和老年代的概念其兴,但新生代和老年代不再是物理隔離的了,它們都是一部分Region的集合夸政。

G1收集器之所以能建立可預(yù)測(cè)的停頓時(shí)間模型元旬,是因?yàn)樗梢杂杏?jì)劃地避免在真?zhèn)€Java堆中進(jìn)行全區(qū)域的垃圾收集。G1跟蹤各個(gè)Region里面的垃圾堆積的價(jià)值大惺匚省(回收所獲取的空間大小以及回收所需要的時(shí)間的經(jīng)驗(yàn)值)匀归,在后臺(tái)維護(hù)一個(gè)優(yōu)先列表,每次根據(jù)允許的收集時(shí)間耗帕,優(yōu)先回收價(jià)值最大的Region(這也就是Garbage-First名稱(chēng)的又來(lái))穆端。這種使用Region劃分內(nèi)存空間以及有優(yōu)先級(jí)的區(qū)域回收方式,保證了G1收集器在有限的時(shí)間內(nèi)可以獲取盡量可能高的灰機(jī)效率

G1 內(nèi)存“化整為零”的思路

在GC根節(jié)點(diǎn)的枚舉范圍中加入Remembered Set即可保證不對(duì)全堆掃描也不會(huì)遺漏仿便。

如果不計(jì)算維護(hù)Remembered Set的操作体啰,G1收集器的運(yùn)作大致可劃分為一下步驟:

(1)初始標(biāo)記

(2)并發(fā)標(biāo)記

(3)最終標(biāo)記

(4)篩選回收

5.內(nèi)存分配與回收策略

5.1 優(yōu)先分配到新生代的eden區(qū)域

Eden區(qū)滿時(shí)攒巍,進(jìn)行Minor GC,當(dāng)Eden和一個(gè)Survivor區(qū)中依然存活的對(duì)象無(wú)法放入到Survivor中荒勇,則通過(guò)分配擔(dān)保機(jī)制提前轉(zhuǎn)移到老年代中柒莉。

5.2 大對(duì)象直接進(jìn)入老年代

像需要分配大塊連續(xù)空間時(shí),比如大的字符串和數(shù)組沽翔,對(duì)于分配這些大的對(duì)象兢孝,如果在新生代是很麻煩的,增加了eden仅偎,和servivor區(qū)域的復(fù)制復(fù)雜度跨蟹。所以這樣的對(duì)象一般都是直接通過(guò)設(shè)置-XX:PreternureSizeThreshold參數(shù),讓大于這個(gè)設(shè)置值的對(duì)象直接在老年代中分配哨颂。

5.3 長(zhǎng)期存活的對(duì)象將進(jìn)入到老年代

虛擬機(jī)給每個(gè)對(duì)象設(shè)置了一個(gè)年齡計(jì)數(shù)器喷市,新生代中,每經(jīng)歷一次minorGC威恼,仍然存活在servivor區(qū)域的對(duì)象品姓,其年齡計(jì)數(shù)器會(huì)加1,直到達(dá)到了一定的年齡閾值會(huì)直接進(jìn)入到老年代箫措。而這個(gè)年齡閾值通過(guò)設(shè)置:-XX:MaxTenuringThreshold來(lái)設(shè)置腹备。

5.4 動(dòng)態(tài)年齡判斷

為了適應(yīng)不同的虛擬機(jī)的內(nèi)存狀況,java虛擬機(jī)規(guī)定無(wú)須等到對(duì)象的年齡達(dá)到MaxTenuringThreshold才可以進(jìn)入老年代斤蔓,而是規(guī)定植酥,survivor空間中相同年齡對(duì)象所占內(nèi)存大于或等于survivor空間的一半內(nèi)存,那么大于這個(gè)年齡或者等于這個(gè)年齡的對(duì)象可以進(jìn)入到老年代中弦牡。

5.5 空間分配擔(dān)保

在發(fā)生minor GC時(shí)友驮,虛擬機(jī)會(huì)檢測(cè)老年代最大可用的連續(xù)空間是否大于新生代所有對(duì)象的空間,如果是:

  • 如果滿足驾锰,minor gc是安全的卸留,可以進(jìn)行minor gc。

  • 如果不滿足椭豫,查看HandlePromotionFailure參數(shù):

    • 如果為true,允許擔(dān)保失敗耻瑟,會(huì)繼續(xù)檢測(cè)老年代最大可用的連續(xù)空間>歷次晉升到老年代對(duì)象的平均大小。若大 于赏酥,將嘗試進(jìn)行一次minor gc喳整,若失敗,則重新進(jìn)行一次full gc裸扶。

    • 如果為false,不允許擔(dān)保失敗框都。要進(jìn)行一次full GC。

下圖就是整理的有關(guān)內(nèi)存分配和回收策略的知識(shí)呵晨,Java新生代GC多少次后晉升到老年代的對(duì)象就可以從這張圖分析出來(lái)了:


新生代GC升級(jí)老年代(1).png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魏保,一起剝皮案震驚了整個(gè)濱河市蔗蹋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌囱淋,老刑警劉巖猪杭,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異妥衣,居然都是意外死亡皂吮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)税手,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蜂筹,“玉大人,你說(shuō)我怎么就攤上這事芦倒∫张玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵兵扬,是天一觀的道長(zhǎng)麻裳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)器钟,這世上最難降的妖魔是什么津坑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮傲霸,結(jié)果婚禮上疆瑰,老公的妹妹穿的比我還像新娘。我一直安慰自己昙啄,他們只是感情好穆役,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著梳凛,像睡著了一般耿币。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伶跷,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天掰读,我揣著相機(jī)與錄音秘狞,去河邊找鬼叭莫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烁试,可吹牛的內(nèi)容都是我干的雇初。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼减响,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼靖诗!你這毒婦竟也來(lái)了郭怪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刊橘,失蹤者是張志新(化名)和其女友劉穎鄙才,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體促绵,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攒庵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了败晴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浓冒。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尖坤,靈堂內(nèi)的尸體忽然破棺而出稳懒,到底是詐尸還是另有隱情,我是刑警寧澤慢味,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布场梆,位于F島的核電站,受9級(jí)特大地震影響纯路,放射性物質(zhì)發(fā)生泄漏辙谜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一感昼、第九天 我趴在偏房一處隱蔽的房頂上張望装哆。 院中可真熱鬧,春花似錦定嗓、人聲如沸蜕琴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凌简。三九已至,卻和暖如春恃逻,著一層夾襖步出監(jiān)牢的瞬間雏搂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工寇损, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凸郑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓矛市,卻偏偏與公主長(zhǎng)得像芙沥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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