Java(Stack& Heap) - 在这个简单的例子中,内存明智地发生了什么

时间:2011-12-08 19:00:41

标签: java memory stack heap

在这个例子中,任何人都可以解释记忆明智的事情(Stack& Heap)吗?如果我理解正确,java会在堆上存储对象,所以i1将在堆上...与字符串相同?但是i2呢,考虑到它是一个类字段声明。

public ExampleClass {
   Integer i1=new Integer(1);
   int i2 = 2;
   String str = "abc";
}

5 个答案:

答案 0 :(得分:1)

所有这些都存储在堆中。

正如SO标签所说:

  

堆是为动态分配留出的进程内存。

因此任何变量都将放在堆上。

但是,任何基本类型(intfloat等)都将存储在堆栈中**只有它们在方法内部分配时才会存在。)

查看here了解更多信息。

答案 1 :(得分:0)

非常简洁:Stack: [i1-addr, 2, str-addr] Heap : [i1-addr : 1, str-addr : 'a','b','c']。对于堆,我使用符号[addres: value]。当然,堆分开的值堆也包含一些对象信息(例如,链接到.class对象)。

答案 2 :(得分:0)

在您拥有new ExampleClass()之类的代码之前,没有任何事情发生。一旦这样做,就会在堆上分配一个新对象。其中包括对i1i2str的引用。我猜测,因为你不在方法中,i2将在幕后自动转换为等同于Integer i2 = new Integer(0)。所有这三个引用都将指向也在堆上分配的对象。请注意,字符串是不可变的,因此如果已经String的值为"abc",则引用可能指向该值。

答案 3 :(得分:0)

public ExampleClass {
   Integer i1=new Integer(1); //heap
   int i2 = 2; //heap
   String str = "abc"; //permGen
}

在堆栈存储本地实例/原语仅可用于一个线程,堆是共享位置(可用于任意数量的线程), permGen是用于存储实习字符串和加载类的java内存的另一部分。

答案 4 :(得分:0)

所有初始值都在构造函数中设置。在构造函数中,引用放在堆栈上,然后放在堆上的字段中。一旦构造函数返回,对对象本身的引用仍然在堆栈上,但所有字段都只在堆上。