您的位置:首页 > 其它

JVM学习笔记5—类加载器(classloader)

2016-02-24 00:15 246 查看

class装载验证流程

1 加载

· 取得类的二进制流,转为方法区数据结构,在堆中生成相应的java.lang.Class对象

2 链接

(1)验证(文件格式验证,元数据验证,字节码验证,符号引用验证)

保证Claas流的格式是正确的,防止被恶意替换

(2)准备

分配内存,并为类设置初始值(在方法区中)
注意 public static int a=1,在准备阶段,v=0,而不是1

(3)解析

符号引用替换为直接引用,因为在编译时java类并不知道引用类的实际地址,只能通过符号引用来代替,而在类装载的过程时,此时可以通过JVM知道所引用的类
的实际内存地址,转化为了直接地址引用,例如 cn.edu.ustc.car类引用了cn.edu.ustc.tools这个类,在car这个类编译的时候,其并不知道tools类的实际内存
地址,只能用符号引用表示,而在car类装载的时候,可以通过JVM得tools类的实际内存地址,此时转化为直接地址引用

3 初始化

执行类构造器<.clinit> 准备过程中的注意 那块a此时被初试化为1,clinit是线程安全的,在调用子类clinit之前必须保证父类的clinit已经被调用了

classloader的定义

classloader是一个抽象类
classloader的实例将读入java字节码,并将类装载到JVM中
classloader是可以直接定义的
classloader辅助类加载过程中的加载阶段

classloader默认设计模式(父委托机制)

classloader的架构



共分为四层从上往下是: 根加载器--->拓展加载器---->系统加载器----->自定义加载器
所谓的父委托机制就是,一个类优先由上层加载器进行加载。
例如有一个类 people需要加载,JVM首先会看根加载器能不能加载,不能的话再看拓展加载器能不能加载,再不能的话,在看系统加载器能不能加载,再不能的话就看用户自定义的加载器能不能加载,一旦上层的加载器能加载,就不判断下层的加载器能不能加载了,这就是所谓的父委托机制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: