关注
Java中的类加载过程是一个非常关键的机制,它负责将编译后的.class文件(字节码)加载到JVM(Java虚拟机)中,并为程序执行做准备。这个过程主要分为以下五个步骤:
1. **加载(Loading)**:
- 这是类加载过程的第一个阶段。在这个阶段,JVM通过类的全限定名(包括包名和类名)找到对应的.class文件。
- 类加载器(Class Loader)负责查找并加载类字节码。Java中有不同的类加载器,如启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)、系统类加载器(Application ClassLoader)以及用户自定义的类加载器。
- 加载后,类的字节码会被转换为方法区内的数据结构,并在堆内存中创建一个代表该类的`java.lang.Class`对象,作为访问方法区数据的入口。
2. **验证(Verification)**:
- 为了确保类的字节码符合Java语言规范,不会危害JVM的安全性,JVM会对加载的字节码进行严格的验证。验证内容包括格式验证、元数据验证、字节码验证和符号引用验证等,以确保类的正确性、安全性和兼容性。
3. **准备(Preparation)**:
- 在这个阶段,JVM会为类中的静态变量分配内存空间,并赋予默认的初始值。例如,int类型的静态变量会被初始化为0,布尔类型为false,引用类型为null。注意,这里的初始化不包括显式赋值,那些会在初始化阶段完成。
4. **解析(Resolution)**:
- 解析阶段是将常量池内的符号引用转换为直接引用的过程。符号引用在编译期间生成,可以理解为对类、接口、字段或方法的一种间接引用。解析过程会将其转换为直接指向目标的指针、偏移量或能够间接定位到目标的句柄,以便于运行时快速访问。
5. **初始化(Initialization)**:
- 到了初始化阶段,JVM会执行类的静态初始化代码,包括静态字段的显式赋值和static块中的代码。初始化的顺序按照类的继承关系进行,即先初始化父类,再初始化子类。静态初始化只在类的第一次主动使用时进行(即所谓的“懒加载”策略),并且是线程安全的。
整个类加载过程遵循双亲委派模型,即当一个类加载器收到加载请求时,首先会将任务委托给其父加载器,依次递归,直到顶层的启动类加载器。如果父加载器无法完成加载,则子加载器才会尝试自己加载。这种机制保证了类的唯一性和安全性。
查看原帖
点赞 评论
相关推荐

点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 实习的内耗时刻 #
7518次浏览 103人参与
# 每个月的工资都是怎么分配的? #
57843次浏览 560人参与
# 去哪儿旅行秋招 #
220207次浏览 3153人参与
# 你上一次给父母打电话是什么时候 #
3216次浏览 39人参与
# 独居后,你的生活是更好了还是更差了? #
2524次浏览 42人参与
# 规定下班时间vs实际下班时间 #
5384次浏览 50人参与
# 腾讯大前端岗位热招中 #
12896次浏览 132人参与
# 工作上你捅过哪些篓子? #
4059次浏览 29人参与
# 视觉/交互/设计百问百答 #
52416次浏览 442人参与
# 你觉得材料多少算高薪 #
21964次浏览 148人参与
# 秋招笔面试记录 #
88037次浏览 1696人参与
# 央国企投递记录 #
98301次浏览 1408人参与
# 美团秋招笔试 #
61160次浏览 400人参与
# 入职第二天,午饭怎么解决 #
26124次浏览 73人参与
# tplink提前批进度交流 #
194971次浏览 1477人参与
# 2023毕业生求职有问必答 #
186689次浏览 1629人参与
# 你们公司哪个部门最累? #
29696次浏览 213人参与
# 找工作有哪些冷知识 #
137730次浏览 2337人参与
# 牛友们的论文几号送审 #
49875次浏览 797人参与
# 今年形式下双非本找得到工作吗 #
207073次浏览 1278人参与
# 你觉得现在还能进互联网吗? #
20484次浏览 186人参与
# 得物求职进展汇总 #
103420次浏览 826人参与