JVM虚拟机之类的加载过程

灰太狼 2022-12-15 02:22 245阅读 0赞

总体流程图

在这里插入图片描述

1.加载
  1. 1.通过一个类的全限定名获取定义此类的二进制字节流
  2. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  3. 3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
2.验证
  • 目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全。
  • 主要包括四种验证:文件格式验证,元数据验证,字节码验证,符号引用验证。
3.准备
  • 为类变量分配内存并且设置该类变量的默认初始值,即零值。
  • 这里不包含用final修饰的static,因为final在编译的时候就会分配了,准备阶段会显式初始化
  • 这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。
4.解析
  • 将常量池内的符号引用转换为直接引用的过程。
  • 事实上,解析操作往往会伴随着JVM在执行初始化之后再执行。
  • 符号引用就是一组符号来描述所引用的目标。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。
  • 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等。
5.初始化
  • 初始化阶段就是执行类构造器方法()的过程。
  • 此方法不需定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。
  • 构造器方法中指令按语句在源文件中出现的顺序执行。
  • ()不同于类的构造器。(构造器就是虚拟机视角下的())
  • 若该类具有父类,JVM会保证子类的()执行前,父类的()已经执行完毕。
  • 虚拟机必须保证一个类的()方法在多线程下被同步加锁。

发表评论

表情:
评论列表 (有 0 条评论,245人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JVM之类过程

    当我们在Java代码中写下new String()的时候,我们理所当然认为java会返回给我们一个String对象,但是在JVM背后做了很多事情,包括类的加载、对象内存的分配等

    相关 JVM 之 类

    1.类加载 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,解析和初始化, 最终形成可以被虚拟机直接使用的java类型。 2.加载机

    相关 java虚拟之类机制

    前言 我们都知道,java编译的结果是字节码,不是本地机器码,这也是java跨平台的一大表现。既然java编译后是字节码,那么就不能实际地在本地(物理机器)运行。java