**JVM类加载分为5个过程:加载,验证,准备,解析,初始化,使用,卸载,如何是要分三步的话为,
加载-链接-初始化
1.加载,jvm 将从不同的地方把字节码文件加载到内存中,比如.class jar包里面的,还可以从网络上加载进来,并转化成jvm 认可的数据结构,在这个阶段我们也可以实现自己的类加载器,实现特定的功能
2.链接 ,链接就是将jvm 类型的原始定义成功的转入到jvm 的执行过程中,包括,验证,准备,解析,验证表示jvm 加载进来的字节码是否符合java规范,这一步方式恶意代码被加载进来,包含jvm虚拟机。验证阶段会根据类的的依赖关系加载更多的类,准备,准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配,这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在堆中。其次,这里所说的初始值“通常情况”下是数据类型的零值,假设一个类变量的定义为:
public static int value=123;
那变量value在准备阶段过后的初始值为0而不是123.因为这时候尚未开始执行任何java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器()方法之中,所以把value赋值为123的动作将在初始化阶段才会行。至于“特殊情况”是指:public static final int value=123,即当类字段的字段属性是ConstantValue时,会在准备阶段初始化为指定的值,所以标注为final之后,value的值在准备阶段初始化为123而非0.
解析,解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。
3.初始化 可以理解为各种赋值和初始化动作,静态变量,静态代码块。
jvm 加载类的方式使用的是双亲委派模型
就是jvm 在加载java类的时候,先给父类加载器过目一下,如果父类说加载不了,就由下面的类一级一级的过目,直到可以加载为止,这样做的目的是为了防止,一个类被重复加载,jre 中内置了三种类加载器,满足了大部分的业务需求,位于最顶层的是启动类加载器,扩展类加载器,应用类加载器。
启动类加载器主要加载,jre/lib 下面的jar包,
扩展类加载器主要加载,jre/lib/ext 下面的jar包
应用类加载器主要加载,classpath 下的类文件。
如下图所示:**