JVM - 堆和栈

6
无论何时加载一个类,堆中存储了什么,栈中存储了什么?
线程位于哪里?
3个回答

4

引用类型存储在堆上。

任何原始类型数据和指向堆中的值(方法的参数/局部变量)的引用都存储在栈上。

每个线程都有自己的栈。

应用程序中所有线程共享同一堆。


@Nirmal:这并不奇怪。无论是C/C++运行时还是其他运行时,它的行为都是一样的。所以,我真的不明白你那边的“为什么”的“为什么”了 :) - gvaish
1
“任何原始类型数据...都在堆上”这句话有点令人困惑。如果它们是对象的数据成员,堆确实会存储原始类型数据。 - Eyal Schneider
是的。确实如此。但是,正如您所提到的那样,作为组合的一部分。 然而,一旦我们访问数据,它首先被复制到堆栈上。例如,对于具有定义ComplexNumber { float real,float imaginary }的对象,在方法doWork(ComplexNumber cn} {return cn.real * cn.real + float.imaginary * float.imaginary; } 实数/虚数值首先被带到堆栈上,而不是像cn一样只带引用到堆栈上。 - gvaish

4

很简单:

  • 对象(即类的实例)始终位于堆上,它们不能出现在其他地方。
    • 字段是对象的一部分,因此它们也位于堆上。
  • 局部变量(包括方法/构造函数参数)始终位于栈上,它们不能出现在其他地方。

请注意,局部变量只能持有引用(“指针”)或基本类型值。局部变量永远不能持有"对象"。

请注意,这个视图是JVM规范中定义的。如果一个具体的JVM希望,它可以在非堆区域分配对象。例如:如果它知道新创建的对象从不逃逸当前调用,则它可以将实例化对象放入堆栈区域。但是,这是对开发人员不可见的非常优化。


-1

基本类型:栈

对象:堆

线程:拥有独立的栈,但共享同一堆。


如果原始类型是实例变量,它们不是存储在堆上吗?如果它们是局部变量,它们就存储在栈上了吧? - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接