为什么在Java中使用堆来管理对象引用?

时间:2018-10-16 16:33:16

标签: java data-structures jdk1.6

函数和变量存储在堆栈中,而字符串和对象引用存储在堆中。为什么它们的存储方式有所不同?

1 个答案:

答案 0 :(得分:0)

上面的一些评论提供了区别的链接。堆栈是临时的。堆栈块用作代码嵌套。想想很大的内存块,您只在其中跟踪内存的最高端。当您调用一个方法时,系统会知道需要多少内存来记住该方法退出时返回到的位置以及足够的空间来存储该方法所需的变量。然后,堆栈指针指向内存中的较高位置,为您提供它刚刚跳过的所有空间。当方法返回时,堆栈指针将返回到调用方法之前的位置。现在所有存在的变量都消失了。

在像Java这样的复杂世界中,这并不完全那么简单,但是我仍然想到了汇编语言中的堆栈,这是我第一次遇到它的地方。 (我已经老了。)足够接近这个讨论了。

堆是不同的。堆是具有复杂结构的托管内存,可以跟踪您使用的内存。如果您说new Foo(),则Java知道Foo有多大,并要求堆提供足够的空间来容纳一个Foo。管理它会发生许多更复杂的事情。但是,当您的方法返回时,该对象仍然存在。如果它是在堆栈上分配的,那将是真正的问题,因为当方法返回时,堆栈会展开。但是您堆中的内存仍然被分配,并且您的对象可以继续存在。

同样,它不是那么简单,但是也许是有道理的。

仅当您的方法正在运行时,堆栈上的空间才存在。 (我猜想如果您嵌套在{}内,它可能会分配更多空间。我不知道。)堆上的空间一直存在,直到对象被释放为止,但这可能比方法调用的持续时间更长。