2010-05-13 174 views
5

每当加载一个类时,堆中存储了什么以及存储在堆栈中的是什么?JVM - 堆栈和堆栈

线程还驻留在哪里?

回答

4

引用类型在堆中。

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

每个线程都有自己的堆栈。

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

+0

@Nirmal:没什么奇怪的。无论是C/C++运行时还是其他方式,它在所有运行时都是相同的行为。所以,我不太明白“为什么”这个“为什么”从你身边:) – 2010-05-13 11:18:24

+1

“任何原始类型的数据......都在堆上”有点令人困惑。如果堆是对象的数据成员,堆就会存储基元。 – 2010-05-13 12:30:56

+0

是的。它的确如..但是,正如你所提到的,作为复合材料的一部分。然而,当我们访问数据时,它首先被复制到堆栈上。例如,对于具有定义ComplexNumber {float real,float imaginary}的对象,在doWork(ComplexNumber cn){返回cn.real * cn.real + float.imaginary * float。假想; } 首先将实数/虚数值带入堆栈unline cn,其中仅将参考引入堆栈 – 2010-05-14 10:26:27

3

这真的很容易:

  • 对象(即类的实例)是总是在堆上。他们不能在其他地方
    • 字段是对象的一部分,所以他们也住在堆上。
  • 局部变量(包括方法/构造函数)参数是总是在栈上。他们不能在其他地方。

注意局部变量只有保持引用(“指针”)或原始数值。局部变量永远不能容纳“一个对象”。

请注意,这个视图是在JVM规范中定义的。如果需要,具体的JVM可以在非堆区域中分配对象。例如:如果它知道新创建的对象永远不会转义当前的调用,那么它可以将实例化的对象放入堆栈区域。但是,这是开发人员不可见的优化。

0

原语:堆栈

对象:堆

线程:有一个单独的堆栈而共享相同的堆。

+0

是不是原语存储在堆上?并在堆栈上,如果他们是本地变量? – Mike 2012-05-22 13:36:16

0

@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 = “无名氏”; '一个局部变量? 它是什么类型的变量,它住在哪里?