一.类的加载
1.加载:
通过IO流将class文件加载到内存区域
①读取字节流
②将字节流转化成方法区的运行结构
③将类的对象加载到堆区
2.验证:保证每个类都是可以被引用的
①校验文件格式 .class
②校验是否符合Java语言规范
③校验字节码是否合法
④校验符号引用
JVM参数:
-Xverifynone #关闭类验证
3.准备
①将静态变量分配内存
②给这些变量赋 默认值
int =0,boolen =false ,引用类型=null
4.解析(静态链接)
将符号引用改为直接引用:
将 静态方法 替换为所存内存的指针
可以使用以下命令查看
javap -v xxx.class >xxx.txt
5.初始化
将 静态变量 赋值
二.类加载器
1.启动类加载器
/jre/lib
2.扩展类加载器
/jre/lib/ext
3.应用程序类加载器
classpath 路径
4.自定义加载器
自己指定路径
loadClass() #实现了双亲委派机制
三.双亲委派机制
类的加载器,是有父子关系,但不是继承
loadClass() #实现了双亲委派机制,没有重写,最后都是执行的父类ClassLoader中的该方法
每次加载都会向父类中进行加载,如果没有父类了,就执行
findBootstrapClass()
将类加载到磁盘中
defindClass()
优点:
1.沙箱安全,防止类被篡改
2.保证类的唯一性,避免重复加载