堆、栈、方法区之间的关系
1.栈(Stack)、堆(Heap)、方法区简介
- 栈:每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象,是对象在堆区的地址),对象都存放在堆区中 。程序的运算也在栈中进行。
- 堆:一个可动态申请的内存空间,通常用于保存new 构造出来的对象。
- 方法区:在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)。
创建一个宠物Pets类
public class Pets {
//属性
private String name;
private String gender;
private int age;
//全属性构造器
public Pets(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
//介绍:
public void intro() {
System.out.println("我的宠物名叫"+name);
System.out.println("性别是"+gender);
System.out.println("今年"+age+"岁了");
}
//叫声
public void yell(String yelling) {
System.out.println("它的叫声是"+yelling);
}
//摇尾巴
public void shaking() {
System.out.println("它在摇尾巴。");
}
}
使用Pets类
public class Demo {
public static void main(String[] args) {
// 创建新对象,并初始化属性
String newName = "大黄";
String newGender = "公狗";
int newAge = 3;
Pets dog = new Pets(newName,newGender,newAge);
// 调用方法
dog.intro();
dog.yell("汪汪汪");
dog.shaking();
}
}
根据上面的代码进行堆、栈、方法区的区别说明
- Java 程序运行时可简要将内存划分成三种:
- 一种是栈内存,一种是堆内存,一种是方法区。
- 函数运行时,先从main函数进入程序,从上往下运行,获取基本类型的变量,存于栈中。
- 创建一个新对象,在堆中存放新建的对象,并初始化对象属性,并将对象的地址放在栈中,以便于对应查找对象的数据。
- 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
- 当方法被使用时从方法区进入栈中进行运算的过程被称为进栈或压栈,将方法的运行结果存到相应位置后,此方法作用结束,从栈中被释放的过程被称为出栈或弹栈。