Gabage Collection-垃圾回收中爲什麼新生代的Eden:Survivor from:Survivor to = 8:1:1

現代的商業虛擬機都採用複製算法來回收新生代的對象,IBM公司的專項研究表明,新生代中的對象98%都是“朝生夕死”的(即:將被回收的對象:存活的對象 > 9:1),所以如果根據複製算法完成按照1:1的比例劃分新生代的內存空間,將會造成相當大的浪費。

因此,JVM開發人員將新生代分爲一塊較大的Eden區,和兩塊較小的Survivor區,每次可以使用來存放對象的是Eden區和其中一塊Survivor區。當回收時,將Eden區和Survivor from中還存活着的對象一次性複製到另一塊Survivor to區(這裏進行復制算法),然後就清空調Eden區和Survivor from區中的數據。

這樣新生代中可用的內存:複製算法所需要的擔保內存 = 9:1,這樣即使所有的對象都不會存活,那麼也只會“浪費”10%的內存空間。不過我們也無法保證存活的對象一定<2%或10%,當新生代中Survivor to區內存不夠用時,就會觸發老年代的擔保機制進行分配擔保。

之所以Eden區:Survivor from區是8:1,是因爲JVM規定,兩個Survivor區中from和to是相對的,根據每次進行MinorGC後哪個區被清空沒有對象了,這個區就會成爲to區,而通過複製算法複製的還存活下的對象所在的那個區,也就是有對象的區即爲from(即from和to區會進行位置交換,所以在我們講解新生代時,還會給這兩個Survivor區加上S1和S2兩個名稱,而S1和S2位置則是固定的)

總結:

  • 新生代中的可用內存:複製算法用來擔保的內存爲9:1
  • 可用內存中Eden:S1區爲8:1
  • 即新生代中Eden:S1:S2 = 8:1:1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章