JAVA 中的堆、栈以及方法区进行相应阐述
以下面代码为例:
package Housework.Dome;
public class home_first {
public static void main(String[] args) {
Rng person = new Rng();
Rng person2 = new Rng();
person.setName("老王");
person.setAge(25);
//String somebody = person.getName();
//int sometime = person.getAge();
Rng person3 = person;
person3.setName("老张");
//System.out.println(somebody+sometime);
System.out.println(person3.getName()+"=="+person3.getAge());
//person.show();
}
}
class Rng{
String name;
int age;
public void setName(String newName) {
name = newName;
}
public String getName() {
return name;
}
public void setAge(int newAge) {
age = newAge;
}
public int getAge() {
return age;
}
public void show() {
System.out.println(name+"--=="+age);
}
}
1.首先先对栈进行描述:栈即程序运行的区域,效率最高,方法的调用执行,基本数据类型定义(局部变量);
2.堆:用于存储和引用数据类型的区域;
3.方法区:所有类的方法都在方法区;
上图便是 栈、堆、方法区 三者之间的关系
对栈了解的小白都知道栈的结构先进后出,却不能做出对栈准确具体的理解;栈的进、出站又称为压、弹栈;正如上图中方法区中的main与其他方法两个块一样先后进入栈然后以先入后出的形式依次完成函数(方法)的调用,这就是我们常称的清理内存。
下面以上图为例描述堆‘栈以及方法区三者之间的关系(虚拟关系 脑补):’
上图分为三个部分;左边为栈区,右上为堆,右下为方法区;在Rng person = new Rng();程序写出的瞬间 计算机会相应给new Rng()在堆中分配一个区域,为简单理解,以Rng person = new Rng();为例,即堆中的黑色方块区即为new Rng()在堆中的分配空间,用于存储和引用数据类型,空间大小计算机会根据new Rng()在堆中的占比进行分配,然后new Rng()会通过从方法区得到的地址(String somebody = person.getName();)转交给栈中等待的Rng person(即Rng person = new Rng();)进行执行,完成所有模块进栈执行程序和出栈释放内存。(以上图为例:假如setName的地址是0x112,通过堆中黑色模块的调用,0x112便成为黑色模块的地址,最后再由黑色模块将地址传达给栈中等待的person,即person的地址也变成了0x112,以一个三角形的两边传递完成程序的调用执行。)