JVM类加载机制分为五个部分 加载,验证,准备,解析,初始化。
加载
这个阶段,在内存中会生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口。可由jar,war包,动态代理,甚至是jsp文件生成。
验证
这个阶段是为了确保Class文件的字节流中包含的信息是否符合虚拟机的要求,且其中的内容不会危害虚拟机安全。
准备
这个阶段在方法区中分配类变量所使用的内存空间。但注意,如果类变量定义为:
public static int i = 100;
这种情况,在准备阶段,i的值被赋予的是0而不是100,执行赋予100这个行为发生在程序被编译后。而如果类变量定义如下:
public static final int i = 100;
因为存在final关键词,在准备阶段,i就会被赋值为100。
解析
这个阶段,虚拟机会将常量池中的符号引用替换成直接引用。
初始化
在初始阶段,开始真正执行类中定义的Java程序代码。
类构造器<client>
初始化阶段是执行类构造器<client>方法的过程。虚拟机会保证子<client>方法执行之前,父类的<client>方法已经执行完毕。如果一个类种没有对静态变量赋值也没有静态语句块,那么可以不生成<client>方法。
双亲委派
- 当一个类收到了类加载请求,他首先不会自己尝试去加载这个类,而是把这个请求委派给父类去完成
- 只有当父类加载器反馈自己无法完成这个请求时,子类加载器才会自己去加载。
- 采用双亲委派的好处是,假如多个加载器都加载同一个类,最终都会委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同一个object对象。