JVM - 堆栈和堆栈
答
引用类型在堆中。
任何原始类型数据和对堆上的值(方法的参数/局部变量)的引用都在堆栈上。
每个线程都有自己的堆栈。
应用程序中的所有线程共享相同的堆。
答
这真的很容易:
- 对象(即类的实例)是总是在堆上。他们不能在其他地方
- 字段是对象的一部分,所以他们也住在堆上。
- 局部变量(包括方法/构造函数)参数是总是在栈上。他们不能在其他地方。
注意局部变量只有保持引用(“指针”)或原始数值。局部变量永远不能容纳“一个对象”。
请注意,这个视图是在JVM规范中定义的。如果需要,具体的JVM可以在非堆区域中分配对象。例如:如果它知道新创建的对象永远不会转义当前的调用,那么它可以将实例化的对象放入堆栈区域。但是,这是开发人员不可见的优化。
答
@Joachim绍尔
如果你说的是真的,那么为什么,在下面的代码,
class Student{
int age; //instance variable
String name; //instance variable
public Student()
{
this.age = 0; //local variable and member of an object
name = "Anonymous";
}
那么,为什么不是“NAME = “无名氏”; '一个局部变量? 它是什么类型的变量,它住在哪里?
@Nirmal:没什么奇怪的。无论是C/C++运行时还是其他方式,它在所有运行时都是相同的行为。所以,我不太明白“为什么”这个“为什么”从你身边:) – 2010-05-13 11:18:24
“任何原始类型的数据......都在堆上”有点令人困惑。如果堆是对象的数据成员,堆就会存储基元。 – 2010-05-13 12:30:56
是的。它的确如..但是,正如你所提到的,作为复合材料的一部分。然而,当我们访问数据时,它首先被复制到堆栈上。例如,对于具有定义ComplexNumber {float real,float imaginary}的对象,在doWork(ComplexNumber cn){返回cn.real * cn.real + float.imaginary * float。假想; } 首先将实数/虚数值带入堆栈unline cn,其中仅将参考引入堆栈 – 2010-05-14 10:26:27