JVM原理之类加载机制

1.什么是JVM

1.1 JVM解释

JVM是 Java Virtual Machine (Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引用地址:https://baike.baidu.com/item/JVM

1.2 JVM 架构图

在这里插入图片描述

2. 源码 -> 类文件

2.1 源码
class Person{ 
    private String name; 
    private int age; 
    private static String address; 
    private final static String hobby="Programming";
    public void say(){ 
        System.out.println("person say...");
    }
    public int calc(int op1,int op2){
        return op1+op2; 
    } 
}

编译: javac Person.java —> Person.class

2.2 编译阶段

Person.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器

-> 注解抽象语法树 -> 字节码生成器 -> Person.class文件

2.3 类文件
  • 官网地址:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.1
  • .class 字节码文件
魔数与class文件版本 
常量池
访问标志
类索引、
父类索引、
接口索引 
字段表集合
方法表集合
属性表集合

3. 类加载机制

3.1 加载

  • 查找和导入 .Class 文件

    1.根据类的全限定名转化为二进制字节流

    2.将二进制字节流所代表的静态存储结构转化为方法区的运行时数据结构

    3.在Java堆中生成一个代表这个类的 java.lang.Class对象,作为对方法区中这些数据的访问入口

3.2 链接

3.2.1 验证

保证被加载类的正确性

  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 符号引用验证
3.2.2 准备

为类的静态变量分配内存,并初始化为默认值

public class Test{
    //初始化 a = 0;
    private static int a = 1;
    // 初始化 obj = null;
    private static Object obj = new Object();
}
3.2.3 解析

将符号引用转换为直接引用

3.3 初始化

将类的静态变量,静态代码块 执行初始化操作

  • 例如:将 a 的值 赋值 为 1;
public class Test{
    private static int a = 1;
    static{
        System.out.println("初始化静态块");
    }
}

3.4 类加载器ClassLoader

3.4.1 类加载器类型
  1. Bootstrap ClassLoader 负责加载$JAVA_HOMEjre/lib/rt.jar里所有的class 或 Xbootclassoath 选项制定的jar包。由c++实现,不是ClassLoader子类
  2. Extension ClassLoader 负责加载java平台中扩展功能的一些jar包,包括 $JAVA_HOMEjre/lib/*.jar-Djava.ext.dirs 指定目录下的jar 包
  3. App ClassLoader 负责加载classpath中指定的jar包以及 Djava.class.path 所指定目录下的类和jar包
  4. Custom ClassLoader 通过 java.lang.ClassLoader 的子类自定义加载class,属于应用程序根据自身需要自定义的ClassLoader, 如 tomcat , jboss 都会根据 j2ee规范自行实现了 ClassLoader.
    在这里插入图片描述
3.4.2 加载原则
  • 加载类的顺序 从上到下
  • 检查某个类是否加载顺序是 从下到上,保证一个类自加载一次
  • 双亲委派机制
    • 一个类加载器在接到加载类的请求的时候,首先他不会加载,他会委托给父类加载器,依次递归,如果父类加载器可以加载,就会完成加载工作并成功返回。如果父类完成不了,才自己加载。
    • 优势:实现类加载的分层,结构清晰,更是为了安全。
    • 破坏: 可以 继承ClassLoader 类,重写 loadClass 方法;
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值