这是我参与「第四届青训营 」笔记创作活动的第5天
1.类加载过程图片介绍。
2.类加载的过程
- 加载
主要完成三个事情:
1)通过一个类的全限定名来获取定义此类的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
- 验证
确保Class文件的字节流中包含的信息符合《Java虚拟机的规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。
- 准备
准备阶段是一个为类变量分配内存并初始化零值的一个阶段。
- 解析
将常量池内的符号引用变为直接引用的过程。
符号引用的概念:就是一组符号来描述所引用的目标,符号可以是任何形式的字面量。比如说我们定义的方法名字。
直接引用:可以直接指向目标的指针、相对偏移量获知是一个能间接定位到目标的句柄。
- 初始化
执行类构造器的过程,这时候会把我们在准备阶段的零值赋值成我们程序员想要的值。
3.分配对象内存大小
- java的类在第一次使用的时候,才会进行加载,一个类所分配的对象大小是由继承链决定的。
- 它通过对象的双亲委派机制去确定类对象的大小,其中双亲委派机制是为了保系统内证类的一致性。
4.对象的组成
-
对象头
对象头中包括俩类信息:1.用于存储对象自身的运行时数据。如Hashcode、GC分代年龄,锁状态标志、线程持有的锁。2.类型指针,对象指向它的类型元数据的指针。
-
实例数据
对象真正存储的有效信息,其中也包括从父类继承下来的字段内容。
-
对齐填充:
占位符的作用,其实是为了设计成8字节的倍数,更有利于OS的prebatching。