Java---程序执行过程中的内存分析

必须知道

在了解内存的内部运作方式之前,我们必须要知道3个概念;栈、堆、方法区;
官方给出的定义为:
1.栈:存放–局部变量
2.堆:存放–new出来的新对象
3.方法区:存放–类的信息(代码)、static变量、常量池(字符串常量)等;

首先声明一个类(以Student为例)和执行入口

在这里插入图片描述在这里插入图片描述
1.在执行入口中对象实例化:Student s1 = new Student();
实例化,声明一个引用 类型变量s1(除基本数据类型外,Java中其他所有的变量声明皆为引用类型;)
在做这一步操作时,内存中主要做了三个操作;如下图:
在这里插入图片描述这里需要注意的是:在方法区加载Student类信息时会先去方法区中找该类是否已经实例化,如果已经被实例化;则不再加载;
2.这时我们开始为Student类的变量赋值,并调用类中方法,同时声明一个s2进行对比,结果如下图:
在这里插入图片描述首先,我们发现在方法区的常量池里面多出了3个常量,这三个常量的来自于对象实例化后的赋值操作;
常量池具有共享机制,在声明常量时会首先到常量池中遍历是否有相同常量,如果有相同的,则不再声明
同时,将堆中对应对象的属性“name”通过引用地址指向常量池中对应的常量;而像age、id这种基本类型的数据,直接赋值即可;

多类加载内存分析

上图我们是把Student类和执行类放置在一起的(项目中一般会分开);这时我们再添加一个Computer类;如图:
在这里插入图片描述
在Student类中添加Computer属性:
在这里插入图片描述
添加执行类:
在这里插入图片描述
这样,在程序启动时一共会有三个类被加载到方法区中,如下图:
在这里插入图片描述
根据代码显示可知:
c.brand = “联想”
因此在TestComputer类里面的常量池会加载联想这个常量

和图二 一样,声明完成后赋值,加载方法区,new一个新对象,将栈中的变量名称指向堆里面new的对象的地址;
然后我们再看s1指向堆中的对象,其中关联了computer对象(表示某个学生有一台电脑),通过s1.computer.brand,我们将c的地址指向到s1中的computer,这个时候c指向的地址实际上和computer指向的地址一致,因此,当改变c的值(即改变c的指向地址,那么s1.computer的指向地址也一样会被改变)

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值