JVM中新生代為什麼要有兩個Survivor(form,to)?

時間 2021-05-06 23:10:02

1樓:別吃我辣條

我寫下自己的觀點,如果1塊survivor的話,在第一次gc後,存活的物件都在survivor區,eden區空著,由於採用的複製演算法,物件會在survivor分配,第二次gc存活的物件去eden,而由於survivor空間小,容易觸發gc,整體gc頻率就高了

2塊survivor的話,eden和from在gc後物件去to,之後from和to會互換,這樣的話能保證始終有一塊空間是空閒的,當作gc後存放物件的容器,新產生的物件依然可以在eden區分配,然後不斷迴圈

2樓:大斌舟

其實就是初始劃分一次後, 以後都不用劃分了.

設想, 初始分成了9 : 1, 第一次gc後, 存活的物件都被複製到1區, 那麼為了下一次gc, 是不是又得劃分乙個新的1區?

所以乾脆一開始就劃分成8 : 1 : 1, 兩個1區迴圈使用

3樓:累累的

綜合各位大佬的回答談一下自己的理解

我理解的複製演算法是兩塊記憶體區域來回將乙個區域存活物件複製到另外一塊區域上

也就是一次GC過後只有乙個記憶體區域可以為物件分配空間。

在這個前提下

假設只有乙個Eden區和乙個Survivor區,比例是8:2

當經過一次GC後,Eden區剩餘1份存活物件,複製到Survivor區後,Survivor區剩餘1份可用空間,那麼在下次GC到來之前,物件只能在Survivor區分配,此時只有1份比例的空間可以使用,這樣空間就造成很大的浪費了,而且會很快造成第二次GC,那還不如就對半分區域,沒必要區分Eden區和Survivor區。

假如有兩個Survivor區,那麼Eden區就可以在下次GC時,能繼續為物件分配記憶體,複製只發生在兩個Survivor區,因為新生代本來存活物件就佔少數,所以每個佔1份是比較合理的比例。

所以複製演算法其實就是針對From和To這兩塊區域的,Eden只用於為物件分配空間,不會因為複製的記憶體交換而變得不可用。

這樣對空間的使用可能時最大化了吧。

這是我個人的理解,能力有限,有錯誤的地方希望指出。

4樓:橙子

我在CSDN寫了一篇部落格描述設定兩個Survivor區的原因,也許可以幫到你

為什麼很少人知道新生代

雲舞空城 新生代算不錯了,我要說個古近紀或者漸新世估計路邊瓜眾直接懵逼。畢竟有侏羅紀公園和寒武大爆發珠玉在前,新生代最廣為人知的,大概只有kt事件的t,恐鳥巨犀劍齒X,古人類進化,冰河時代了。其實這麼算下來,我倒是覺得新生代或許是排在寒武紀,侏羅紀,白堊紀之後,人們最熟悉的代一級地質年代了。至少比知...

為什麼這麼多人噴新生代奧特曼?

天源流年 因為變身器都不如從前了,現在奧特曼使用的東西塑料感太強了。以前最開始的幾個昭和奧特曼的變身器雖然簡陋,但是違和感挺小。後來越來越好,也越來越精緻,但是違和感一直都是沒有的。而現在的澤塔,昇華器和存放勳章的盒子塑料感極強,就像在提醒我這玩意是個塑料製品一樣。最近要出來的特利迦的勝利神光棒塑料...

具體說說新生代奧特曼為什麼會被罵?

sigmaW deltaEk 首先得出結論 新生代奧絕對不爛,從銀河到澤塔這8部奧特系列TV作品都是很優秀的特攝作品。我們接受一些觀眾對新生代某一部風格的不適應甚至是對整個新生代風格的不適應。但是我們絕不接受任何觀眾對於新生代作品開除奧籍的言論和徹底否定其內涵的無腦抹黑。為什麼新生代作品的時代都快結...