多品牌网站建设,设计广告的软件有哪些,云南俊发建设集团网站,新零售社交电商平台一个类从加载到虚拟机到使用结束从虚拟机卸载包括了加载、验证、准备、解析、初始化、使用、卸载#xff0c;即为一个类的生命周期下面来看一下类加载的过程#xff0c;即加载、验证、准备、解析、初始化5个阶段都做了什么事#xff1a;阶段1#xff1a;加载加载阶段虚拟机… 一个类从加载到虚拟机到使用结束从虚拟机卸载包括了加载、验证、准备、解析、初始化、使用、卸载即为一个类的生命周期下面来看一下类加载的过程即加载、验证、准备、解析、初始化5个阶段都做了什么事阶段1加载加载阶段虚拟机主要3件事通过类的全名获取其二进制字节流将字节流代表的静态结构转化为方法区识别的运行时数据结构在内存中实例化这个类的java.lang.Class对象(不一定在堆内存中的HotSpot就将Class对象放在了方法区里)程序访问这个类在方法区中的类型数据时会通过这个类去访问以上三点虚拟机并不要求如何实现只是一个规范比如第一步通过类全名获取其二进制流动态代理技术是在运行时获取、JSP应用是根据jsp文件获取并生成对应的Class以及从ZIP包中获取(JAR、EAR、WA同理)等阶段2验证验证阶段大体上会完成4个阶段的验证(文件格式验证、元数据验证、字节码验证、符号引用验证)以保证虚拟机中类的规范和安全。文件格式验证校验字节流是否复合Class文件的格式验证文件是否以魔数0xCAFEBABE(十六进制class文件中的前4个字节)开头主、次版本号(十六进制class文件中的第5、第6个字节)能否被当前版本的虚拟机处理常量池中是否有不被支持的类型指向常量的索引中是否指向了不存在的常量Class文件中各个部分以及文件本身是否有被删除或附加的其他信息……元数据类型校验语义是否符合Java语言规范的要求验证类是否有父类(除了java.lang.Object)验证父类是否继承了不可被继承的类如果不是抽象类那么要判断是否实现了父类或接口的所要求实现的所有方法……字节码验证校验类的方法体确定语义是否符合逻辑保证操作数栈中的数据类型与指令序列一致保证跳转指令不会跳到方法体外的字节码指令上保证方法体中的类型转换有效……阶段3准备准备阶段是为类变量分配内存并设置类变量初始值的阶段这里所说的初始值并不是指代码赋的值而是数据类型的默认值如public static int value 123; 在准备阶段过后,value会被置为0,而不是123。同时要注意public static final int value 123; 这种使用final修饰的变量在准备阶段就会被赋值为123,而不是初始值。阶段4解析解析阶段会将常量池内的符号引用转换为直接引用关于符号引用和直接引用的解释如下符号引用以一组符号来描述所引用的目比如定义了在类IntF中定义了intValue 123接着让Test.foo中的a变量指向Intf.intValue: public class Test{ public void foo(){ int a Intf.intValue; } } class Intf{ public static int intValue 123; }编译代码之后我们用javap -verbose Test来查看class文件中的内容 Constant pool: #1 Methodref #4.#12 // java/lang/Object.:()V #2 Fieldref #13.#14 // Intf.intValue:I #3 Class #15 // Test #4 Class #16 // java/lang/Object // 省略部分代码... public void foo(); descriptor: ()V flags: ACC_PUBLIC Code: stack1, locals2, args_size1 0: getstatic #2 // Field Intf.intValue:I 3: istore_1 4: return LineNumberTable: line 3: 0 line 4: 可以看到常量池第2项是一个符号引用指向了Intf.intValue直接引用就是我们常说的指针或者句柄直接引用的目标一定会在虚拟机内存中存在。阶段5初始化初始化阶段是类加载的最后一个阶段主要执行类的方法(不同与方法方法是在显式调用constructor时执行而方法在初始化阶段就会执行)()方法会执行赋值操作和执行静态语句快中的内容换句话说如果代码中没有静态语句块和赋值操作那么就可以没有()方法。这个阶段虚拟机会保证父类的()方法会在子类的()方法前执行而且在多线程环境中虚拟机会保证()方法的同步。