JVM加载方式与双亲委托机制详解

众所周知 Jvm虚拟机会把我们写的.java代码转化为.class代码 在需要使用的时候虚拟机直接加载.class文件。说白了就是java代码是给我们看的  class代码是个虚拟机看的 把class文件加载到虚拟机中 就是类加载 

类加载分为三个阶段 分别为 加载 链接初始化 。链接中又有校验、准备、解析

加载为jvm读取该类的全限定类名 转化为二进制字节流 并储存到内存区的方法区里。

校验为对代码进行验证是否符合规范。

准备为对方法内被static关键字修饰的变量(如 static int x=5)进行初始化 并且赋值为0 (注意 是赋值为0 重新赋值为5为类加载第三个阶段初始化做的事情),如果是boolean初始化为false  但是不包括被final修饰的常量;

解析为将类中的符号引用转化为直接引用。顺便说下符号引用和直接引用吧。符号引用就是一个字符串 比如你调用run()这个方法 方法名run就是符号引用 而这个方法的地址值比如是12345 这个12345就是直接引用  说白了符号引用是给我们程序员看的 直接引用是给计算机看的 

初始化就是最后一步  对static修饰的变量进行初始化  并赋予其真正的值  如果发现该类有超类 那么就先初始化其超类

Java有四个类加载器由上而下分别是启动类加载器BootstrapClassLoader、扩展类加载器ExtensionsClassLoader 、系统类加载器SystemclassClassLoader以及用户自定义类加载器。

双亲委托机制为如果有一个类收到类加载的请求 那么其自身不会执行 而是抛向父类 如果父类还有父类 就继续抛向父类 直到抛到启动类加载器,如果父类可以加载 那么就由父类加载 如果没有 那么就由继续返回给子类让子类加载 说白了就是每个儿子都很懒 有活就给父亲干 直到父亲说这事我干不了 儿子才自己做 

那么问题来了 这么做的好处有哪些呢 其实这主要有两点 一个是避免类重复加载 比如父类加载了一个类 如果没有双亲委托机制的话子类也遇到相同的类也会再次加载一次 那么内存中就有两个一样的类了 双亲委托的话发现父类加载过就没必要让子类再次加载一次 还有一个好处就是考虑到安全因素。如果有个黑客写了一个java.lang.Integer类 但是里面的代码和Java源码并不一样 自身有写了很多其他的方法 运行双亲委托加载父类就会发现API文档里面有这个类 就会直接把已经加载过的Interger.class防止Java核心API库被随意更改

PS:双亲委托机制不是Java的强制约束 ,只是一个推荐模式 是可以破坏的 还有双亲委托机制和父类委托机制其实是一种东西 说法不一样而已

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值