对象在内存中初始化的过程?

java程序执行过程:

  • Java程序执行时,第一步系统创建虚拟机进程,然后虚拟器用类加载器Class Loader加载java程序类文件到方法区。
  • 类加载完成后,主线程运行static main()时在虚拟机栈中建栈帧,压栈。

    执行到new Object()时,在堆heap里创建对象

 
 

对象头 这个头包括两个部分,第一部分用于存储自身运行时的数据例如GC标志位、哈希码、锁状态等信息。第二部分存放指向方法区类静态数据的指针。

实例变量 存放类的属性数据信息,包括父类的属性信息。如果是数组的实例部分还包括数组的长度。这部分内存按4字节对齐。

填充数据 这是因为虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。HotSpot VM的自动内存管理要求对象起始地址必须是8字节的整数倍。对象头本身是8的倍数,当对象的实例变量数据不是8的倍数,便需要填充数据来保证8字节的对齐。另外,堆上对象内存的分配是并发进行的.

  • 当虚拟机执行到new指令时,它先在常量池中查找“Dog”,看能否定位到Dog类的符号引用;如果能,说明这个类已经被加载到方法区了,则继续执行。如果没有,就让Class Loader先执行类的加载
  • 会根据dog这个变量是实例变量、局部变量或静态变量的不同将引用放在不同的地方:

    如果dog局部变量,dog变量在栈帧的局部变量表,这个对象的引用就放在栈帧。

    如果dog是实例变量,dog变量在堆中,对象的引用就放在堆。

    如果dog是静态变量,dog变量在方法区,对象的引用就放在方法区。


 

 

 

 

 

 

 

 

关于在java中创建对象时内存的分配过程,需要理解下面几点:

  • 局部变量存在栈内存中;
  • new 出来的对象存在也堆内存中(类是对象的模板);
  • 常量存在于方法区中,方法区也在堆内存中;
  • 从main方法开始执行。

下面是执行到每一句代码的时候对应的内存的分配过程

  1. Computer computer = new Computer();

首先在方法区找是否完成对类信息的加载,如果是的话直接用,否的话先由类加载器加载类信息。

局部变量computer放栈中,指向堆中的对象,对象的值为初始值,如下图:

<img src="https://pic4.zhimg.com/50/v2-4fec3384c287dbe8a799a2cbe23dc1c6_hd.jpg" data-caption="" data-size="normal" data-rawwidth="779" data-rawheight="472" class="origin_image zh-lightbox-thumb" width="779" data-original="https://pic4.zhimg.com/v2-4fec3384c287dbe8a799a2cbe23dc1c6_r.jpg">

2、computer.brand = "联想";

computer.cpuSpeed = 100;

赋值如下图(操作对象就是操作对象的地址):

<img src="https://pic3.zhimg.com/50/v2-84909ce5c1e0f6466ee6ada111a0978b_hd.jpg" data-caption="" data-size="normal" data-rawwidth="798" data-rawheight="466" class="origin_image zh-lightbox-thumb" width="798" data-original="https://pic3.zhimg.com/v2-84909ce5c1e0f6466ee6ada111a0978b_r.jpg">

转载于:https://www.cnblogs.com/L-a-u-r-a/p/8645668.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值