JVM的类加载
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
什么是类加载
java程序运行前要经过编译即.java=>.class文件。运行的时候java进程(JVM)就会读取对应的.class文件并解析内容在内存中构造出类对象并进行初始化类对象就是描述这个类有哪些属性哪些方法继承哪些类实现哪些接口
类加载的过程
- 加载
这里的加载(loading)和类加载(class loading)不同加载是类加载的一个阶段。主要任务是找到.class文件读取文件内容并且按照.class规范格式来解析
- 连接
- 验证
检查当前.class文件中的内容格式是否符合规范要求。
- 准备
给类里的静态变量分配内存空间并设置类变量初始值。
- 解析
将常量池内的符号引用占位符替换成直接引用内存地址也就是初始化常量的过程。
比如String s = "hello";在类加载之前"hello"这个字符串常量没有分配内存空间类加载完成后才有内存空间无法保存字符串常量的真实地址只能先使用占位符标记一下等真正给"hello"分配过内存后再用真正的地址替代之前的占位符。
- 初始化
针对类进行初始化初始化静态成员执行静态代码块并且加载父类。
何时触发类加载
使用到一个类的时候就会触发类加载并不一定程序一启动就加载第一次使用到这个类才会加载。
1.创建这个类的实例 2. 使用这个类的静态属性/静态方法 3.使用这个类的子类
双亲委派模型
按照什么样的规则在目录中查找.class文件
在了解这个模型之前要先了解3个类加载器
Bootstrap ClassLoader负责加载标准库中的类
Extension ClassLoader负责加载JVM扩展的库的类
Application ClassLoader负责加载自己项目中自定义类
这三个类加载器相互配合的工作流程
上述三个类存在父子关系
进行类加载的时候如Java.lang.Thread是从Application ClassLoader开始
某个类加载器开始加载的时候不会立即扫描自己负责的路径而是先把任务交给父亲来处理
如果到了Bootstrap ClassLoader已经是最上层了只能自己加载
如果父亲没找到这个类就交给儿子继续加载
如果一直找到最下面Application ClassLoader也没找到就会抛出ClassNotFund异常
双亲委任模型的好处
如果程序员的自定义类的全限定名和标准库的类冲突了如自定义类也叫做java.lang.Thread,会一直向上传递到Bootstrap ClassLoader可以保证可以加载到标准库的类防止代码加载出错