加载流程
类加载.png-
加载:此阶段会在内存中生成一个代表这个类的java.lange.class对象,作为方法去这个类的各种数据的入口
-
验证 : 确保class文件的字节流中包含的信息是否符合当前虚拟机的要求
-
准备 :在方法去中分配变量所使用的的内存空间
-
解析 : 虚拟机将常量池中的符号引用替换为直接引用的过程。直接引用可以使指向目标的指针相对偏移量或是一个能间接定位到目标的句柄。如果有直接引用,那引用的目标必定在内存中存在。
-
初始化: 除了加载阶段可以自定义加载器外其他操作有jvm主导,初始化阶段才开始真正执行类中的java程序代码。初始化阶段是执行类构造器<client>方法的过程。如果一个类中没有对静态变量赋值也没有静态语句块,那么编译器不为改类生成<client>方法
java中的类加载器
-
启动类加载器(BootStrap classLoader):
负责加载JAVA_HOME\lib目录中或通过 -xbootclasspath指定路径中且被虚拟机认可的类 -
扩展类加载器(Extension ClassLoader):
负责加载 JAVA_HOME\lib\ext目录中或通过 java.ext.dirs系统变量指定路径中的库 -
应用程序类加载器(Application ClassLoader) :
jvm通过双亲委派模型进行类的加载
双亲委托机制
当一个类收到了类加载请求,自己不会尝试去加载这个类而是把这个请求委派给父类去完成,只有在父类加载器中无法完成这个请求的时候,子类加载器才会尝试去加载。
双亲委派保证了使用不同的类加载器最终得到的都是同样一个Object对象。
网友评论