您好,登錄后才能下訂單哦!
這篇“JVM垃圾回收算法是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“JVM垃圾回收算法是什么”文章吧。
標記-清除(Mark-Sweep)算法是最早出現也是最基礎的垃圾收集算法。顧名思義,標記-清除算法分為兩個階段:
標記:標記出所有需要回收的對象
清除:清除掉所有被標記的對象
優點:
簡單,容易理解
垃圾少時,效率高
缺點:
會產生內存空間碎片,內存空間碎片太多可能會導致以后在程序運行過程中需要分配較大對象時,無法找到足夠的連續內存而不得不提前觸發另一次垃圾回收動作
性能不穩定,如果內存中大部分都是要回收的垃圾對象,標記和清除效率會隨著垃圾的數量而降低
為了解決標記-清除算法面對大量可回收對象時執行效率低的問題,于是有了復制(Copying)算法。復制算法是將內存一分為二,當一塊內存使用完成之后,會將存活的對象移動到另一塊預留未使用的內存空間,然后將使用過的那塊內存空間清理掉。
優點:
實現簡單,運行高效
不會產生內存空間碎片
缺點:
因為要預留一半內存空間,所以內存空間浪費嚴重
如果內存中多數對象都是存活的,這種算法將會產生大量的內存間復制的開銷
在1989年,Andrew Appel針對具備“朝生夕滅”特點的對象,提出了一種更優化的半區復制分代策略,現在稱為“Appel式回收”。具體做法是分配一塊較大的Eden區和兩塊較小的Survivor區(可以叫做From區和To區,也可以叫做Survivor1區和Survivor2區)。
研究表明,新生代中的對象98%是“朝生夕死”的,所以并不需要按照1:1的比例來劃分內存空間,而是將內存分為一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和其中一塊 Survivor空間。當回收時,將Eden和Survivor中還存活著的對象一次性地復制到另外一塊Survivor空間上,最后清理掉Eden和已經用過的Survivor空間。也就是說,浪費的空間只有一個Survivor空間。
HotSpot虛擬機新生代比例Eden和Survivor空間比例為8:1:1
,在使用的時候只使用Eden區和一個Survivor區,也就是說,新生代有90%的空間是在使用的,只有10%的空間是浪費的。新生代中98%的對象可被回收僅僅是“普通場景”下測得的數據,任何人都沒有辦法百分百保證每次回收都只有不多于10%的對象存活,因此,在Survivor空間不足的情況下,就需要依賴其他內存進行分配擔保(Handle Promotion),一般是老年代。就是說如果Survivor空間不足,對象就需要以分配擔保的形式進入老年代。
標記-整理算法首先標記出所有需要回收的對象,在標記完成后,后續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內存。
優點:
不會產生內存空間碎片
相較于復制算法,不會有多余空間浪費
缺點:
需要移動對象,效率低。對象移動不單單會加重系統負擔,同時需要全程暫停用戶線程才能進行,也就是常說的“Stop The World”,同時所有引用對象的地方都需要更新。
標記整理與標記清除算法的區別主要也在于對象的移動。
以上就是關于“JVM垃圾回收算法是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。