与Java内存管理(堆栈和堆)混淆

与Java内存管理(堆栈和堆)混淆,java,memory-management,callstack,Java,Memory Management,Callstack,这听起来可能很愚蠢,但我仍然不清楚Java堆栈和内存堆。我从学习中学到的是: 1) 所有方法调用都在堆栈上进行 2) 所有本地分配的内存都放在内存堆上(这一点不是很清楚) 3) 新操作符(在方法或类中)分配的所有内存都放在内存堆上 我担心以下情况: 1) 若我在一个方法中创建一个int变量并返回它,那个么它会去哪里(我相信它会在堆栈上,但需要澄清) 2) 如果我在一个方法中创建了一个新对象,即使在方法执行结束后,它仍然会在堆内存中存在(我理解这种情况,因为当我将这个对象分配给某个外部引用变量或返

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

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

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

3) 新操作符(在方法或类中)分配的所有内存都放在内存堆上

我担心以下情况:

1) 若我在一个方法中创建一个int变量并返回它,那个么它会去哪里(我相信它会在堆栈上,但需要澄清)

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


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

所有方法参数都在堆栈上。所有局部变量都在堆栈上。堆中唯一的东西是使用
new
(或者通过自动装箱或varargs隐式地)显式分配的内容

另一种考虑方法是,基本值和对象/数组引用可以放在堆栈上,但实际对象不能1

因此:

1) -您正在返回一个基元值(不是变量!),它将进入堆栈。(不能“返回”变量。该变量是堆栈框架的一部分,不能从堆栈框架中分离。)

2) 对

3) 是的,至少现在是这样。在某个时刻,GC可能会运行,注意到应用程序不再有对对象的引用,并回收它



1-实际上,最新的热点编译器能够检测到对象的引用从未从创建它的方法中“逃逸”,并且可以在堆栈上分配对象。IIRC,这种称为转义分析的优化需要使用JVM命令行标志启用。

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

堆栈:对象引用和基本变量放置在堆栈上

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

关于您的问题:

1) 对

2) 对


3) 是的

非常感谢..我对答案很满意:)