在这个例子中,任何人都可以解释记忆明智的事情(Stack& Heap)吗?如果我理解正确,java会在堆上存储对象,所以i1将在堆上...与字符串相同?但是i2呢,考虑到它是一个类字段声明。
public ExampleClass {
Integer i1=new Integer(1);
int i2 = 2;
String str = "abc";
}
答案 0 :(得分:1)
所有这些都存储在堆中。
正如SO标签所说:
堆是为动态分配留出的进程内存。
因此任何变量都将放在堆上。
但是,任何基本类型(int
,float
等)都将存储在堆栈中**只有它们在方法内部分配时才会存在。)
查看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()
之类的代码之前,没有任何事情发生。一旦这样做,就会在堆上分配一个新对象。其中包括对i1
,i2
和str
的引用。我猜测,因为你不在方法中,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)
所有初始值都在构造函数中设置。在构造函数中,引用放在堆栈上,然后放在堆上的字段中。一旦构造函数返回,对对象本身的引用仍然在堆栈上,但所有字段都只在堆上。