类加载器子系统作用
类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。
ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine 决定。
加载的类信息存放于一块称为方法区的内存空间,除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量,和数字常量(这部分常量信息是class文件中常量池部分的内存映射)。
类加载器ClassLoader
class file 存在于本地硬盘上,可以李继伟设计师画在纸上的末班,而最终这个模板在执行的时候是要加载到jvm中,根据这个文件实例化出n个一模一样的实例。
classfile 架子爱到jvm中,被称为DNA元数据模板,放在方法区。
在 .class文件 -> jvm -> 最终成为元数据模板,ClassLoader扮演的就是这样一个搬运角色。
类的加载过程
加载:
1.通过一个累的全限定名获取定义此类的二进制字节流。
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3. 在村中生成一个代表这个类(Class),作为方法区的访问入口
链接:
1.验证:
字节码文件都是特定的开头的 CA FE BA BE ,
主要验证:文件格式验证,元数据验证,字节码验证,符号引用验证
2 准备:
为变量分配内存并且设置该变量的默认初始值,即零值。
这里不包括用final修饰的static,因为final在编译的时候就会分配了,准备阶段会显式初始化。
这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。
3.解析:
将常量池内的符号引用转换为直接引用的过程。
事实上,解析操作往往会随着Jvm在执行完初始化之后在执行。。。
初始化
初始化阶段就是执行类构造方法()的过程。
此方法,会自动收集javac编译器自动收集类变量的赋值动作和静态代码块中的语句合并而来。
构造器方法中的语句会按源文件中出现的顺序执行。
若该类具有父类,jvm会保证父类的会先执行。
虚拟机必须保证一个类的 方法在多线程下被同步加锁。