java 中的内存分为四个部分:
stack(栈):存放基本类型的数据和对象的引用,即存放局部变量。
Note:
如果存放的是基本类型数据(非静态变量),则直接将变量名和值存入stack中。
如果存放的是引用类型,则将变量名存入栈,然后指向它new出的对象(存放在堆中)。
heap(堆)存放 new 出来的东西。
data segment(数据区):分为静态区和常量区(常量池)
静态区(static segment):
存放在对象中用 static 定义的静态成员(即静态变量,如果该静态变量是基本类型变量,则将变量名和值都存入静态区中,如果是引用类型则指向 new 出来的对象。
常量池(constant pool):
存放在编译期被确定,并被保存在已编译的 .class 文件中的一些数据。如代码中基本类型和引用类型(String、Class、数组、Integer等包装类)的常量值(final)。此外,这里还存放一些以文本形式出现的符号引用(如:字段的名称和描述符、方法的名称和描述符、类和接口的全限定名)。
code segment(代码区):存放代码。
【图示】
1:注意比较静态变量和非静态变量的变量名、变量值所存储位置的区别:
2:对于值相同的 String 常量,在 constant pool 中只会创建一个。
对于 String s3 = new String("s3");
创建了两个 String 对象,一个是在编译期间通过""双引号创建的,另一个是在运行期间 new 出来的。
3:
时间: 2024-10-13 00:15:25