这听起来很蠢,但我仍然不明确有关Java栈和堆内存。 我通过研究知道的是以下几点:
1)所有的方法调用的推移堆栈。
2)本地分配的所有内存的推移内存堆(这点不是很清楚)
3)通过新的运营商(或者在一个方法或在一个类)分配的所有存储器推移存储器堆。
我担心的是以下情况:
1)如果我的方法创建一个int变量并返回它,它在哪里去(我相信它会在栈上,但需要澄清)。
2)如果我的方法中创建一个新对象时,它的推移堆内存,因为它存在即使在方法的执行结束后(I理解这种情况,因为当我此对象分配给一些被Java创建的对象的哈希码保持相同外部参考变量或我返回该对象)。
3)我的问题是,如果我不分配在第2点中提到的任何参考对象或我不回来这个会发生什么。 它仍然是在堆上创建? 按道理它应该是,但请赐教。
所有方法参数进入堆叠。 所有的局部变量进入堆叠。 是去堆中的唯一的事情是东西分配明确使用new
(通过自动装箱或隐或可变参数。)
想想它的另一种方式是,原始值和对象/数组引用可以进入堆叠,但实际的对象不能1。
所以:
1) - 你是返回原始值(不是变量),以及它会在堆栈上! (可以不是“返回”的变量。该变量堆栈帧的一部分,并且不能从它分离。)
2)是的。
3)是,至少在目前1。 在某些时候,GC可以运行,注意到该应用程序不具有对对象的任何更多的参考,并收回它。
1 -实际上,最新热点编译器能够检测一个对象的引用从未从创建它,并且该对象可以在栈上分配方法“逃逸”。 IIRC,这种优化-被称为逃逸分析-需要使用JVM命令行标志启用。
代码段:常数值通常直接放置于程序代码段。
堆栈:对象引用和原始变量放在堆栈上。
堆:当你创建一个对象,存储在堆上被执行的代码时分配。
对于您的问题:
1)是
2)是
3)是