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

    1检测类是否被加载

    虚拟机遇到对象的创建

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

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

    2为新生对象分配内存

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

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

    补充:

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

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

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

    3初始化零值

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

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

    4进行必要的设置

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

    5执行init方法

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

    补充:

    方法的调用/调用

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

  • 相关阅读:
    rest_framework规范
    跨域问题
    网站部署(二)
    服务器更改密码后,git不能连接问题
    网站部署(一)
    Ajax
    AJAX基本使用
    Java之JNDI详解
    IntelliJ IDEA(2018.3.3) 的介绍、安装、破解、配置与使用
    数据库修改密码风险高,如何保证业务持续,这几种密码双活方案可以参考
  • 原文地址:https://www.cnblogs.com/Gang-Bryant/p/10815164.html
Copyright © 2011-2022 走看看