JVM6-类加载

class装载验证流程

加载

取得类的二进制流 ;转为方法区的数据结构;生成Class对象

链接

验证:保证Class流的格式是否正确

文件格式验证:以0xCAFEBABE开头;版本号是否合理;
元数据验证(语法检查):父类检查;继承final类;非抽象类实现所有的抽象方法;
字节码验证(JVM规范检查、非常复杂):运行检查;栈数据类型和操作吗数据参数吻合;跳转指令指定到合理的位置;
符号引用验证:常量池中描述类是否存在;访问的方法或字段是否存在且有足够的权限;

准备

分配内存,并为类设置初始值
非静态属性设置为0、0.0、false
final类型,在准备阶段就会被赋予正确的值

解析符

符号引用替换为直接引用;符号引用:字符串引用对象不一定被加载;直接饮用:指针或者地址编译量引用该对象一定在内存

初始化

执行类构造器clinit :static变量赋值 static语句
子类的调用钱保证父类的clint被调用
clinit是线程安全的

类装载器ClassLoader

ClassLoader读入Java字节码将类装载到JVM中
ClassLoader可以定制,满足不同 的字节码流获取方式
加载阶段

重要方法

loadClass 载入并返回一个Class
defineClass 定义一个类,不公开调用
findClass 回调方法足鼎ClassLoader的推荐做法
findLoadedClass 寻找已加载的类

分类

BootStrap(rt.jar)、Extension(lib/ext/*/jar)、App 、CustomerClassLod er

向上寻找父亲知否加载,父亲加载好返回Class给子类
-Xbootclasspath
让jvm从指定的路径中加载bootclass,用来替换jdk的rt.jar。一般不会用到。

Thread.setContextClassLoader() 上下文加载器

问题:上层ClassLoader无法查看底层ClassLoader中的类
是一个角色,任何一个加载器都可以是这个角色
解决顶层ClassLoader无法访问底层 ClassLoader
顶层classLoader传入底层classLoader
2.5 双亲委派模式的破坏
双亲模式是默认的模式但是不是必须这么做
Tomcat的WebappClassLoder就会先加载自己的Class,找不到再委托parent
OSGi(热加载)的ClassLOder芯层王庄结构,分局需要自由加载Class
class被替换后,系统无需重启,替换的类立即成效