2020-09-16

*.class 文件  加载入 jvm 虚拟机中需要经过如下几个步骤:


1. 加载class文件到jvm虚拟机中

2.需要通过class文件中的magic (魔术)和 版本号   来判断class文件的合法性

3.准备阶段   ----将静态变量赋值为初值( 最后一张图有详细信息 )final 修饰的变量直接赋值

4.解析阶段 ----- 将class文件中的字符符号 如(String Integer)等 赋值为直接内存地址

5.初始化 ------ 将静态变量赋值,并且执行<clinit> 静态代码块方法

并且这些class中保存的信息全部存入到jvm的方法区内,jvm的架构图如下所示


ThreadLocalSpace是专门为多线程分配对象空间时准备的,避免在堆内分配时进行资源的争抢(耗费时间)


2.当进行Hello hello =   new Hello()时,会经历两个步骤:

1.在线程栈中声明一个变量 

2.在堆内存中开辟相应的空间存储(实例信息、实例方法等)

    2.1   加载实例信息,进入到堆内存中

    2.2   执行对应的构造方法<init> 

其中对象在内存中主要包括如下及部分的信息:

1. 对象头 8个字节大小(偏向锁标志、Hashcode、ThreadId、gc周期)

2. 指向方法区中class信息的指针(指针压缩4个字节,不压缩8个字节)

3. 实例信息

4. 如果是数组的话,还会存在一个数组长度信息

5. 对象对齐填充(满足8的整数倍)

如果 Son类继承Father类 ,当new Son()时


结果为:

先加载父类的类信息---》执行父类静态代码信息;

然后是子类类信息---》执行子类静态代码信息

又由于隐式调用super()所以执行父类的普通代码块,构造方法

最后执行子类普通代码块、构造方法


最后贴上一张黄老师的图片(哈哈,剽窃下)


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。