zoukankan      html  css  js  c++  java
  • 对象在内存中初始化的过程?

    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放栈中,指向堆中的对象,对象的值为初始值,如下图:

    2、computer.brand = "联想";

    computer.cpuSpeed = 100;

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

  • 相关阅读:
    创建Variant数组
    ASP与存储过程(Stored Procedures)
    FileSystemObject对象成员概要
    Kotlin 朱涛9 委托 代理 懒加载 Delegate
    Kotlin 朱涛 思维4 空安全思维 平台类型 非空断言
    Kotlin 朱涛7 高阶函数 函数类型 Lambda SAM
    Kotlin 朱涛16 协程 生命周期 Job 结构化并发
    Proxy 代理模式 动态代理 cglib MD
    RxJava 设计理念 观察者模式 Observable lambdas MD
    动态图片 Movie androidgifdrawable GifView
  • 原文地址:https://www.cnblogs.com/L-a-u-r-a/p/8645668.html
Copyright © 2011-2022 走看看