栈,堆,方法区的关系(自己理解)

您所在的位置:网站首页 堆和栈的共同点 栈,堆,方法区的关系(自己理解)

栈,堆,方法区的关系(自己理解)

2023-08-12 10:46| 来源: 网络整理| 查看: 265

栈,堆,方法区的关系 简单JVM内存模型图在JVM中的栈,堆,方法区的数据交互在JVM中的栈,堆,方法区的内存交互

简单JVM内存模型图

在这里插入图片描述

堆区:存放的是使用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出栈。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3