JVM类加载原理学习笔记

JVM类加载原理学习笔记

(1)类的生命周期包括了:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)七个阶段

(2)当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。

(3)加载阶段:通过一个类的全限定名来获取此类的二进制字节流;将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口;

(4)验证阶段:验证是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全;包括文件格式验证、元数据验证、字节码验证、符号引用验证;如果验证到输入的字节流不符合Class文件的存储格式,就抛出一个java.lang.VerifyError异常或其子类异常。

(5)准备阶段:准备阶段是正式为类变量分配内存并设置类变量初始值(各数据类型的零值)的阶段,这些内存将在方法区中进行分配。

(6) 解析阶段:解析阶段是在虚拟机将常量池内的符号引用替换为直接引用的过程。符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。直接引用:直接引用可以是直接指向目标的指针、相对偏移量或者一个能间接定位到目标的句柄。如果有了直接引用,那引用的目标必定已经在内存中存在。

(7)初始化阶段:初始化阶段是执行类构造器<clinit>()方法的过程。

初始化是重点,需要清楚以下几点

1、<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序决定的。静态语句块只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块中可以赋值,但是不能访问。

2、 方法与实例构造器<cinit>()不同,不需要显示的调用父类构造器,虚拟机会保证在子类的<clinit>()方法执行之前,父类的<clinit>()已经执行完毕。

3、<clinit>()方法对于类或接口来说不是必须的,如果一个类中没有静态语句块也没有对变量的赋值操作,那么编译器可以不为这个类生成<clinit>()方法。

4、 执行接口的<clinit>()不需要先执行父接口的<clinit>()方法,只有当父接口中定义的变量被使用时,父接口才会被初始化。接口的实现类在初始化时也不会执行接口的<clinit>()方法。

5、虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确的加锁和同步,如果多个线程同时去初始化一个类,则只会有一个线程去执行这个类的<clinit>()方法,其他线程需要阻塞等待。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2282.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IO流的分类_io流的作用

    IO流的分类_io流的作用IO流的分类可以分为以下三种:第一种:输入流和输出流按照流的流向来分,可以分为输入流和输出流。输入,输出都是从程序运行所在内存的角度来划分的。输入流:只能从中读取数据,而不能向其写入数据,由InputStream和Reader作为基类。输出流:只能向其写入数据,而不能从中读取数据。由OutputStream和Writer作为基类第二种:字节流和字符流字节流和字符流的用法几乎完全一样,区…

    2022年10月20日
    2
  • Vue学习之按键修饰符

    Vue学习之按键修饰符Vue学习之按键修饰符

    2022年4月23日
    74
  • 在ubuntu下完美安装RTX(解决离线、乱码问题) 转

    在ubuntu下完美安装RTX(解决离线、乱码问题) 转

    2021年8月26日
    54
  • Java数组的初始化大小_对Java接口实现的建议

    Java数组的初始化大小_对Java接口实现的建议**二维数组:**元素是一维数组的数组。格式一:publicclassArrayDemo{publicstaticvoidmain(String[]args){//格式一int[][]arr=newint[3][2];System.out.println(arr);//[[I@1b6d3586System.out.println(arr[0]);//[I@4554617c

    2022年10月9日
    4
  • Git的安装与使用教程(超详细!!!)「建议收藏」

    Git的安装与使用教程(超详细!!!)「建议收藏」git提交全部文件1、get.add.gitaddxx命令可以将xx文件添加到暂存区,如果有很多改动可以通过getadd-A.来一次添加所有改变的文件。注意-A选项后面还有一个句点。gitadd-A表示添加所有内容,gitadd.表示添加新文件和编辑过的文件不包括删除的文件;gitadd-u表示添加编辑或者删除的文件,不包括新添加的文件。2.、git…

    2022年4月29日
    43
  • 云计算和虚拟化技术的关系_云计算技术与应用

    云计算和虚拟化技术的关系_云计算技术与应用#写于2021.04.10#本文为学习笔记,用的ppt是陈羽中教授版,侵删#笔记只为交流,入门小白,有错望留言纠正#总结不易望赞鼓励1.大数据和云计算1.1大数据现象是怎么形成的?形成人用的多了产生数据设备多了大数据时代导致数据有以下特点:1.2云计算有哪些特点?超大规模虚拟化高可靠性通用性高可伸缩性按需服务极其廉价1.3云计算你找服务类型可分为哪几类?1.4云计算技术体系结构可分为哪几层?资源池和管理中间件层为云计算技术的

    2025年7月13日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号