java 中垃圾收集的方法有哪些?

1. 標記-清除:
這是垃圾收集算法中最基礎的,根據名字就可以知道,它的思想就是標記哪些要被
回收的對象,然後統一回收。這種方法很簡單,但是會有兩個主要問題:1.效率不
高,標記和清除的效率都很低;2.會產生大量不連續的內存碎片,導致以後程序在
分配較大的對象時,由於沒有充足的連續內存而提前觸發一次 GC 動作。
2. 複製算法:
爲了解決效率問題,複製算法將可用內存按容量劃分爲相等的兩部分,然後每次只
使用其中的一塊,當一塊內存用完時,就將還存活的對象複製到第二塊內存上,然
後一次性清楚完第一塊內存,再將第二塊上的對象複製到第一塊。但是這種方式,內存的代價太高,每次基本上都要浪費一般的內存。
於是將該算法進行了改進,內存區域不再是按照 1:1 去劃分,而是將內存劃分爲
8:1:1 三部分,較大那份內存交 Eden 區,其餘是兩塊較小的內存區叫 Survior 區。
每次都會優先使用 Eden 區,若 Eden 區滿,就將對象複製到第二塊內存區上,然
後清除 Eden 區,如果此時存活的對象太多,以至於 Survivor 不夠時,會將這些對
象通過分配擔保機制複製到老年代中。(java 堆又分爲新生代和老年代)
3. 標記-整理
該算法主要是爲了解決標記-清除,產生大量內存碎片的問題;當對象存活率較高
時,也解決了複製算法的效率問題。它的不同之處就是在清除對象的時候現將可回
收對象移動到一端,然後清除掉端邊界以外的對象,這樣就不會產生內存碎片了。
4. 分代收集
現在的虛擬機垃圾收集大多采用這種方式,它根據對象的生存週期,將堆分爲新生
代和老年代。在新生代中,由於對象生存期短,每次回收都會有大量對象死去,那
麼這時就採用複製算法。老年代裏的對象存活率較高,沒有額外的空間進行分配擔
保,所以可以使用標記-整理 或者 標記-清除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章