java-虚拟机类加载机制

来源:互联网 发布:华为 培训 入职 知乎 编辑:程序博客网 时间:2024/06/10 16:06

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

2.类型的加载+连接+初始化,程序运行期间完成(动态加载,动态连接)->java动态可扩展

使用java运行期类加载特性如:用户可以预定义自定义类加载器让本地程序在运行时从网络或者其他地方加载一个二进制流作为程序代码的一部分,这种技术被广泛应用到java程序中,从基础的Applet,JSP到复杂的OSGi技术。

3.类的生命周期:加载,(验证,准备,解析)连接,初始化,使用,卸载。

加载:a、遇到new(new实例化一个对象)、getstatic、putstatic(读取或设置类的静态字段,被final修饰,已在编译期放入常量池的静态字段除外)、invokestatic(调用一个类的静态方法)这四个字节码,如果没有类,则需要初始化。

b、使用java.lang.reflect包的方法进行反射调用的时候,如果没有进行过类的初始化则需要进行类的初始化。

c、初始化一个类的时候,其父类没有初始化。

d、当虚拟机启动时,用户指定一个要执行的主类(main()方法的那个类)。

e、JDK1.7的动态语言的支持,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化过,则需要触发其初始化。

相关概念解释:

动态类型语言:类型检查的主体过程在运行期而不是在编译期。

加载:

1)通过一个类的全限定名来获取此类的的二进制字节流

2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

验证:

1.文件格式验证:是否以魔数开头,主、次版本号是否在当前虚拟机的处理范围内,常量池中是否有不被支持的常量类型等

2.元数据校验:是否有父类,是否继承了不应该继承的类(被final修饰的类),是否实现了父类或者接口中要求实现的所有方法。

3.字节码验证,通过数据流和控制流分析,确定程序语义是否合法:

(1)任意时刻操作数栈的数据类型和指令代码序列都能配合工作。

(2)跳转指令不会跳转到方法体意外的字节码指令上

(3)保证方法体中的类型转换时有效的

4.符号引用验证,将符号引用转换为直接引用

(1)全限定名是否能找到对应的类

(2)指定类是否存在符合方法的字段描述符以及简单名称所描述的方法和字段

(3)符号引用的类、字符、方法的访问性是否可被当前类访问。

准备:为类变量分配内存并设置类变量初始值

解析:常量池内的符号引用替换为直接引用




0 0
原创粉丝点击