垃圾回收算法介紹


垃圾回收算法java


常見的垃圾回收算法算法

1.標記-清除算法安全

2.複製算法微信

3.標記-整理算法數據結構

4.分代垃圾收集算法jvm



標記-清除算法flex

    標記-清除就是JVM運行過程當中對java對象所在的內存區域進行標記,因爲java對象是分散在整個內存中的,有些對象是能夠回收的,有些卻不能夠,咱們標記完待回收的內存,以後就會對這這些內存進行一次回收,這樣致使的一個問題就是回收以後內存空間零散的分佈在整個堆內存中,這些不連續的內存空間會致使後期一些大對象分配不進去。優化


複製算法
url




    複製算法就能夠解決掉上面清除以後出現大量不連續內存空間的問題。複製算法將整個內存空間分紅大小相等的兩塊區域,每次使用其中一塊內存,當該區域內存標記清除以後,將存活的對象複製到另外一塊內存中,這樣能夠又能夠騰出一塊連續的內存空間,每次分配內存均可以移動堆頂的指針按順序在堆中分配。spa

注意這種算法會比較浪費堆內存空間,每次的實際可用空間縮減一半,代價仍是很高的。可是如今的商用虛擬機大部分採用這中算法來進行垃圾回收,不過進行了優化改進,因爲jvm運行過程當中,大部分的對象存活的時間是很短的,這類對象的生命週期通常的伴隨着線程的啓動和死亡就基本上沒有用了。因此後來對jvm內存分區進行了從新分配,出現了新生代和老年代,新生代中又將內存區域分爲Eden區和Survivor區,這樣大部分對象建立首先是在Eden中分配,隨後每觸發一次YGC就能夠將Eden區還存活的對象移動到Survivor中,當達到必定的GC年齡能夠複製到老年代,還有就是老年代是做爲年輕代內存分配的一個擔保,若是年輕代分配不了時,會直接經過分配擔保機制進入老年代。這裏年輕代的Survivor其實還區分爲From Survivor和To Survivor兩個,這裏的複製規則後邊詳細討論。


標記整理算法

        上面的複製算法能夠看出須要將內存進行分塊,並且是一分爲二,固然咱們知道年輕代的並無徹底一分二,將形成有一半的內存不能直接分配對象,因此上面年輕代的大小佔堆很小部分,通常是1/4或者1/3。這樣老年代能夠是年輕代的擔保,可是老年代的回收使用一分爲二的方式進行內存分配,就沒有其餘內存進行擔保了。因此複製算法不太適合老年代的內存回收。因此老年代的回收已經再也不適合複製算法,因而就出現了一種標記-整理的算法,這裏相似標記清除,只不過整理的過程須要將存活的對象往堆的一端移動來保證清除以後內存的連續性。

備註:這裏說到年輕代是採用Eden和Survivor的方式,比例也是能夠自由實現的,並且默認Eden/survivor通常的是8:1,並無徹底是一分爲二,可是仍是能夠看出有複製分塊的思想


分代收集算法

    上面說的這些算法,如今的一些商用虛擬機中都有用到,結合上面各個算法優缺點,jvm將內存空間進行分代處理,分爲年輕代和老年代,還有老版本的永久代,正對不一樣的分代的區域採用不一樣類型的回收算法,因此年輕代,上面講述了能夠採用複製算法,將對象在Eden中,複製到survivor中再轉向老年代,老年代則經過標記-整理保證堆空間的連續性。對於咱們平時用的Hotspot虛擬機回收是經過不一樣的垃圾回收器進行回收,垃圾回收器就會用到上面所說的幾種回收算法。


Stop The Word

    這裏主要說一下Stop The World,我以爲這是java虛擬機的一個垃圾回收特點吧。STW就是jvm回收垃圾的時候會停掉應用線程,這麼說來應用在運行的時候會出現短暫的停頓,咱們稱之爲Stop The World,爲何jvm須要Stop the World以前就講過java虛擬機如何判斷對象的存活和死亡,是採用Root Object可達性分析的方式,那麼程序運行過程當中棧中的變量表是時刻變更的,因此jvm須要獲取某一時刻的堆棧中對象的快照,要想獲取某些時刻,就必須保持一個短暫的停頓來完成凍結,肯定根對象,而後就能夠完成引用的可達性分析。

安全點和安全區

    首先hotspot jvm中會有一種OopMap的數據結構精準的記錄對象的引用,不是每次都是檢查一遍堆棧的引用對象位置,當STW的時候,jvm就會從這裏獲取說有的引用進行分析。固然jvm也不是隨便的去暫停應用的全部線程,也是須要程序達到以這個安全點或者安全區域,這些時刻或者時間段,jvm纔會去執行STW,將線程掛起,這個安全點在jvm也是有標記的,線程運行過程當中會輪詢安全點標識,當全部線程都獲得通知到達一個安全點進行掛起,jvm纔會去執行相關的垃圾回收。

        瞭解了這些垃圾回收算法以後,咱們就能夠去分析各個時期,各個分區垃圾回收器的特色。下一篇咱們會介紹hotspot虛擬機垃圾回收器相關的知識。


微信公衆號:MyClass社區

若有問題或建議,請公衆號留言。

喜歡請關注

本文分享自微信公衆號 - MyClass社區(MyClass_ZZ)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索