2014-01-11 46 views
0

在JConsole中,我看到了不同的堆空間「Eden」,「Survivor」,「Old」。 他們有什麼區別?什麼是不同的Java堆空間?

+0

這可能會幫助你瞭解:http://stackoverflow.com/questions/2129044/java-heap-terminology-young-old-and-permanent-generations –

+1

谷歌Java內存模型 –

回答

0

請參閱Memory Management in the Java HotSpotTM Virtual Machine白皮書。

Java將堆分成兩個稱爲'世代'的空間,即新一代和老一代。新一代進一步分爲伊甸園和倖存者空間。

擁有新一代和老一代的原因是因爲幾乎Java程序中的所有對象都只存在一小段時間,並且如果短期對象都可以在不檢查所有長期存在的對象的情況下解除分配,垃圾收集將會快得多。例如,一個程序通常具有配置設置和共享數​​據對象,這些對象在程序的整個生命週期中都存在,而像StringBuilders這樣的對象不斷被創建,在創建它們的方法甚至返回之前它們會變成垃圾。理想情況下,幾個方法調用後創建的所有臨時對象都可以立即回收,而不用浪費時間查看其他任何東西。

Java如何區分短壽命對象和長壽命對象?通過將它們放入不同的桶並計算它們存活的垃圾收集量。全新的物品進入伊甸園空間。伊甸園的空間通常都是垃圾收集的,但是在檢查時幾乎所有的東西都已經是垃圾了。少數不是垃圾的物體會移入Survivor空間。 Survivor空間中的對象被標記爲它們存活多少垃圾集合的計數。有些變得無法訪問,並且相對較快地獲得垃圾回收,但其他垃圾回收機制仍然可以訪問,並且在它們存活了一些閾值數量的垃圾回收後,Java假定它們是長壽命的對象,並將它們推廣到老一代。