2009-11-24 78 views
2

JVM和.NET VM是否在運行時很明顯地將對象生存期限制在特定範圍內時分配堆棧上的對象?JVM和CLR分配優化

+1

你能詳細說明它是什麼時候*明顯*嗎?我不確定它...... – 2009-11-24 16:18:50

+0

好吧來自C,C++世界,看起來很明顯... 由於在Java和.NET中,VM知道每個對象的引用。如果你在一個方法中創建一個對象並且永遠不會在其他地方傳輸,那麼將它保存在堆棧中是有意義的。無論如何都存在用於傳遞參數的堆棧,爲什麼不能從超快(和超級簡單)堆棧分配中受益呢? – 2009-11-24 17:18:45

回答

5

JVM執行此操作。在適當的情況下,它實際上可以完全取消分配。

引用此article.

Java語言不提供任何辦法明確分配堆棧上的對象,但這一事實並不妨礙JVM中的適當地方仍然使用堆棧分配。 JVM可以使用一種叫做逃逸分析的技術,通過這種技術他們可以知道某些對象在整個生命週期中都被限制在一個線程中,並且該生命週期受到給定棧幀的生命週期的限制。這些對象可以安全地分配到堆棧而不是堆上。更好的是,對於小型對象,JVM可以完全優化分配,並簡單地將對象的字段提升到寄存器中。

有關Escape analysis的更多信息源自維基百科。

+0

JVM的哪個版本執行此操作?更重要的是,最新的支持Escape Analysis? – 2011-02-13 20:02:17

+2

Java 6更新14,您必須使用命令行選項啓用它。 (-XX:+ DoEscapeAnalysis)。它看起來像在更新18中被刪除,然後在更新21中再次添加。我不確定命令行選項是否仍然需要 - 但我會使用它只是安全的。 – 2011-02-14 14:09:40