您好,登錄后才能下訂單哦!
今天小編給大家分享一下java垃圾回收算法中復制算法的原理是什么的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
復制算法首先將或者的內存空間分為2塊,每次只使用其中一塊,在垃圾會搜時將正在使用的內存中的存活對象復
制到未被使用的內存塊中,之后清楚正在使用的內存塊中的所有對象,交換2個內存的角色,最后完成垃圾回收。
HotSpot JVM
把年輕代分為了三部分:1個Eden區
和2個Survivor區
(分別叫from
和to
)。默認比例為8:1,為啥默認會是這個比例,接下來我們會聊到。一般情況下,新創建的對象都會被分配到Eden區(一些大對象特殊處理),這些對象經過第一次Minor GC
后,如果仍然存活,將會被移到Survivor區
。對象在Survivor區
中每熬過一次Minor GC
,年齡就會增加1歲,當它的年齡增加到一定程度時,就會被移動到年老代中。
因為年輕代中的對象基本都是朝生夕死的(80%以上),所以在年輕代的垃圾回收算法使用的是復制算法,復制算法的基本思想就是將內存分為兩塊,每次只用其中一塊,當這一塊內存用完,就將還活著的對象復制到另外一塊上面。復制算法不會產生內存碎片。
在GC
開始的時候,對象只會存在于Eden區
和名為“From”的Survivor區
,Survivor區
“To”是空的。緊接著進行GC
,Eden區
中所有存活的對象都會被復制到“To”,而在“From”區中,仍存活的對象會根據他們的年齡值來決定去向。年齡達到一定值(年齡閾值,可以通過-XX:MaxTenuringThreshold
來設置)的對象會被移動到年老代中,沒有達到閾值的對象會被復制到“To”區域。經過這次GC
后,Eden區
和From區
已經被清空。這個時候,“From”和“To”會交換他們的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎樣,都會保證名為To的Survivor區
域是空的。Minor GC
會一直重復這樣的過程,直到“To”區被填滿,“To”區被填滿之后,會將所有對象移動到年老代中。
由于JVM中的絕大多數對象都是瞬時狀態的,生命周期非常短暫,所以復制算法被廣泛應用于年輕代中。分區、復制的思路不僅大幅提升了垃圾回收的效率,而且也將原本復雜的內存分配算法變的前所未有的簡明扼要(既然每次內存回收都是對整個半區空間的回收,內存分配時也就不用考慮內存碎片等復雜情況,只要移動堆頂指針,按順序分配內存就可以了)。
不過在垃圾收集技術中,復制算法提高效率的代價是認為的將可用內存縮小了一半。
以上就是“java垃圾回收算法中復制算法的原理是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。