网站建设栏目设计,互联网推广和传统营销有哪些相同点,手机网站制作的公司,seo是什么意思网络用语一个 class 文件被加载到内存中的步骤如下图所示#xff1a; 装载 装载是指 Java 虚拟机查找 .class 文件并生成字节流#xff0c;然后根据字节流创建 java.lang.Class 对象的过程。
1. ClassLoader 通过一个类的全限定名#xff08;包名类名#xff09;来查找 .class 文件…一个 class 文件被加载到内存中的步骤如下图所示 装载 装载是指 Java 虚拟机查找 .class 文件并生成字节流然后根据字节流创建 java.lang.Class 对象的过程。
1. ClassLoader 通过一个类的全限定名包名类名来查找 .class 文件并生成二进制字节流。其中 class 字节码文件的来源1.class 文件2jar包zip包3网络的字节流。
2. 把 .class 文件的各个部分分别解析parse为 JVM 内部特定的数据结构并存储在方法区。JVM 会将这些 .lcass 文件的结果转换为 JVM 内部运行时数据结构。
3. 在内存中创建一个 java.lang.Class 类型的对象。程序在运行过程中所有对该类的访问都通过这个类对象也就是这个 Class 类型的类对象是提供给外界访问该类的接口。
加载时机
隐式装载在程序运行过程中当碰到通过 new 等方式生成对象时系统会隐式调用 ClassLoader 去装载对应的 class 到内存中。
显示装载在编写源代码时主动调用 Class.forName() 等方法也会进行 class 装载操作。 链接
链接过程分为3步验证、准备、解析
1. 验证
目的是为了确保.class文件的字节流中包含的信息符合当前虚拟机的要求并且不会危及虚拟机本身的安全。 ● 文件格式检验:检验字节流是否符合class文件格式的规范并且能被当前版本的虚拟机处理 ● 元数据检验:对字节码描述的信息进行语义分析以保证其描述的内容符合Java语言规范的要求 ● 字节码检验:通过数据流和控制流分析确定程序语义是合法、符合逻辑的 ● 符号引用检验:可以看作是对类自身以外(常量池中的各种符号引用)的信息进行匹配性校验
2. 准备
准备的主要目的是为类中的静态变量分配内存并为其设置“0值”。
public static int value 100;
在准备阶段JVM 会为 value 分配内存并将其设置为0而真正的值100 是在初始化阶段设置。
public static final int value 100;
有 final 关键字修饰的变量会在准备阶段分配内存并设置值为100。
Java 中基本类型的默认“0值”如下
● 基本类型int, long, short, char, byte, boolean, float, double的默认值为0
● 引用类型默认值是 null。
3. 解析
解析的任务是把常量池中的符号引用转换为直接引用也就是具体的内存地址。在这一阶段JVM 会将常量池中的类、接口名、字段名、方法名等转换为具体的内存地址。 初始化
初始化这一阶段是执行类构造器cinit方法的过程并真正初始化类变量。例如
public static int value 100;
在准备阶段JVM 会为 value 分配内存并将其设置为0而真正的值100 是在初始化阶段设置。
初始化的时机
JVM规范中严格规定了class初始化的时机主要有以下几种情况会触发class的初始化: 1. 虚拟机启动时初始化包含main方法的主类 2. 遇到new指令创建对象实例时如果目标对象类没有被初始化则进行初始化操作 3. 当遇到访问静态方法或者静态字段的指令时如果目标对象类没有被初始化则进行初始化操作 4. 子类的初始化过程如果发现其父类还没有进行过初始化则需要先触发其父类的初始化 5. 使用反射API进行反射调用时如果类没有进行过初始化则需要先触发其初始化 6. 第一次调用java.lang.invoke.MethodHandle实例时需要初始化MethodHandle指向方法所在的类
初始化类变量
在初始化阶段只会初始化与类相关的静态赋值语句和静态语句也就是有 static 关键字修饰的信息。没有 static 修饰的语句块在实例化对象的时候才会执行。 Class 初始化和对象的创建顺序
面试题在代码中使用 new 创建一个类的实例对象时类中的静态代码块、非静态代码块、构造函数之间的执行顺序是怎样的
对象的初始化顺序静态变量/静态代码块 -- 普通代码块 -- 构造函数
1. 父类静态变量和静态代码块 2. 子类静态变量和静态代码块 3. 父类普通成员变量和普通代码块 4. 父类的构造函数 5. 子类普通成员变量和普通代码块 6. 子类的构造函数
总结 1. 装载指查找字节流并根据此字节流创建类的过程装载过程成功的标志就是在方法区中成功创建了类所对应的 Class 对象。
2. 链接指验证创建的类并将其解析到 JVM 中使之能够被 JVM 执行。
3. 初始化是将标记为 static 的字段进行赋值并且执行 static 标记的代码语句。