jvm介绍 day3

image.png
  • 记载:就是把二进制形式的java类型读入java虚拟机中

  • 验证:

  • 准备:为类变量分配内存,设置默认值。但是在到达初始化之前,类变量都没有初始化为真正的初始值

  • 解析:解析过程就是在类型的常量池中寻找类、接口,字段和方法的符号引用,把这些符号引用替换成直接引用的过程。

  • 初始化:为类变量赋予正确的初始值。

  • 类实例化:

    1. 为新的对象分配内存。
    2. 为实例变量赋默认值。
    3. 为实例变量赋正确的初始值。
  • java编译器为它编译的每一个类都至少生成一个实例初始化方法,再java的class文件中,这个实例初始化方法被称为“<init>”。针对源代码中每一个类的构造方法,java编译器都产生一个<init>方法。

  • 类的加载的最终产品是位于内存中的class对象

类的加载

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

类的初始化规则

  • 当java虚拟机初始化一个类时,要求它的所有父类都被初始化,但是这条规则并不适用与接口。
    1. 在初始化一个类时,并不会先初始化它所实现的接口。
    2. 在初始化一个接口时,并不会先初始化它的父接口。
      因此,一个父接口并不会因为它的子接口或者实现类的初始化而初始化,只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。
/**
 * @author NingXioaoming
 * @createTime 2019/12/12 15:13
 * @description
 */

/*
        一个父接口并不会因为它的子接口或者实现类的初始化而初始化,
        只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化

 */
public class MyTest5 {
    public static void main(String[] args) {
        System.out.println(MyChild5.bb);
/*        new c();
        new c();*/
    }
}

interface MyParent5{
    String bb = UUID.randomUUID().toString();
//    static int c = 1/0;
    static int a = 4;
    Thread t = new Thread(){
        {
            System.out.println("MyParent5 run");
        }
    };
}

class MyChild5 implements MyParent5{
    public static final String bbc = UUID.randomUUID().toString();
    public static final int b= 5;  //默认为 static和final的
}

class c{
    public c(){//第三执行
        System.out.println("无参构造 run");
    }
    {//第二执行
        System.out.println("nihao");
    }
    static {//先执行
        System.out.println("static 块 run");
    }
}

类加载器

1. 双亲(父亲,爷爷)委托加载类机制
image.png

image.png

由下往上进行加载 只要有一个类加载器加载成功,就加载成功了, 下面加载不成功 则给上面的双亲让双亲进行加载。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,确实编译语言发展的一大步。 虚拟机把描述类的数据从...
    胡二囧阅读 4,536评论 0 0
  • 虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验、转换解析和初始化, 最终形成可以被虚拟机直接使...
    好好学习Sun阅读 5,007评论 0 3
  • 在Class文件中描述了各种信息,最终都需要加载到虚拟机中才能运行和使用,而虚拟机是如何加载这些Class文件呢?...
    小胖学编程阅读 3,564评论 0 3
  • JVM类加载机制 概述 类加载过程 加载 通过类的全限定名获取类的二进制流 将静态存储结构转化为方法区的运行时数据...
    东溪95阅读 8,207评论 0 15
  • 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的...
    丑人林宗己阅读 3,649评论 0 2