概念:
● 新生代 GC(Minor GC):從年輕代空間(包括 Eden 和 Survivor 區域)回收內存被稱爲 Minor GC,由於 Java 對象大多都具有朝生夕滅的特性,因此 Minor GC 很是頻繁,通常回收速度也比較快。這必定義既清晰又易於理解。可是,當發生Minor GC事件的時候,有一些有趣的地方須要注意到:
1. 當 JVM 沒法爲一個新的對象分配空間時會觸發 Minor GC,好比當 Eden 區滿了。因此分配率越高,越頻繁執行 Minor GC。
2. 內存池被填滿的時候,其中的內容所有會被複制,指針會從0開始跟蹤空閒內存。Eden 和 Survivor 區進行了標記和複製操做,取代了經典的標記、掃描、壓縮、清理操做。因此 Eden 和 Survivor 區不存在內存碎片。寫指針老是停留在所使用內存池的頂部。
3. 執行 Minor GC 操做時,不會影響到永久代。從永久代到年輕代的引用被當成 GC roots,從年輕代到永久代的引用在標記階段被直接忽略掉。
4. 質疑常規的認知,全部的 Minor GC 都會觸發「全世界的暫停(stop-the-world)」,中止應用程序的線程。對於大部分應用程序,停頓致使的延遲都是能夠忽略不計的。其中的真相就 是,大部分 Eden 區中的對象都能被認爲是垃圾,永遠也不會被複制到 Survivor 區或者老年代空間。若是正好相反,Eden 區大部分新生對象不符合 GC 條件,Minor GC 執行時暫停的時間將會長不少。
因此 Minor GC 的狀況就至關清楚了——每次 Minor GC 會清理年輕代的內存。
● 老年代 GC(Major GC / Full GC):指發生在老年代的 GC,出現了 Major GC,常常會伴隨至少一次的 Minor GC(但非絕對的,ParallelScavenge 收集器的收集策略裏就有直接進行 Major GC 的策略選擇過程) 。MajorGC 的速度通常會比 Minor GC 慢 10倍以上。spa
Minor GC觸發機制:
當年輕代滿時就會觸發Minor GC,這裏的年輕代滿指的是Eden代滿,Survivor滿不會引起GC。
Full GC觸發機制:
(1)調用System.gc時,系統建議執行Full GC,可是沒必要然執行
(2)老年代空間不足
(3)方法區空間不足
(4)經過Minor GC後進入老年代的平均大小大於老年代的可用內存
(5)由Eden區、survivor space1(From Space)區向survivor space2(To Space)區複製時,對象大小大於To Space可用內存,則把該對象轉存到老年代,且老年代的可用內存小於該對象大小線程
當永久代滿時也會引起Full GC,會致使Class、Method元信息的卸載。
其中Minor GC以下圖所示指針
虛擬機給每一個對象定義了一個對象年齡(Age)計數器。若是對象在 Eden 出生並通過第一次 Minor GC 後仍然存活,而且能被 Survivor 容納的話,將被移動到 Survivor 空間中,並將對象年齡設爲 1。對象在 Survivor 區中每熬過一次 Minor GC,年齡就增長 1 歲,當它的年齡增長到必定程度(默認爲 15 歲)時,就會被晉升到老年代中。對象晉升老年代的年齡閾值,能夠經過參數 -XX:MaxTenuringThreshold (閾值)來設置。對象
MajorGCvsFullGCMajorGCvsFullGC
你們應該注意到,目前,這些術語不管是在 JVM 規範仍是在垃圾收集研究論文中都沒有正式的定義。可是咱們一看就知道這些在咱們已經知道的基礎之上作出的定義是正確的:
● Major GC 是清理永久代。
● Full GC 是清理整個堆空間—包括年輕代和永久代blog
一、左5型,繞過了空間擔保(繞過紫色框),直接進行了Young GC。不用空間擔保,意味着Young GC後,即便新生代全部的對象都存活,也均可以放入老年代,因此只會進行Young GC事件
二、錨型,空間擔保成功(跨越紫色框),先Young GC,後Old GC(也可能不進行)。空間擔保成功,意味着Young GC後,大機率老年代空間夠晉升對象用,不須要進行Old GC,那麼先進行Young GC吧,Young GC過程當中會有一部分對象晉升到老年代,這時候有兩種狀況:內存
(狀況1)、發現老年代空間不夠,只能轉而進行 Old GC ,而後接着YoungGC。虛擬機
(狀況2)、老年代空間夠,不用Old GC基礎
三、中5少橫型,空間擔保失敗(分叉於紫色框),先Old GC ,後Young GC。空間擔保失敗,意味着Young GC後,大機率老年代空間不夠晉升對象用,須要進行Old GC。那麼先進行Old GC吧,Old GC完成後進行Young GC(你們別忘記爲何要進行Old GC,是爲了更好的進行Young GC,省得先進行Young GC到一半才發現空間不夠用,再來Old GC)引用