对象的内存图
- 一个对象的内存图
- 2个对象的内存图
- 数组的内存图
java是一门面向对象语言,并且java中万物皆对象,可以说对象是java代码的基本单元,所以说对于对象的内存分析显得很重要
一个对象的内存图
在创建对象时会执行以下操作:
其中的类的加载是在创建对象之前会判断该类是否加载,如果已经被加载,将不会被加载,类只会被加载一次
具体步骤参考
以上代码的内存图:
对以上内存图的说明
1.对执行流程的分析:
我们的测试类StudentTest由我们的JVM自动加载,StudentTest类的字节码文件(里面细致包含main方法)将会被加载到方法区,然后由我们的JVM调用main方法,我们的程序由此开始
首先我们的main方法进行栈中,然后在创建对象时,Student s 局部变量会进入栈中,执行右边创建对象时,会先进行类的加载检查如果该类没有被加载,才会把它的字节码文件(细致包含String name,int age 变量和study方法)加载到方法区中,然后new关键字会开辟堆内存空间
在开辟空间时,会将方法区中的成员变量复制一份到堆空间中,并将成员方法的地址值拷贝一份到堆空间(为了我们以后调用方法时能找到方法)之后会执行java的默认初始化和显示初始化,然后再执行构造方法的初始化。最后将堆内存中的地址返回给在栈中的局部变量
在栈中会临时储存要调用的方法和局部变量,当该方法被调用完将会出栈,方法中的局部变量也会随之消失
2个对象的内存图
注意:2个对象的类的字节码文件只会被加载一次,在方法区中只有1个该类的字节码文件
2个引用指向同一个对象的情况
- 有这样一段代码
内存图如下
数组的内存图
数组也是一种引用数据类型,我们可以仿照分析对象的内存图的形式来分析它
对象是通过对象去获取值,而数组是根据索引去获取值