[英]Java (Stack&Heap) - what happens memory wise in this simple example
任何人都可以解释在此示例中明智的内存(堆栈和堆)发生了什么? 如果我正确理解,java将对象存储在堆上,因此i1将在堆上...与字符串相同吗? 但是关于i2呢,考虑到它是一个类字段声明。
public ExampleClass {
Integer i1=new Integer(1);
int i2 = 2;
String str = "abc";
}
所有这些都存储在堆中。
正如SO标签所言:
堆是为动态分配预留的进程内存。
因此,任何变量都将放置在堆上。
但是,任何原始类型( int
, float
等)都将存储在堆栈上**仅当它们在方法内部本地分配时才可以。
在这里查看更多信息。
非常简洁: Stack: [i1-addr, 2, str-addr]
Heap : [i1-addr : 1, str-addr : 'a','b','c']
。 对于堆,我使用符号[addres: value]
。 当然,除值堆之外的堆还包含一些对象信息(例如,指向.class对象的链接)。
在您拥有诸如new ExampleClass()
类的代码之前,什么都不会发生。 完成此操作后,将在堆上分配一个新对象。 其中包括对i1
, i2
和str
引用。 我猜想因为您不在使用方法中,所以i2
将在幕后自动转换为Integer i2 = new Integer(0)
的等效项。 这些引用中的所有3个都将指向也在堆上分配的对象。 请注意,字符串是不可变的,因此,如果已经有一个值为"abc"
的String
,则引用可能指向该String
。
public ExampleClass {
Integer i1=new Integer(1); //heap
int i2 = 2; //heap
String str = "abc"; //permGen
}
在堆栈中仅存储仅对一个线程可用的本地实例/基元,堆是共享的位置(可用于任意数量的线程),permGen是Java内存的另一部分,用于存储内部字符串和已加载的类。
所有初始化值都在构造函数中设置。 在构造函数中时,将引用放在堆栈上,然后将字段放在堆上。 构造函数返回后,对对象本身的引用仍在堆栈上,但是所有字段仅在堆上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.