- Java虚拟机将内存分为两个部分堆(Stack)和栈(Heap);
- 其中栈中一部分空间称为方法区(Method area)。
栈
- 栈描述的是方法执行的内存模型。
- 每调用一个方法,就会在栈空间中,开辟一块空间用于存放方法中的局部变量,存储对象和数组的地址,操作数,方法出口等
堆
方法区(堆的一部分)
- 用于存放程序中永远不变或唯一的内容,类的代码信息,静态变量,常量的信息。
========================================== - 执行一段代码,描述内存的分配情况
package p1;
public class StackHeapTest {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.name = "Handsome";
d1.age = 18;
d1.sex = "Boy";
Dog d2 = new Dog();
d2.name = "Hand";
d2.age = 16;
d2.sex = "Girl";
}
}
class Dog{
String name;
int age;
String sex;
public Dog() {}
public void sleep() {
System.out.println ("sleep");
}
}
- 分析
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210216013402528.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzMzMjI3,size_16,color_FFFFFF,t_70)
- 第一步进行类加载,将StackHeapTest类中的相关信息加载到方法区中,代码,静态变量,静态方法,字符串常量等;
- 运行main函数;
- 创建d1对象,此时在堆中开辟一块空间进行存储d1对象(未赋值),栈中的变量的d1存储的是d1的地址;
- 为name进行赋值,因为name是字符串,所以name对应的存储单元存储的是地址;
- 为age赋值,因为age是int类型,所以age对应的存储单元存储的是18;
- 为sex赋值,因为sex是字符串,所以sex对应的存储单元存储的是地址;