首页 > 代码库 > java JVM

java JVM

1.ClassLoader(类加载器)

1.加载:查找并加载类的二进制数据

2.连接

—验证:确保被加载的类的正确性(防止不是通过java命令生成的class文件被加载)

—准备:为类的静态变量分配内存,并将其初始化为默认值(如int默认值为0)

—解析:把类中的符号引用转换为直接引用

3.初始化:为类的静态变量赋予正确的初始值(即代码中指定的值 例:public static int a = 2)

  • JAVA程序对类的使用方式可以分为两种

    —主动使用(六种)

    —被动使用(除了主动使用的六种方法,其余的都属于被动使用)

  • 所有的Java虚拟机实现必须在每个类或接口被Java程序“首次主动使用”时才初始化
  • 主动使用

    —创建类的实例

    —访问某个类或接口的静态变量,或者对静态变量赋值(int b = Test.a)

    —调用类的静态方法

    —反射,Class.forName("Test");

    —初始化了一个类的子类

    —Java虚拟机启动的时被表明为启动的类  进入cmd使用Java命令   com.xyw.Test(包含main方法)

类的加载:

  类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构

加载.class的方式

—从本地系统中直接加载

—通过网络下载.class文件

—从zip,jar等归档文件中加载.class文件

—从专有数据库中提取.class文件

—将Java源文件动态编译为.class文件

类的加载的最终产品是位于堆区中的Class对象

Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口(即反射 Reflect)

有两种类型的类加载器

—Java虚拟机自带的加载器

根类加载器(Bootstrap) C++编写,程序员无法在java代码中获得该类

扩展类加载器(Extension) java实现

系统类加载器(System) java实现

—用户自定义的类加载器

java.lang.ClassLoader的子类(自定义加载器必须extends这个抽象类)

用户可以定制类的加载方式

类的验证:

 类加载器并不需要等到某个类被“首次主动使用”的时再加载它

JVM规范允许类加载器在预料的某个类将要被使用的时候加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类的时才报告错误(LinkageError错误)

如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误

类被加载后,就进入连接阶段,连接就是将已经读入内存的类的二进制数据合并到虚拟机的运行时环境中去

类的验证的内容:

1.类文件的结构检查 :确保类文件遵从java类文件的格式

2.语义检查 :确保类本身符合java语言的语法规定,比如验证final类型的类没有子类,已经final方法没有被覆盖

3.字节码验证:确保字节码流可以被JVM安全的执行,字节码代表java方法(包括静态方法和实例方法)

4.二进制兼容性的验证:确保相互引用的类之间的协调一致

类的准备:

在准备阶段,java虚拟机为类的静态变量分配内存,并设置默认的初始值,例如将为int类型的静态变量分配4个字节的内存空间,初始值为0,为long类型的静态变量分配8个字节的内存空间,默认值为0