当前位置: 首页 > 后端技术 > Java

JVM类加载过程(缩略版)

时间:2023-04-01 20:27:45 Java

JVM类加载分为三个步骤:加载(load)->链接(link)->初始化(init)。加载通过类的完全限定名获取定义类的二进制字节码文件我们知道.class文件有几种常见的加载方式:本地系统直接加载网络从zip压缩包(jar,warpackage)并运行Time-calculatedgeneration(dynamicproxy)generatedbyotherfiles(JSP)extractfromproprietarydatabase(less)从加密文件中获取(防止.class文件被反编译)并转换为该字节表示的静态存储结构stream在内存中为方法区的运行时数据结构生成一个代表该类的java.lang.Class对象,作为该类各种数据在方法区的访问链接也分为三步:验证—>准备—>分析验证确保类文件字节流中包含的信息符合当前虚拟机的要求,保证加载类的正确性,保护虚拟机的安全。验证主要有四种:文件格式验证、元数据验证、字节码验证、符号引用验证准备为类变量(静态变量)分配内存(到方法区),并设置默认初始值(零值)特例:这里是不包含final修饰的静态变量,因为final变量会在编译时分配内存空间(因为是常量),会在准备阶段显式初始化(??直接初始化为代码中赋值的值)).这里也不包括强度变量,因为实例变量是和对象一起分配到堆中的。Resolution将常量池中的符号引用转换为直接引用。实际上,解析操作通常在初始化之后执行。符号引用:一组描述引用目标的符号。直接引用:直接指向目标的指针、相对偏移量或句柄。主要针对类或接口、字段、接口方法、方法类型等初始化执行类构造方法()的过程。该方法无需定义,由javac编译器结合,收集类中静态变量的所有赋值动作和静态代码块中的语句(均为类中的静态操作,故称为初始化)构造方法中的指令按照在源文件中出现的顺序执行语句(即从上到下,先出现的先执行)。如果有父类,则先执行父类的()。在多线程环境中,一个类的()方法会被锁定。这是因为一个类只需要初始化一次,防止在多线程环境下被多次初始化。