文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

jvm中类加载过程的示例分析

2023-06-20 17:30

关注

这篇文章主要介绍jvm中类加载过程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

类加载过程:1、加载阶段;2、验证阶段;3、准备阶段,主要是将类变量在方法区进行内存分配并进行初始化;4、解析阶段;5、初始化阶段,编译器会将类文件声明的静态赋值变量和静态区域合并生成cinit方法并进行调用;6、使用阶段;7、卸载阶段。

本教程操作环境:windows7系统、java8版、DELL G3电脑。

理解JVM的类加载过程,主要要回答两个问题:

类在什么时候被加载。

类是怎样被加载的。

jvm中类加载过程的示例分析

一、触发类加载的条件:

类的加载过程主要分为七个阶段:加载、验证、准备、解析、初始化、使用、卸载;加载、验证、准备、初始化、卸载这五个过程顺序是确定的,jvm必须严格按照这个顺序执行,jvm没有规定类加载的时机,但却严格规定了五种情况下必须立即对类进行初始化,加载自然要在此之前。

遇到new、getstatic、putstatic、invokestatic这四条指令时,如果类没有被初始化,则首先对类进行初始化。

使用java.lang.reflect包的方法对类进行反射调用时,若类没有进行初始化,则触发其初始化。

当初始化一个类时假如该类的父类没有进行初始化,首先触发其父类的初始化。

运行JVM必须指定一个含有main方法的主类,虚拟机会先初始化这个类。

当使用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修饰符修饰)在方法区进行内存分配并进行初始化。

数据类型零值数据类型零值
int0booleanfalse
long0Lfloat0.0f
short0double0.0d
char'\u0000'referencenull
byte0

4、解析:

1)、类或接口解析:将符合引用转化为类的直接引用,并检查访问权限。

2)、字段解析:将字段的符号引用转化为字段所属的类信息或其父类该字段的直接引用,并检查访问权限。

3)、类方法解析:将类方法的符号引用转化为类方法所属的类信息或其父类该字段的直接引用,并检查访问权限。

4)、接口方法解析:将接口方法的符号引用转化为接口方法所属的接口信息或其父类该字段的直接引用,并检查访问权限。

5、初始化:

初始化阶段编译器会将类文件声明的静态赋值变量和静态区域合并生成<cinit>方法并进行调用。

类加载器:类加载器是“通过一个类的全限定名加载这个类的二进制字节流”的实现,对于任何一个类,都是由类加载器和该类的本身共同确定在虚拟机中的唯一性。

双亲委派模型:

jvm中类加载过程的示例分析

Bootstrap ClassLoader 启动类加载器,负责加载<JAVA_HOME>/lib/rt.jar.

Extension ClassLoader 拓展类加载器,负责加载<JAVA_HOME>/lib/ext底下的包

Application  ClassLoader 应用类加载器,负责加载CLASSPATH路径下的JAVA类库。

User ClassLoader 用户自定义的类加载器。

双亲委托模型采用这样的方式加载类:当类加载器收到加载类请求时,首先委托父类加载该类,所有类加载器都采用这种方式,因此所有类加载请求都会到达顶层父类,父类加载不到时再使用该类加载器中加载。这样,类加载器之间就有了一种层级关系,能够保证Java的基础类由相同的类加载器加载,对Java系统的稳定性起到至关重要的作用。

以上是“jvm中类加载过程的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯