栈,堆,方法区的关系
简单JVM内存模型图在JVM中的栈,堆,方法区的数据交互在JVM中的栈,堆,方法区的内存交互
简单JVM内存模型图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190608222806158.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JJYWNrTWFtYmE=,size_16,color_FFFFFF,t_70)
堆区:存放的是使用new关键字创建的类或者数组的(含成员变量); 栈区:存放的是局部变量(注:形参也是局部变量的一种)和对象的声明引用; 方法区(常量池):存放的是字符串常量,其他基本数据类型的常量,方法区包含所有的class,方法区中包含的都是在程序中永远的唯一的元素。 静态域:静态变量。
在JVM中的栈,堆,方法区的数据交互
代码举例:
//运行时, jvm 把MainTest 的信息都放入方法区
public class MainTest {
//main方法本身放入方法区
public static void main(String[] args) {
Student student1= new Student("学生1");
student1.printName();
}
}
public class Student{
private String name;
//new Student() 实例后,引用放入栈, 对象放入堆
public Student(String name){
this.name = name;
}
//printName方法本身放入 方法区
public void printName(){
System.out.println(name);
}
}
用图说明上述程序执行jvm中数据状态
在JVM中的栈,堆,方法区的内存交互
代码举例:
public class Test {
public static void main(String[] args) {
//创建Car类实例,开始通过JVM向内存加载
Car car1 = new Car(6, "black");
car1.show();
Car car2 = new Car(9, "write");
car2.show();
}
}
class Car{
private int num;//成员变量(堆)
private String color;//成员变量(堆)
public Car() {
}
//形参m,n为局部变量(栈)
public Car(int m, String n) {
this.num = m;
this.color = n;
}
//方法名show放到方法区
public void show(){
System.out.println("car:num-"+num+"color-"+color);
}
}
用图说明上述程序执行jvm中数据状态 当执行代码: Car car1 = new Car(6, “black”); 时,JVM的内存模型发生的变化是 构造函数执行完后: 总结:在堆中创建对象,对象的属性 color 和 num 赋值为默认值,而对象的引用地址0x8888存放在栈中,当调用构造函数的时候,形参m和n放到栈中,并且给对象的属性复制。执行完构造函数时,形参m和n的生命周期结束,m和n出栈。
|