JVM為什么要分代回收


我們首先必須知道,將JVM堆中區域分成諸如新生代年老代1並不是java虛擬機規范所規定的,規范中只是闡述了堆這么個區域,將堆中區域進行分代是不同垃圾收集器的行為,而不是JVM的規范,當然大多數垃圾收集器確實對堆進行了分區(分代)回收的策略。

那為什么要這么做呢?(分代收集理論)

這是基於兩個共識

  • 絕大多數對象都是朝生夕死的
  • 熬過越多次垃圾收集過程的對象就越難以消亡

這兩個分代假說共同奠定了多款常用的垃圾收集器的一致的設計原則:收集器應該將Java堆划分 出不同的區域,然后將回收對象依據其年齡(年齡即對象熬過垃圾收集過程的次數)分配到不同的區 域之中存儲。顯而易見,如果一個區域中大多數對象都是朝生夕滅,難以熬過垃圾收集過程的話,那 么把它們集中放在一起,每次回收時只關注如何保留少量存活而不是去標記那些大量將要被回收的對 象,就能以較低代價回收到大量的空間;如果剩下的都是難以消亡的對象,那把它們集中放在一塊, 虛擬機便可以使用較低的頻率來回收這個區域,這就同時兼顧了垃圾收集的時間開銷和內存的空間有 效利用。

在Java堆划分出不同的區域之后,垃圾收集器才可以每次只回收其中某一個或者某些部分的區域 ——因而才有了“M inor GC”“M ajor GC”“Full GC”這樣的回收類型的划分;也才能夠針對不同的區域安 排與里面存儲對象存亡特征相匹配的垃圾收集算法——因而發展出了“標記-復制算法”“標記-清除算 法”“標記-整理算法”等針對性的垃圾收集算法。這里筆者提前提及了一些新的名詞,它們都是本章的 重要角色,稍后都會逐一登場,現在讀者只需要知道,這一切的出現都始於分代收集理論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM