JVM组成及类加载过程

JVM组成

  • 类加载系统:负责完成类的加载,将字节码文件加载进内存(方法区)
  • 运行时数据区:在运行java程序时产生的数据会保存在运行时数据区
  • 执行引擎:执行具体的指令(代码)
    JVM组成
    一个类被加载进JVM要经历那几个过程?
  • 加载:通过io流的方式把字节码文件读取到jvm(方法区)中
  • 校验:通过校验字节码文件的头四位的16进制是否是cafebabe
  • 准备:为类中的静态部分开辟空间并赋初始化值
  • 解析:将符号引用转换成直接引用(将调用方法时的字符表现形式,转换成方法对应的地址)。——静态链接
  • 初始化:为类中的静态部分赋指定值并执行静态代码块。

类被加载后,类中的类型信息、方法信息、属性信息、运行时常量池、类加载器的引用等信息会被加载到元空间(1.7之前称方法区,1.7改为永久代,1.8开始称元空间)中。

类加载器

类是谁来负责加载的?——类加载器

  • Bootstrap ClassLoader 启动类加载器:负责加载jre/lib下的核心类库中的类,如rt.jar、charset.jar
  • ExtClassLoader 扩展类加载器:负责加载jre/lib下的ext目录内的类
  • AppClassLoader 应用类加载器:负责加载用户自己写的类
  • 自定义加载器:自己定义的加载器,可以打破双亲委派机制。

类加载过程

类加载过程
AppClassLoader、ExtClassLoader、BootStrapClassLoader之间并不是子类与父类之间的关系。

  • BootStrapClassLoader是调用本地方法获得(C++),如果打印该类实例对象返回为null。
  • ClassLoader类中有一个final修饰的成员变量ClassLoader
public abstract class ClassLoader {

    private static native void registerNatives();
    static {
        registerNatives();
    }

    // The parent class loader for delegation
    // Note: VM hardcoded the offset of this field, thus all new fields
    // must be added *after* it.
    private final ClassLoader parent;

也就是说BootStrapClassLoader将其自身作为参数传递给了ExtClassLoader的构造函数,ExtClassLoader将其作为参数传递给了AppClassLoader的构造函数,是组合的关系。
注:双亲委派机制及如何打破双亲委派机制,将在下篇文章中具体解释。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值