jvm垃圾回收演算法有哪些
jvm垃圾回收演算法:1、「標記–清除」演算法;先標記所有需要被回收的對象,然後在標記完成後統一回收所有被標記的對象。 2.複製演算法;將記憶體分割成等大的兩塊,每次只使用其中的一塊。 3.「標記–整理」演算法;4、分代收集演算法。
本教學操作環境:windows7系統、java8版、DELL G3電腦。
JVM垃圾回收演算法
兩個概念:
##。新生代:存放生命週期較短的物件的區域。 老年代:存放生命週期較長的物件的區域。
相同點:都在Java堆上
1.標記–清除演算法
#執行步驟:
- #標記:遍歷記憶體區域,標記需要回收的物件。
- 清除:再次遍歷內存,對已經標記過的內存進行回收。
圖解:
缺點:
- 效率問題;遍歷了兩次記憶體空間(第一次標記,第二次清除)。
- 空間問題:容易產生大量記憶體碎片,當再需要一塊比較大的記憶體時,無法找到一塊符合要求的,因而不得不再次出發GC。
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)