与Java的内存管理困惑(堆栈和堆)(Confused with Java Memory Manag

2019-07-29 10:12发布

这听起来很蠢,但我仍然不明确有关Java栈和堆内存。 我通过研究知道的是以下几点:

1)所有的方法调用的推移堆栈。

2)本地分配的所有内存的推移内存堆(这点不是很清楚)

3)通过新的运营商(或者在一个方法或在一个类)分配的所有存储器推移存储器堆。

我担心的是以下情况:

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

2)如果我的方法中创建一个新对象时,它的推移堆内存,因为它存在即使在方法的执行结束后(I理解这种情况,因为当我此对象分配给一些被Java创建的对象的哈希码保持相同外部参考变量或我返回该对象)。

3)我的问题是,如果我不分配在第2点中提到的任何参考对象或我不回来这个会发生什么。 它仍然是在堆上创建? 按道理它应该是,但请赐教。

Answer 1:

所有方法参数进入堆叠。 所有的局部变量进入堆叠。 是去堆中的唯一的事情是东西分配明确使用new (通过自动装箱或隐或可变参数。)

想想它的另一种方式是,原始值和对象/数组引用可以进入堆叠,但实际的对象不能1。

所以:

1) - 你是返回原始值(不是变量),以及它会在堆栈上! (可以不是“返回”的变量。该变量堆栈帧的一部分,并且不能从它分离。)

2)是的。

3)是,至少在目前1。 在某些时候,GC可以运行,注意到该应用程序不具有对对象的任何更多的参考,并收回它。


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



Answer 2:

代码段:常数值通常直接放置于程序代码段。

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

堆:当你创建一个对象,存储在堆上被执行的代码时分配。

对于您的问题:

1)是

2)是

3)是



文章来源: Confused with Java Memory Management (Stacks and Heaps)