在这两个地方都可以找到基元。
class Foo
{
public int x;
public static void Main()
{
int y = 3; // y is on the stack
Foo f = new Foo(); // f.x is probably on the heap
}
}
除非您不真正在乎,除非您正在构建JVM。 一个真正聪明的优化器可能会决定,由于f指向的Foo永远不会逃离Main,并且永远不会传递给另一个函数,因此可以安全地在堆栈上分配它。
关于更新:
堆栈和堆不是通过存储在其中的东西来区分的,而是通过为其提供的操作来区分的。 堆栈允许您以LIFO方式分配一块内存,直到所有比它还年轻的块都被释放为止,您才能取消分配一块。 这方便地与调用堆栈的使用方式保持一致。 您可以将任何东西放到堆栈上,只要可以在函数返回时将其清除即可。 这是一种优化,因为从堆栈中分配和取消分配非常快,因为它仅支持以这种方式使用。 如果愿意的话,可以在一个实现中将函数的所有局部变量存储在实现中。 堆更灵活,因此使用起来更昂贵。 就像我说的那样,说一个对象有一个堆栈和一个堆是不正确的,将堆栈与堆区分开的不是其中的内容,而是可用的操作。