您的位置:首页 > 编程语言 > Java开发

java类加载过程

2019-08-17 07:17 1056 查看

java类加载过程:
    在我们代码中,一般就一个new的方法,就能够创建一个java的对象类,但在java虚拟机中
    1:首先,我们需要判断该类是否已经在方法区中的常量池中有一个类的符号的引用存在,如果该类的符号的引用不存在,在调用classLoader方法进行类加载
    2:类加载的顺序中,只进行一次静态代码块的实现。
    3:调用classLoader的过程为,先在堆中划分出一片内存,存储类的对象(大小在类加载后,根据其内部的变量类型与引用等)能够知道其内存大小,分配方式根据GC的机制有两种
        A:空闲列表法: 如果GC为标记清楚法,那么虚拟机需要维护一个列表,记录内存中的使用情况,然后再分配类
        B:指针碰撞法:直接找一个空闲区域,然后指针移动类大小的内存。
    4:内存分配完成后,虚拟机将分配到的内存空间都初始化为零,这一步操作保证了对象中成员对象的初始化,同时保证了对象如果不赋初值也能够new出来。
    5:设置对象头(对象头中存储了两部分信息,一部分存储对象自身运行时数据,如HashCode,GC分代年龄,锁状态标志等。对象头的另外一部分存储着类型指针,指向对象类元数据,虚拟机通过这部分信息确定对象是哪一个类的实例。)如果对象为数组,对象头中还应该记录数组的长度。因为不同对象可以通过类的元数据确定对象的大小,但是通过数组的元数据无法得知数组的长度。

对象在内存中的存储:
    对象在内存中存储的布局可分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(padding)。
    对象头
        第二部分:类型指针,即对象指向它的类元数据的指针。 
        虚拟机通过这个指针确认属于哪个类的实例,然而并不是所有的虚拟机都保存类型指针。
        如果对象为Java数组,还需要记录数组长度。因为普通对象可以从元数据信息确定对象大小。
    实例数据 
        对象真正存储的数据,包括父类继承的数据和子类中自定义的数据。 
        HotSpot虚拟机分配策略:相同宽度的字段总被分配到一起。
    对齐填充 
        对齐填充并不是必须,仅仅是占位符的作用。 
        HotSpot自动内存管理要求对象的起始地址必须是8字节的整数倍,而对象头都正好是一倍或两倍,因此,当实例数据部分没有对齐时,需要对齐填充来补全。


    6:进行init方法。

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java