Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 327|回复: 0

[默认分类] 对象在内存中初始化的过程?

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-3-26 09:41:55 | 显示全部楼层 |阅读模式
    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方法开始执行。
      
    下面是执行到每一句代码的时候对应的内存的分配过程
      
      Computer computer = new Computer();
      
    首先在方法区找是否完成对类信息的加载,如果是的话直接用,否的话先由类加载器加载类信息。
    局部变量computer放栈中,指向堆中的对象,对象的值为初始值,如下图:

    2、computer.brand = "联想";
    computer.cpuSpeed = 100;
    赋值如下图(操作对象就是操作对象的地址):

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-21 17:09 , Processed in 0.377849 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表