2012-05-17 101 views
4

這聽起來很愚蠢,但我仍然不清楚Java堆棧和內存堆。我從研究中得知如下:與Java內存管理(堆棧和堆)混淆

1)所有的方法調用都進入堆棧。

2)所有本地分配的存儲器的推移存儲器堆(未關於這點很清楚)

3)由新的運營商分配的所有存儲器(無論是在一個方法或在一個類)的推移存儲器堆。

我擔心的是以下情況:

1)如果我的方法創建一個int變量並返回它,它在哪裏去(我相信它會在棧上,但需要澄清)。如果我在一個方法中創建一個新的對象,即使在方法執行結束後它仍然存在於堆內存中(我理解這是因爲Java分配的對象的哈希代碼在我分配時保持不變這個對象給一些外部引用變量或者我返回這個對象)。

3)我的問題是如果我沒有將第2點中提到的對象分配給任何引用會發生什麼,或者我沒有返回這個。它是否仍然在堆上創建?邏輯上它應該是,但請賜教。

回答

8

所有方法參數都放在堆棧上。所有局部變量都在堆棧中。是去堆中的唯一的事情是東西分配明確使用new(通過或隱式自動裝箱或可變參數。)

另一種方式去思考它是原始值和對象/數組引用可能會在堆棧,但實際的對象不能。

所以:

1) - 你是返回原始值(不是變量),以及它會在堆棧上! (你不能「返回」一個變量,該變量是堆棧幀的一部分,不能從中分離)

2)是的。

3)是的,至少現在是。在某些時候,GC可能會運行,注意應用程序不再提及對象,並回收它。


1 - 實際上,最新熱點編譯器能夠檢測一個對象的引用從未從創建它,並且該對象可以在棧上分配方法「逃逸」。 IIRC,這種優化 - 稱爲逃逸分析 - 需要使用JVM命令行標誌啓用。

+0

非常感謝你much..I很滿意答案:) – dharam

1

代碼段:常量值通常直接放在程序代碼段中。

堆棧:對象引用和基本變量放在堆棧上。

堆:每當你創建一個對象時,當代碼被執行時,存儲就被分配到堆上。

對於您的問題:

1)是

2)是

3)是