加载:把二进制形式的java类型读入jvm中,最终产品是位于内存中的class对象
验证:为类变量分配内存设置默认值
解析:就是在类型的常量池里寻找类、接口、字段和方法的符号引用,并将其替换为直接引用

类实例化:

  1. 为新的对象分配内存
  2. 为实例变量赋默认值
  3. 为实例变量赋正确的初始值

java编译器会为它编译的每一个类都至少生成一个实例初始化方法,在java 的class文件中,这个实例化初始化方法被称为<init>,针对每个类的构造方法,java编译器都会生成一个<init>方法

有两种类型的类加载器

  1. jvm自带的加载器

    1. 根类加载器(Bootstrap)
    2. 扩展类加载器(Extension)
    3. 系统(应用)类加载器
  2. 用户自定义的类加载器

    1. java.lang.ClassLoader的子类
    2. 用户可以定制累的加载方式

类加载器并不需要等到某个类被首次主动使用时再加载它
JVM规范允许类加载器再预料某个类将要被使用时就预先加载它,如果在预加载过程中遇到.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkError错误)
如果这个类一直没有被程序主动使用那么,类加载器就不会报告错误

类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的二进制文件数据合并到jvm的运行环境当中去。
类验证的内容:类文件的结构检查,语义检查,字节码验证,二进制兼容性验证

静态变量的声明语句,以及静态代码块都被看做类的初始化语句,jvm会按照他们在类文件中的先后顺序依次执行他们

调用ClassLoader类的LoadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化

双亲委托机制:

每个类加载器(除了根加载器),都有且只有一个父加载器,当java程序请求加载器loader1加载sample时,loader1首先委托自己的父加载器去加载sample,如果可以,那么有=由父加载器执行加载任务,否则loader1加载,否则抛异常

根加载器负责加载jvm的核心类库,如java.lang,根加载器的实现依赖于底层操作系统,属于jvm实现的一部分
扩展类加载器:父加载器是根加载器,它从java.ext.dirs系统属性所指定的目录加载类库,或者从JDK安装目录jre/lib/ext下加载类库,如果把用户创建的jar文件放在这也会被加载。它是java.lang.ClassLoader的子类
系统(应用)类加载器:父加载器是扩展类加载器,它从环境变量classpath或者系统属性java.class.path所指定的目录加载类,它是用户自定义的类加载器的默认父加载器,也是java.lang.ClassLoader的子类


KKCarrot
1 声望0 粉丝