JVM - 类加载

类加载是JVM中的一个非常核心的流程.

做的事情,就是把.class 文件,转换成JVM中的类对象~

类加载基本流程:

1. 加载 


把.class 文件给找到~~

代码中需要加载某个类,就需要在某个特定的目录中找到这个.class 文件~~

找到之后,就需要打开这个文件,并且进行读取文件~

此时就把这些数据已经读到内存里了~~

2. 验证

验证就是把刚才读到内存里的东西,进行一个校验~~

验证一下,刚才读到的这个内容是不是一个合法的.class 文件~得是编译器生成的.class文件才能通过验证.

如果随便创建一个文件,后缀名设为.class这是不能通过验证的~一~

除了验证文件格式之外,也会验证一下文件里面的一些字节码指令对不对~(方法里面具体要执行的指令)


3. 准备

这个准备阶段,其实就是为了类对象中的一些成员分配内存空间.(静态变量....),并且进行一个初步的初始化~~(把初始的空间设为全O)


4. 解析

这个是针对字符串常量进行的处理~~

.class文件中就涉及到一些字符串常量.

把这个类加载的过程中,就需要把这些字符串常量给替换成当前JVM内部已经持有的字符串常量的地址~

不是程序一启动,就立即把所有的类都给加载了.

用到哪个类就加载哪个类.

而字符串常量池是最初启动JVM就有的(堆里)

5. 初始化

这里就会真正的对静态变量进行初始化~~同时也会执行static 代码块~~

例题:重中之重手撸不容易

 由父及子,静态先行

类加载中的双亲委派机制

什么是双亲委派模型?


如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最 终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。
 

启动类加载器:加载 JDK 中 lib 目录中 Java 的核心类库,即$JAVA_HOME/lib目录。 扩展类加载
器。加载 lib/ext 目录下的类。
应用程序类加载器:加载我们写的应用程序。
自定义类加载器:根据自己的需求定制类加载器。

双亲委派模型的优点

1. 避免重复加载类:比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进行加载时就不需要在重复加载 C 类了。
2. 安全性:使用双亲委派模型也可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类,而有些 Object 类又是用户自己提供的因此安全性就不能得到保证了。


 有时也是需要破坏双亲委派机制的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值