Java(堆栈和堆)-在这个简单的示例中,内存方面会发生什么

Java(堆栈和堆)-在这个简单的示例中,内存方面会发生什么,java,memory,stack,heap,Java,Memory,Stack,Heap,任何人都可以解释在这个例子中内存方面(堆栈和堆)发生了什么?如果我理解正确,java将对象存储在堆上,因此i1将在堆上。。。字符串也一样吗?但考虑到i2是一个类字段声明,它又如何呢 public ExampleClass { Integer i1=new Integer(1); int i2 = 2; String str = "abc"; } 它们都存储在堆中 正如SO标签所说: 堆是为动态分配而预留的进程内存 因此,任何变量都将放在堆上 但是,任何基元类型(int、flo

任何人都可以解释在这个例子中内存方面(堆栈和堆)发生了什么?如果我理解正确,java将对象存储在堆上,因此i1将在堆上。。。字符串也一样吗?但考虑到i2是一个类字段声明,它又如何呢

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

它们都存储在堆中

正如SO标签所说:

堆是为动态分配而预留的进程内存

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

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


查看更多信息。

非常简洁:
堆栈:[i1 addr,2,str addr]
堆:[i1 addr:1,str addr:'a','b','c']
。对于堆,我使用符号
[addres:value]
。当然,除值堆之外的堆还包含一些对象信息(例如指向.class对象的链接)。

除非您有一些像
newexampleClass()这样的代码,否则不会发生任何事情。完成此操作后,将在堆上分配一个新对象。其中包括对
i1
i2
str
的引用。我猜想,由于您不在方法中,
i2
将在幕后自动转换为等效的
Integer i2=new Integer(0)
。所有这3个引用都将指向同样在堆上分配的对象。请注意,字符串是不可变的,因此如果已经存在一个值为“abc”
字符串
,则引用可能指向该字符串

public ExampleClass {
   Integer i1=new Integer(1); //heap
   int i2 = 2; //heap
   String str = "abc"; //permGen
}
在仅对一个线程可用的堆栈存储中,heap是一个共享位置(对任意数量的线程可用),
permGen是java内存的另一部分,用于存储插入的字符串和加载的类。

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

如果它是
ExampleClass
对象的一部分,那么它将在哪里结束?“i2将在后台自动转换为整数i2=新整数(0)”的等价物-它不会。