ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JVM组成及类加载过程

2021-12-05 13:58:51  阅读:167  来源: 互联网

标签:及类 ExtClassLoader ClassLoader BootStrapClassLoader AppClassLoader 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的构造函数,是组合的关系。
注:双亲委派机制及如何打破双亲委派机制,将在下篇文章中具体解释。

标签:及类,ExtClassLoader,ClassLoader,BootStrapClassLoader,AppClassLoader,JVM,加载
来源: https://blog.csdn.net/CAUC_yangxiao/article/details/121728412

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有