2012-05-17 59 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)是