目录

1.栈、堆、方法区执行时的内部执行过程

2.虚拟机栈的特点

3.堆的特点

4.方法区的特点


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.方法区中存放的都是在整个程序中永远唯一的元素。这也是方法区被所有的线程共享的原因。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐