2016-02-12 51 views
2

我知道Java在堆中分配對象以及爲什麼。我知道原始數據類型和引用變量分配在堆棧結構上。Java的堆結構實現

我不明白的是它的效率。與其他人相比,它似乎工作得很快。

我的問題是相互關聯的:什麼使Java的堆結構高效?它是如何實現的?

+5

_「比其他堆的執行速度快,例如C」。_需要一些基準。此外,堆實現取決於您使用的特定JVM,對於任何常見的JVM,對於SO答案,深入分析將會太長。 –

+0

多年前我在Programming Language的Concepts類中學習了它,它使用垃圾回收器重新分配(儘管我不明白它是如何工作的),它模擬對象的堆棧結構。我想知道這是否是JVM中的默認設置。如果沒有,我想問問它的工作原理是無用的......謝謝@Colonel三十二。我會等待更多反饋和可能的答案。我還會看看是否可以在Java和C中再次編寫一個小算法,這需要在Heap結構中分配大量內存來進行比較。 –

+2

自由移動對象的能力在簡化內存分配方面極其重要。大多數情況下,堆分配只是分配下一塊內存,並在某處增加一個指針,然後GC將所有保留的對象移出,這樣您就可以繼續擁有大量的可用內存。 –

回答

3

HotSpot JVM使用一系列不同的垃圾收集器相互串聯,以提高效率。由於大多數對象的生命週期非常短,因此對於大多數分配,它使用小型停止 - 複製垃圾回收器。由於停止 - 複製允許幾乎即時分配(通常是一個或兩個彙編指令),因此這使得大部分分配都很快。執行「複製」步驟的成本很低,因爲大多數對象都會回收,並且爲副本收集器保留的小尺寸爲複製所花費的最長時間提供了上限。

對於在stop-and-copy收集器的第一層中長時間存活的對象,HotSpot具有第二級別的停止 - 複製內存,用於重定位這些對象。這可以釋放頂級副本收集器中的更多空間。在那裏存活足夠長的物體然後移動到使用標記和掃描收集的區域。這個想法是,任何結局都可能會持續很長時間,因爲它存活了很長時間。

這種混合方法 - 加上一堆其他優化 - 解釋了爲什麼分配和釋放如此之快。請注意,這裏使用的關鍵技巧 - 即重定位對象 - 由於暴露指針而難以在低級語言中實現。

+0

感謝您花時間解釋所有這些,@templatetypedef! –