*.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()所以执行父类的普通代码块,构造方法
最后执行子类普通代码块、构造方法
最后贴上一张黄老师的图片(哈哈,剽窃下)