用代码来了解jvm中内存的执行情况

前提: 区分成员变量和局部变量

建议先看一下这篇博客: java中的基本数据类型和引用数据类型内存中的位置_向上的"狼"的博客-CSDN博客

成员变量: 在类中直接定义的变量

局部变量在方法体内定义的变量

举例说明类实例化中内存的变化

学生类

class Student{
    private Integer idCard;
    private String  name;

    public Student(){}

    public Student(Integer idCard, String name){
        this.idCard = idCard;
        this.name = name;
    }

    //方法show()
    public void show(){
        System.out.println("学号为"+this.idCard+",名字为"+this.name);
        
    }

    public Integer getIdCard() {
        return idCard;
    }

    public void setIdCard(Integer idCard) {
        this.idCard = idCard;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

主函数

class ClassTest {
    public static void main(String[] args) {
        Integer idCard = 1;
        String name = "张三";
        Student student = new Student(1, "张三");
        student.show();
    }
}

图解法展示内存变化

我们知道,java中在类的实例化过程中,内存中会使用这三个区域,栈区,堆区和方法区。

 1: 在程序执行的过程中,首先,类中的成员变量和方法体进入到方法区。

2: 然后main()函数方法体进入栈区,这一过程叫做进栈(压栈)定义了一个用于指向Student类的实例

3: 在堆区内创建一个实例 Student stu = new Student()的实例。然后将成员变量和成员方法放在new实例中,引用变量放在栈中,并且根据地址指向堆中的地址。将成员变量放在new实例中的过程中是取成员方法的地址值。

4: 调用类中的构造器进行赋值操作

5: 然后调用方法体void show(),在调用方法体的过程中,先在栈区找到student,后根据地址值找到new Studnet() 进行方法体调用

6: 在方法体void show()被调用完成后,就会立刻马上从栈内弹出(出站) 

 7: 最后,栈中存放的引用变量, 调用的构造器开始弹栈, 在main()函数完成后,main()函数也会出栈

注: 在执行main方法的时候首先执行的是Integer idCard = 1, String name = "张三"; 首先因为是局部变量, 所以Integer idCard是放到栈中, 然后去常量池中查找为1的值, 找到了就返回引用地址, 没有找到就在字符串常量池中创建一个常量1,String name 也是同样的道理, 这里就不再赘述了.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值