浅谈java创建对象内存分析

本文探讨了Java中创建对象的内存分配过程,通过示例代码展示了Person类的实例化。详细分析了JVM如何加载类信息,以及堆内存中对象的创建。main方法执行过程中,两次创建Person对象person1和person2,它们拥有独立的内存空间,但共享同一Class模板。内存图清晰地显示了两个对象的内存分布,证明它们是不同的实例。
摘要由CSDN通过智能技术生成

创建对象内存分析

以下是个人见解,有不对的地方希望提出,我会及时修改。

代码

/**
 * 创建对象内存分析
 */
public class Person {
    String name;//名字
    static String country;//城市
    public void work() {
        System.out.println(name);
        System.out.println(country);
    }
}

测试类

/**
 * 创建对象内存分析
 */
public class Test {
    public static void main(String[] args) {

        Person person1 = new Person();
        person1.name = "凌晨";
        Person.country = "洛阳";
        person1.work();

        Person person2 = new Person();
        person2.name = "凌晨三点";
        Person.country = "河南";
        person2.work();
        
        System.out.println(person1.hashCode());
        System.out.println(person2.hashCode());
        System.out.println("-----------------------");
        System.out.println(person1.getClass().hashCode());
        System.out.println(person1.getClass().hashCode());
    }
}

内存创建分析:

  1. JVM去方法区寻找Test类的代码信息,如果有直接调用,没有的话使用类的加载机制把类加载进来。同时把静态变量、静态方法、常量加载进来。
  2. main方法入栈
  3. 碰见Person对象,先分析Person这个类,同样的寻找Person类的代码信息,有就加载,没有的话类加载机制加载进来。同时也加载静态变量、静态方法、常量
  4. Person中分为静态区和非静态区 这时初始化 静态变量country的初值为null
  5. 创建对象(堆区开辟空间)
  6. 把对象地址赋值给person1变量 保存
  7. 通过类名 修改类变量的值
  8. work()方法入栈,打印
  9. 第二次new的时候,已经有Person这个类的模板了,直接加载
  10. 重复5678
  11. work()方法出栈
  12. main()方法出栈

内存图:

image-20220410212925201

运行代码输出:

image-20220410213156185

可以看出

  • person1和person2是不同的对象
    链图片转存中…(img-AAtuI7l8-1651406290926)]

可以看出

  • person1和person2是不同的对象
  • person1和person2是同一个class模板
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨三点不下班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值