为什么堆用于管理 java 中的对象引用?

Why heaps are used for managing object references in java?

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

上面的一些评论提供了差异的链接。堆栈是临时的。堆栈的块用作您的代码嵌套。想象一大块内存,您只跟踪内存的最顶部。当你调用一个方法时,系统知道需要多少内存来记住return到方法退出的位置,以及足够space用于方法所需的变量。然后堆栈指针指向内存中更高的位置,为您提供它刚刚跳过的所有 space 。当你的方法 returns 时,堆栈指针被 returned 到你的方法被调用之前的位置。那里的任何变量现在都消失了。

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

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

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

Space 仅在您的方法为 运行 时才存在。 (我假设如果您嵌套在 {} 中,它可能会分配更多 space。我不知道。)堆上的 Space 会一直持续到对象被释放,但这可能比持续时间长得多方法调用。