jvm垃圾回收演算法:1、「標記–清除」演算法;先標記所有需要被回收的對象,然後在標記完成後統一回收所有被標記的對象。 2.複製演算法;將記憶體分割成等大的兩塊,每次只使用其中的一塊。 3.「標記–整理」演算法;4、分代收集演算法。
本教學操作環境:windows7系統、java8版、DELL G3電腦。
兩個概念:
##。新生代:存放生命週期較短的物件的區域。 老年代:存放生命週期較長的物件的區域。
相同點:都在Java堆上
1.標記–清除演算法
#執行步驟:
圖解:
缺點:
2.複製演算法
#將記憶體分割成等大的兩塊,每次只使用其中的一塊。當一塊用完了,觸發GC時,將該區塊中存活的物件複製到另一塊區域,然後一次清理掉這塊沒有用的記憶體。下次觸發GC時將那塊中存活的的又複製到這塊,然後抹掉那塊,循環往復。
圖解:
##優點
缺點:
改進
研究表明,新生代中的物件大都是「朝生夕死」的,即生命週期非常短而且對象活得越久則越難被回收。在發生GC時,需要回收的物件特別多,存活的特別少,因此需要移到另一塊記憶體的物件非常少,所以不需要1:1分割記憶體空間。而是將整個新生代依照8 : 1 : 1的比例分成三塊,最大的稱為Eden(伊甸園)區,較小的兩塊分別稱為To Survivor和From Survivor。
首次GC時,只需要將Eden存活的物件複製到To。然後將Eden區整體回收。再次GC時,將Eden和To存活的複製到From,循環往復這個過程。這樣每次新生代中可用的記憶體就佔整個新生代的90%,大大提高了記憶體使用率。 【相關推薦:Java影片教學】
但無法保證每次存活的物件就永遠少於新生代整體的10%,此時複製過去是存不下的,因此這裡會用到另一塊內存,稱為老年代,進行分配擔保,將物件儲存到老年代。若還不夠,就會拋出OOM。
老年代:存放新生代中經過多次回收仍存活的物件(預設為15次)。
3. 標記–整理演算法
#因為前面的複製演算法當物件的存活率比較高時,這樣一直複製過來,複製過去,沒啥意義,且浪費時間。所以針對老年代提出了「標記整理」演算法。
執行步驟:
圖解:
4. 分代收集演算法
目前大多商用虛擬機都採用這種分代收集演算法,這個演算法並沒有新的內容,只是根據物件的存活的時間的長短,將記憶體分為了新生代和老年代,這樣就可以針對不同的區域,採取對應的演算法。如:
MinorGC和FullGC的差異
#MinorGC:發生在新生代的垃圾回收,因為新生代的特點,MinorGC非常頻繁,且回收速度比較快,每次回收的量也很大。
FullGC:發生在老年代的垃圾回收,也稱為MajorGC,速度比較慢,相對於MinorGc慢10倍左右。進行一次FullGC通常伴隨多次多次MinorGC,。
更多程式相關知識,請造訪:程式設計影片! !
以上是jvm垃圾回收演算法有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!