类加载过程:1、加载阶段;2、验证阶段;3、准备阶段,主要是将类变量在方法区进行内存分配并进行初始化;4、解析阶段;5、初始化阶段,编译器会将类文件声明的静态赋值变量和静态区域合并生成cinit方法并进行调用;6、使用阶段;7、卸载阶段。
本教程操作环境:windows7系统、java8版、DELL G3电脑。
理解JVM的类加载过程,主要要回答两个问题:
1、类在什么时候被加载。
2、类是怎样被加载的。
一、触发类加载的条件:
类的加载过程主要分为七个阶段:加载、验证、准备、解析、初始化、使用、卸载;加载、验证、准备、初始化、卸载这五个过程顺序是确定的,jvm必须严格按照这个顺序执行,jvm没有规定类加载的时机,但却严格规定了五种情况下必须立即对类进行初始化,加载自然要在此之前。
1、遇到new、getstatic、putstatic、invokestatic这四条指令时,如果类没有被初始化,则首先对类进行初始化。
2、使用java.lang.reflect包的方法对类进行反射调用时,若类没有进行初始化,则触发其初始化。
3、当初始化一个类时假如该类的父类没有进行初始化,首先触发其父类的初始化。
4、运行JVM必须指定一个含有main方法的主类,虚拟机会先初始化这个类。
5、当使用Jdk1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic、REF_putstatic、REF_inokestatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化时,触发该类初始化。
二、类加载过程
类加载过程主要分为七个阶段:加载、验证、准备、解析、初始化、使用、卸载。
1、加载:
1)、通过一个类的全限定名加载该类对应的二进制字节流。主要通过类加载器实现。
2)、将字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区各个类访问该类的入口。(Hotspot 在方法区生成该类)。
2、验证:
1)、文件格式验证:验证类文件的魔术版本号常量等是否符合当前虚拟机支持的范围。
2)、元数据验证:验证类的语义信息,是否符合java语言规范的要求。
3)、字节码验证:验证程序语义是合法的、合乎规范的。主要通过stackmapframe结构。
4)、符号引用验证:虚拟机在将符号引用转化为直接引用,验证符号引用全限定名代表的类是否能够找到,对应的域和方法是否能找到,访问权限是否合法。
3、准备:
准备阶段主要是将类变量(被static修饰符修饰)在方法区进行内存分配并进行初始化。
数据类型 | 零值 | 数据类型 | 零值 |
---|---|---|---|
int | 0 | boolean | false |
long | 0L | float | 0.0f |
short | 0 | double | 0.0d |
char | '\u0000' | reference | null |
byte | 0 |
4、解析:
1)、类或接口解析:将符合引用转化为类的直接引用,并检查访问权限。
2)、字段解析:将字段的符号引用转化为字段所属的类信息或其父类该字段的直接引用,并检查访问权限。
3)、类方法解析:将类方法的符号引用转化为类方法所属的类信息或其父类该字段的直接引用,并检查访问权限。
4)、接口方法解析:将接口方法的符号引用转化为接口方法所属的接口信息或其父类该字段的直接引用,并检查访问权限。
5、初始化:
初始化阶段编译器会将类文件声明的静态赋值变量和静态区域合并生成
类加载器:类加载器是“通过一个类的全限定名加载这个类的二进制字节流”的实现,对于任何一个类,都是由类加载器和该类的本身共同确定在虚拟机中的唯一性。
双亲委派模型:
1、Bootstrap ClassLoader 启动类加载器,负责加载
2、Extension ClassLoader 拓展类加载器,负责加载
3、Application ClassLoader 应用类加载器,负责加载CLASSPATH路径下的JAVA类库。
4、User ClassLoader 用户自定义的类加载器。
双亲委托模型采用这样的方式加载类:当类加载器收到加载类请求时,首先委托父类加载该类,所有类加载器都采用这种方式,因此所有类加载请求都会到达顶层父类,父类加载不到时再使用该类加载器中加载。这样,类加载器之间就有了一种层级关系,能够保证Java的基础类由相同的类加载器加载,对Java系统的稳定性起到至关重要的作用。
相关视频教程推荐:Java视频教程
以上是jvm类加载过程有哪些阶段的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了各种Java垃圾收集算法(串行,并行,CMS,G1,ZGC),它们的性能影响和适合大量堆的应用。

本文讨论了Java虚拟机(JVM),详细介绍了其在不同平台运行Java程序中的作用。它说明了JVM的内部流程,密钥组件,内存管理,垃圾收集和性能Optimizatio

Java的Nashorn Engine可以在Java应用程序中启用JavaScript脚本。关键步骤包括设置Nashorn,管理脚本和优化性能。主要问题涉及安全性,内存管理和未来兼容性

Java的Try-with-Resources通过自动关闭文件流或数据库连接等资源来简化资源管理,从而提高代码可读性和可维护性。

Java枚举代表固定的值集,通过自定义方法和构造函数提供类型安全性,可读性和其他功能。它们增强了代码组织,可用于开关语句中以进行有效的价值处理。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

禅工作室 13.0.1
功能强大的PHP集成开发环境

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver CS6
视觉化网页开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。