Java类加载器探究

验证

验证的目的是为了确保 Class 文件的字节流中的信息不回危害到虚拟机。在该阶段主要完成以下四种验证:

  1. 文件格式验证:验证字节流是否符合 Class 文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型。

  2. 元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。

  3. 字节码验证:整个验证过程中最复杂的一个阶段,通过验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等。

  4. 符号引用验证:这个动作在后面的解析过程中发生,主要是为了确保解析动作能正确执行。

准备

准备阶段是为类的静态变量分配内存并将其初始化为默认值,这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的 内存,实例变量将会在对象实例化时随着对象一起分配在 Java 堆中。

/**

  • 在准备阶段 value 初始值为 0。

  • 在初始化阶段才会变为 123 。

*/

public static int value=123;

解析

该阶段主要完成符号引用到直接引用的转换动作。

初始化

到了初始化阶段,才真正开始执行类中定义的 Java 程序代码。为类的静态变量赋予正确的初始值。

  • 如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;

  • 如果类中存在初始化语句,就依次执行这些初始化语句。

使用

new出对象程序中使用。

卸载

执行垃圾回收。

类加载器分类


JVM 中内置了三个重要的 ClassLoader,分别是 BootstrapClassLoader、ExtensionClassLoader 和 AppClassLoader。

启动类加载器

Bootstrap ClassLoader:负责加载 JVM 运行时核心类,这些类位于 JAVA_HOME\jre\lib (JAVA_HOME 代表 JDK 的安装目录,下同) 文件夹中,如 rt.jar(runtime)、i18n.jar 等,这些是 Java 的核心类。这个 ClassLoader 比较特殊,它是由 c/c++ 代码实现的,我们将它称之为「根加载器」。

我们常用内置库 java.xxx. 都在 rt.jar 中,比如:java.util.、java.io.、java.nio.、java.lang. 等。

扩展类加载器

Extension ClassLoader:负责加载 JVM 扩展类,该加载器由 sun.misc.Launcher$ExtClassLoader 实现,它负责加载 JAVA_HOME\jre\lib\ext 目录中,或者由 java.ext.dirs 系统变量指定的路径中的所有类库(如 javax.* 开头的类),开发者可以直接使用扩展类加载器。

应用程序类加载器

Application ClassLoader:面向我们用户的加载器,该类加载器由 sun.misc.Launcher$AppClassLoader 实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器。

自定义类加载器

因为系统的 ClassLoader 只会加载指定目录下的 class 文件,如果你想加载自己的 class 文件,那么就可以自定义一个ClassLoader。而且我们可以根据自己的需求,对 class 文件进行加密和解密。

双亲委派机制


某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,子加载器才会尝试自己去加载。
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

[外链图片转存中…(img-x7g1VnQ7-1711387791957)]

需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值