在JVM GC的分代機制中,年輕代中有兩個Survivor區,為了便於交換,需要保證其中一個為空,這個容易理解,但是為什么需要兩個Survivor區,而且很多網上資料中說在特殊情況下,可以配置為多個,並沒有說怎么配置,也沒有說是什么特殊情況。
下面是一個小小的可以借鑒的原因,是從http://www.iteye.com/topic/894148看到的:
1)感覺這是和GC的copying算法相關吧,既然是拷貝,就得有地方做from,有地方做to。
2)嗯,正是如此。在原始的copying收集算法里,空間被分為兩半,叫做semispace。空間分配和回收的過程就是把其中一半用作from來分配空間,當from快滿或滿足別的一些條件時將可到達的對象復制到to,並將from與to邏輯交換的過程。
單純的copying收集不能很好的應對長時間存活的對象,因為那樣的對象每次經歷收集的時候都還活着,帶來拷貝的開銷。出於權衡,HotSpot里目前除G1外都采用相似的方式實現分代式GC,並且在young gen都使用copying收集算法。不過它使用的copying算法是原始算法的變種,留一塊較大的區域作為eden,在eden與old gen之間設置semispace來作為緩沖,讓“中等壽命”的對象盡量在進入old gen之前被收集掉。這就是HotSpot的survivor spaces了。
嗯雖說是相似的方式,不過HotSpot里Parallel Scavenge與另外幾種GC在實現上有點不同。其它的幾種是共用了一套從JDK 1.4開始用的分代式GC框架,Parallel Scavenge則是自己實現了類似的功能而沒用那套框架
但這仍然不能解釋為什么只需要兩個Survivor區。個人感覺是為了提高效率,只有兩個空間來相互交換,當有三個空間時,根據已存的算法,此時就有兩個空間空着啦,木有任何意義,但是可以改進算法啊,此時又陷入迷惑當中,尋求真實原因,求大牛解釋。