1.加载主类
启动main函数时,通过类加载器将主类到jvm。
类加载的主要过程:
加载:通过IO从文件系统中将二进制字节码文件读取到内存中,使用到类时才会加载,例如new对象,调用对象的main方法等,在加载阶段会生成一个java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
验证:校验字节码文件的正确性
准备:给类的静态变量分配内存,设置默认值
解析:将符号引用替换为直接引用,该阶段会把静态方法等符号引用替换为数据所存的内存的地址或句柄(直接引用),这就是静态链接(类加载期间完成),动态链接是在运行过程中将符号引用替换为直接引用。
初始化:为静态变量设置指定的值,执行静态代码块。
类被加载到方法区主要包含运行时常量池,类型信息,属性信息,方法信息,类加载器的引用,对应class的引用等。
2.双亲委派机制
类加载器主要有以下几种类型:
引导类加载器:负责加载jre lib目录下的核心类库
扩展类加载器:负责加载jre lib/ext扩展目录下的类库
应用类加载器:负责加载classpath下的类和jar包
自定义类加载器:负责加载用户自定义目录下的类包
类加载器初始化过程:
创建加载器启动器示例sun.misc.Launcher,创建该实例使用了单例模式,确保了一个jvm中只有一个该实例,在该示例内部创建了扩展类加载器和应用类加载器。JVM默认使用getClassLoader()返回的类加载器来加载我们的应用程序(应用类加载器)。
双亲委派机制:
类加载器加载类的过程中,会先委托自己的父亲类加载器去加载,如果父加载器加载路径下未加载到该类,再从当前加载器加载路径下加载。
为什么要设计双亲委派机制:
沙箱安全机制,避免类的重复加载。
全盘负责委托机制:
当前类所依赖的类在没有显示声明用其它类加载器加载的情况下都有交给当前类加载的同一个类加载器去加载。