zoukankan      html  css  js  c++  java
  • java对象的加载过程

    1检测类是否被加载

    虚拟机遇到对象的创建

    首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过(类的加载过程)

    如果没有,那必须先执行相应的类加载过程。

    2为新生对象分配内存

    通过计算对属性计算在堆中分配空间。空间大小固定且不再更改。

    由对象头,对象数据,补位码(每个对象位数都是8的倍数,不够的需要有补位码补位)三部分组成。

    补充:

    空间规整的情况下,在堆中使用指针碰撞

    空间不规整的情况下,维护空闲列表,记录每一块的大小。使用空闲列表。

    空间是否规整取决于垃圾回收器(GC的回收算法)

    3初始化零值

    将对象中所有非static属性赋予初值。

    避免构造函数没有对所有属性进行赋值。

    4进行必要的设置

    虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头之中。

    5执行init方法

    执行构造函数,对对象属性进行赋值。

    补充:

    方法的调用/调用

    创建一个虚函数表(指针数组)(堆中/还是常量池),其中的指针指向某个类的具体成员函数实现。为每一个类创建一个虚函数表的实例,并在每个对象中保存一个指向虚函数表的指针。

  • 相关阅读:
    对象无法注册到Spring容器中,手动从spring容器中拿到我们需要的对象
    sping,springMVC @Component 注解的对象都是单例模式,变量不能全局
    java读取项目路径下的中文文件乱码问题
    springboot集成mongoDB 异常认证
    观察者模式
    MongoDB学习笔记03
    MongoDB学习笔记02
    ajax参数中出现空格
    web并发模型
    MongoDB shell
  • 原文地址:https://www.cnblogs.com/Gang-Bryant/p/10815164.html
Copyright © 2011-2022 走看看