1.从JDK源码级别彻底剖析JVM类加载机制【2023】

前置:
JVM初认识参考地址

内容概要

在这里插入图片描述

jvm.dll就相当于java中大xxx.jar文件,里面有很多的库函数、代码的实现
在这里插入图片描述
C++语言调用虚拟机的启动程序Launcher【jvm启动器的实例】,该类由引导类进行加载,用来创建其他类加载器。
通过这些加载器去真正调用loadclass去加载类,加载完后jvm会执行类的main()方法

loadclass的类加载过程有以下几步:
加载-----验证------准备------解析-----------------初始化----------【使用----------卸载】

在这里插入图片描述

在这里插入图片描述
在class字节码文件中输入javap -v R.class 将字节码文件生成可读文件

在这里插入图片描述
上面的结果是load A--------load B------------load test
new A();的时候,会先加载A类,所以输出load a;new A()会调用构造方法;所以会输出initial A
而B没有new 不会输出任何

类加载器

在这里插入图片描述
在这里插入图片描述

AppClassLoader调用最终父类ClassLoader 里面的loadClass方法再调用findLoadedClass方法去已经加载类的集合中找该类是否已经被加载,加载过的就直接返回,要是都没加载过,否则会逐级往上属性parent.loadClass去重复上个类加载器工作原理,直到parent属性值为空else中交给引导类加载器。调用本类的类加载器的findclass去完成加载

在这里插入图片描述

【上图】框中就是引导类加载器,用来去引导类加载器已经加载过的去找,或者去加载,如果能加载就返回,不能加载就跳出,给ext扩展类加载器去加载,扩展类加载器继承URLClassloader,就会调用父类URLClassloader的findClass【下图】找到类路径拿到相应类的文件,再调用defineClass进行加载,由于我们自己写的类在target文件中,肯定是加载不到的,又回到AppClassLoader,找到findClass方法 同样到父类的findClass方法就会拿到这个类中。

在这里插入图片描述

loadClass :实现双亲委派机制

findLoadedClass 底层是C++实现的
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值