Java-Jvm-.class文件加载过程

Java-Jvm-.class文件加载过程,第1张

Java-Jvm-.class文件加载过程

我们有一个.java的文件通过执行javac命令可以变成.class文件,当我们调用Java命令的时间class会被加载到内存中,这个过程叫做classloader,即内存加载。

类加载的过程有三个:loading-装载,linking-链接,initializing-初始化

其中linking又分为三个步骤:verification,perparation,resolution;

类加载过程:

1.装载:查找和导入的class文件到内存(loading)

2.链接:其中的解析步骤是可以选择的(linking)

(a) 检查:检查载入的class文件数据的正确性 (verification)

(b) 准备:给类的静态变量分配存储空间,赋默认值 (perparation)

(c) 解析:把class文件常量池中用到的符号引用转为直接内存地址 (resolution)

3.初始化:对静态变量,静态代码块执行初始化工作(initializing)

注意:在链接(linking)的第二步中,此处是为静态代码块分配空间且赋默认值,此时的值为0,若在初始化的时候有static int a = 10; 这个时候才会给初始化赋值为10。

类加载器:

类在加载的过程是通过类加载器加载的,类加载器的加载过程是分成不同的层次进行加载的,不同的加载器来加载不同的class文件,Bootstrap--Extension--Application--Custom(自定义加载器)

1,Bootstrap:最顶层的类加载器,负责加载JDK中的核心类库,是由C++实现的

2,Extension:是用来加载扩展类的,主要负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目录下的所有jar包

3, App:加载calsspath指定内容,我们项目中自己创建的class基本都由此加载器加载

4,custom classloader:自定义加载器

java在类加载的时候是通过类加载器加载进jvm的,而jvm是采用双亲委派的机制对类进行加载的。

双亲委派机制的过程:

 cache: 电脑高速缓冲存储器;贮存物;隐藏处

双亲委派全过程:重点

1.首先去Custom ClassLoader的cache中查看是否加载过,有则直接返回。

2.不存在去App ClassLoader的cache中查看是否加载过,有则直接返回。

3.不存在去Extension ClassLoader的cache中查看是否加载过,有则直接返回。

4.不存在去Bootstrap ClassLoader的cache中查看是否加载过,有则直接返回。

5.不存在则尝试进行加载,首先是Bootstrap ClassLoader去加载,看这个类在不在自己的加载范围

6.不在自己的加载范围就去Extension ClassLoader加载,看这个类在不在自己的加载范围

7.不在自己的加载范文就去App ClassLoader加载,看这个类在不在自己的加载范围

8.如果Custom ClassLoader也找不到的话,加载不了就会返回报错classNotFound

总结:执行过程---(向上查找,向下加载)

双亲委派的好处:

不浪费资源,加载过的资源就不会再次就行加载,避免重复加载。

安全,可避免用户自己编写的类动态替换Java的核心类,如java.lang.String。

读完欢迎您留言,有问题或者不足之处鄙人及时修正,顺便点个赞呦

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/5681636.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存