4

这听起来可能很愚蠢,但我仍然不清楚 Java 堆栈和内存堆。我从学习中了解到如下:

1)所有方法调用都在堆栈上。

2)本地分配的所有内存都在内存堆上(这点不太清楚)

3) new 操作符分配的所有内存(无论是在方法中还是在类中)都在内存堆上。

我担心以下情况:

1)如果我在方法中创建一个 int 变量并返回它,它会去哪里(我相信它会进入堆栈,但需要澄清)。

2)如果我在一个方法中创建一个新对象,即使在方法执行结束后它仍然存在,它仍然存在于堆内存中(我理解这是因为当我将此对象分配给某个对象时,java 创建的对象的哈希码保持不变外部引用变量,或者我返回这个对象)。

3) 我的问题是,如果我没有将第 2 点中提到的对象分配给任何引用,或者我没有返回它,会发生什么。它仍然在堆上创建吗?逻辑上应该是,但请赐教。

4

2 回答 2

8

All method parameters go on the stack. All local variables go on the stack. The only thing that goes in the heap is stuff allocated explicitly using new (or implicitly by auto-boxing or varargs.)

Another way to think about it is that primitive values and object/array references may go on the stack, but actual objects cannot1.

So:

1) - you are returning a primitive value (not a variable!), and it goes on the stack. (You can't "return" a variable. The variable is part of the stack frame and can't be detached from it.)

2) Yes.

3) Yes, at least for now1. At some point, the GC may run, notice that the application doesn't have a reference to the object any more, and reclaim it.


1 - actually, the latest Hotspot compilers are capable of detecting that an object's reference never "escapes" from the method that creates it, and that the objects could be allocated on the stack. IIRC, this optimization - called escape analysis - needs to be enabled using a JVM command-line flag.

于 2012-05-17T03:56:39.443 回答
1

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

堆栈:对象引用和原始变量放在堆栈上。

堆:每当您创建一个对象时,执行该代码时都会在堆上分配存储空间。

对于您的问题:

1) 是的

2) 是的

3) 是的

于 2012-05-17T05:33:09.307 回答