Java原语是在堆栈上还是在堆上?

2022-08-31 16:19:28

我只知道非基元(对象)在堆上,方法在堆栈上,但是基元变量呢?

--更新

根据答案,我可以说堆可以为给定对象提供新的堆栈和堆?假设对象将具有基元变量和引用变量..?


答案 1

本地定义的基元将在堆栈上。但是,如果将基元定义为对象实例的一部分,则该基元将位于堆上。

public class Test {
    private static class HeapClass {
        public int y; // When an instance of HeapClass is allocated, this will be on the heap.
    }
    public static void main(String[] args) {
        int x=1; // This is on the stack.
    }
}

关于更新:

对象没有自己的堆栈。在我的示例中,实际上是 的每个实例的一部分。每当分配 HeapClass 的实例(例如)时,HeapClass 的所有成员变量都会添加到堆中。因此,由于 的实例是在堆上分配的,因此将作为 的实例的一部分在堆上。int yHeapClassnew Test.HeapClass()HeapClassint yHeapClass

但是,在任何方法的主体中声明的所有基元变量都将位于堆栈上

正如您在上面的示例中看到的,它位于堆栈上,因为它是在方法主体中声明的,而不是作为类的成员。int x


答案 2

所有局部变量(包括方法参数)都在堆栈上;对象及其所有字段都存储在堆中。变量始终是基元或对对象的引用

Java 实现实际上可能以仍然符合规范的方式将对象存储在堆上。同样,局部变量可以存储在寄存器中,或者通过优化变得模糊不清。


推荐