栈、堆、方法区执行时的内部执行过程及虚拟机栈、堆、方法区的特点
目录1.栈、堆、方法区执行时的内部执行过程2.虚拟机栈的特点3.堆的特点4.方法区的特点1.栈、堆、方法区执行时的内部执行过程要了解栈、堆、方法区执行时的内部执行过程,首先我们先编写一个Person类从而具体地讲解class Person {String name;String sex;int age;public void show() {System.out.println("姓名" + na
目录
1.栈、堆、方法区执行时的内部执行过程
要了解栈、堆、方法区执行时的内部执行过程,首先我们先编写一个Person类从而具体地讲解
class Person {
String name;
String sex;
int age;
public void show() {
System.out.println("姓名" + name + "性别" + sex + "年龄" + age);
}
}
这里我们定义了一个Person类,现在我们创建一个Person类并且使用
public class TestDemo {
public static void main(String[] args) {
Person person1 = new Person(); /创建一个person1的对象
person1.name = "张三";
person1.age = 18;
person1.sex = "男";
person1.show();
}
}
这里我们先从main方法开始执行 ,首先我们先在栈中生成一个main方法的栈帧(栈描述的时方法执行的内存模型。每个方法被调用都会创建一个栈帧用来存储局部变量、操作数、方法出口等)然后存放args这个局部变量,因为为初始化则为null,然后创建为person1的一个4个字节的引用类型的变量,然后new一个名为person1的Person对象,要创建对象则要通过执行构造方法来创建,执行一个构造方法则要在栈中开启一个栈帧,在执行完构造方法之后,则在堆中生成一个对象,但是我们如何才能知道Person类中有哪些属性呢?是通过在方法区中加载一个Person类的信息。同时方法没有必要每个对象都重复一遍,他会在方法去中的Person类中加载,当一个对象要调用show方法时直接在方法区中的Person类中拿就行了。回归正题,在我们在堆生成一个person1的对象时,同时会给对象生成一个十六进制的地址信息,假如地址为0x11,由代码可知new了一个对象,将对象的值赋值给了person1,而person1也就接收了对象的地址0x11存放在栈的栈帧中,
当执行完Person person1 = new Person(); 语句之后,由构造方法生成的栈帧就会被回收删除,
然后执行后面的语句,通过对象来修改相应的name、age的值,这里要注意name的值不是把字符串直接放到那儿,是在编码的时候会把"张三""男"这个字符串存放在方法区中的Person类中的运行时常量池中,当要用的时候会直接在运行时常量池中获取,因为String不属于8种基本数据类型,他是一个类,同时也是一个对象,对象来操作的时候都是通过引用地址的方式,而在运行时常量池中的"男""张三"这两个字符串都有相应的地址,在调用的时候直接通过地址来访问
当调用person1.show方法时会在栈中生成一个栈帧,这个show()方法虽然没有参数,但是实际上他有,在调用时他会默认传一个参数叫this,当执行完所有代码的时候,在栈、堆、方法区中的所有内容都将会被回收删除。
2.虚拟机栈的特点
虚拟机栈的特点:
1.栈描述的是方法执行的内存模型。. 每个方法被调用时都会在栈内创建一个栈帧(用来存储局部变量,操作数,方法出口等). 3.栈属于线程私有,不能实现线程间的共享!. 5.栈是由系统自动分配,速度快!
3.堆的特点
堆的特点:
1、堆中存放的都是实体或者是成员变量;
2、存放的实体都是有首地址值的;
3、实体中的数据都是有初始值的;
4、当堆中的实体没有被栈中的引用数据类型所指向时,那么该实体就变成了垃圾,会等待JVM的垃圾自动回收机制将其清理。
4.方法区的特点
方法栈的特点:
1.又叫静态区,跟堆一样,被所有的线程共享。
2.方法区中存放的都是在整个程序中永远唯一的元素。这也是方法区被所有的线程共享的原因。
更多推荐
所有评论(0)