您现在的位置是:群英 > 开发技术 > 编程语言
jvm加载类的过程是怎样的,触发条件是啥?
Admin发表于 2022-01-19 18:20:31674 次浏览

    这篇文章给大家分享的是jvm加载类的过程,想要理解jvm加载类的过程,那么就是了解类在什么时候被加载和类是怎样被加载的这两问题,文中有很详细的介绍,对触发类加载的条件,类加载过程的七个阶段都有很详细的介绍,感兴趣的朋友接下来就跟随小编一起了解看看吧。

    本教程操作环境: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、初始化:

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

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

    双亲委派模型:

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

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

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

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

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

    现在大家对于jvm加载类的过程应该都有所了解了,希望大家阅读完这篇文章能有所收获。最后,想要了解更多jvm加载类的过程的内容,大家可以关注群英网络其它相关文章。

文本转载自PHP中文网

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2021-10-15 16:28:28 
摘要:搭建我的世界服务器,首先要满足自己和别人联机玩mc的平台。可以一次性容纳多人,而且不需要主人在线一直后台运作。服务器是个局域网络,选择一个区去玩,在里面玩会给你带来很好多的成就感,你可以打扮自己的家,也可以开一家小店,吸引客人,让对方买你东西。
2022-08-31 17:19:20 
摘要:本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了window.history对象的相关问题,History 对象包含用户(在浏览器窗口中)访问过的 URL,下面一起来看一下,希望对大家有帮助。
2022-05-20 17:26:18 
摘要:编译go语言程序的方法:1、在命令行工具中执行“go build fileName”命令,会将程序代码编译成二进制的可执行文件;2、在命令行工具中执行“go run fileName”命令,它会在编译后直接运行Go语言程序。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部