JVM架构图
image-20200705080911284.png类加载器ClassLoader
- 作用:将class file加载到JVM中,被称为DNA元数据模板,放在方法区。
- 通过DNA元数据模板(Class对象)的getClassLoader()可以获取类加载器,通过getClass()方法可以实例化对象
- 加载过程:加载、链接、初始化
加载过程
- 通过类的全限定名获取类的二进制字节流
读取class文件的方式:
- 磁盘加载
- 网络获取:web applet
- 压缩包读取:jar、war
- 运行时计算生成: 动态代理
- 其他文件生成:jsp
- 将字节流所代表的静态存储结构转化为方法区的运行时数据结构
类完成加载后,二进制字节流就以特定的数据结构存储在方法区中,但存储的数据结构是由虚拟机自己定义的,虚拟机规范并没有指定
- 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
- 既然是对象就应该存放在Java堆中,不过JVM规范并没有给出限制,不同的虚拟机根据自己的需求存放这个对象。
- HotSpot将Class对象存放在方法区。
链接过程
- 验证
- 确保字节流符合jvm要求
- 文件格式验证、元数据验证、字节码验证、符号引用验证
- 准备
- 为类变量分配内存并设置默认初始值,即0
- 不包含用final修饰的static,则为常量, 在编译的时候就会分配了
- 这里不会为实例变量分配内存,因为实例变量会随着具体对象分配到堆中
- 解析
将常量池中的符号引用转换为直接引用的过程
初始化过程
- 执行类构造器方法<clinit>()的过程
- clinit方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来的
- clinit中的指令按照语句在源文件中出现顺序执行
字节码文件组成
- 魔数 :cafe babe
网友评论