首页 > 其他分享 >2_类加载子系统

2_类加载子系统

时间:2024-03-10 09:55:22浏览次数:17  
标签:Java ClassLoader 子系统 虚拟机 父类 class 加载

类加载子系统Class Loader

Java架构图:

Java架构图

2.1 类加载器的作用

  • 类加载器负责从文件系统或网络中加载Class文件,class文件在文件开头有特定的文件标识。
  • ClassLoader只负责class文件加载,至于它是否可以运行,则由执行引擎(Execution Engine)决定。
  • 加载的类信息放在一块称之为方法区的空间。除了类的信息外,方法区中还会存放运行时常量池信息等。

2.2 类加载器ClassLoader角色

类的加载过程

3. 类的加载过程阶段一:Loading加载阶段

加载:

  1. 通过一个类的权限定名获取定义此类的二进制字节流。
  2. 将这个字节流所代表的的静态存储结构转化为方法区运行时数据结构。
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各个数据访问入口。

4. 类的加载过程阶段二:Verification验证阶段

  • 验证的目的在于确保Class文件的字节流中所包含的信息符合当前虚拟机的要求,保证被加载类的正确性,不会危害虚拟机的自身安全等。
  • 主要包含四种验证:文件格式验证(class文件魔术0xcafebabe)、元数据验证、字节码验证、符号引用验证。

5. 类的加载过程阶段三:Preparation准备阶段

  • 为类变量分配内存并且设置该类变量的初始值,即零值。
  • 这里不包含final关键字修饰的static,因为final在编译时就会分配了。
  • 这里不会为实例变量分配初始化,类变量会分配在方法区,而实例变量是随着对象一起分配到Java堆中

6. 类的加载过程阶段四:Resolution解析阶段

  • 将常量池的符号引用转化为直接引用的过程。
  • 解析动作主要包括类、接口、字段、类方法、接口方法、方法类型等。

5. 类的加载过程阶段五:Initialization初始化阶段

  • 初始化阶段就是执行类构造方法()的过程。
  • 此方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并起来。
  • 构造方法中指令按语句在源文件中出现的顺序执行。
  • ()不同于类的构造器。
  • 若该类具有父类,JVM会保证子类的()执行前,父类的()已经执行完毕。
  • 虚拟机必须保证一个类的()方法在多线程下被同步加锁。

6. 类加载器的分类

  • JVM支持两种类型的类加载器,分别是引导类加载器Bootstrap ClassLoader自定义类加载器User-Defined ClassLoader
  • 从概念上讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机却没有这样定义,而是将所有原生于抽象类ClassLoader*的类加载器都划分为自定义加载器。
public class HelloLoader {
    public static void main(String[] args) {
        // 获取系统类类加载器
        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        System.out.println(classLoader);//jdk.internal.loader.ClassLoaders$AppClassLoader@36baf30c
        // 获取其上层,扩展类加载器
        ClassLoader parentClassLoader = classLoader.getParent();
        System.out.println(parentClassLoader);//jdk.internal.loader.ClassLoaders$PlatformClassLoader@b4c966a
        // 获取其上层引导类加载器
        ClassLoader bootstrapClassLoader = parentClassLoader.getParent();
        System.out.println(bootstrapClassLoader);//null

        //对于用户自定义类加载器:使用系统类加载器进行加载
        //注意!Java核心类库使用的是引导类加载器
        ClassLoader helloLoader = HelloLoader.class.getClassLoader();
        System.out.println(helloLoader);//jdk.internal.loader.ClassLoaders$AppClassLoader@36baf30c
    }
}

虚拟机自带的加载器:

  • 启动类加载器(引导类加载器Bootstrap ClassLoader)
    • 这个类加载器使用C/C++语言实现的,嵌套在JVM内部。
    • 它主要用来加载Java的核心类库(JAVA_HOME/jre/lib/rt.jar、resources.jar、sun.boot.class路径下的内容),用于提供JVM自身需要的类
    • 并不继承java.lang.ClassLoader,没有父类加载器
    • 加载扩展类和应用程序类加载器,并制定为他们的父类加载器。
    • 出于安全的考虑,Bootstrap启动类加载器只加载包含包名为java、javax、sun等开头的类
  • 扩展类加载器(Extension ClassLoader)
    • Java语言编写,由sun.misc.Launcher$ExtClassLoader实现。
    • 派生于ClassLoader类
    • 父类加载器是启动类加载器
  • 应用程序类加载器(系统类加载器AppClassLoader)
    • java语言编写,由sun.misc.Launcher$AppClassLoader实现
    • 派生于ClassLoader
    • 父类加载器为扩展类加载器
    • 它负责加载环境变量classpath或系统属性等
    • 该类是程序中默认的类加载器,一般来说,Java应用程序的类都是由它来完成加载。
    • 通过ClassLoader$getSystemClassLoader()方法可以获取到该类加载器

标签:Java,ClassLoader,子系统,虚拟机,父类,class,加载
From: https://www.cnblogs.com/lilyflower/p/18063760

相关文章

  • Linux CAN子系统:基于M_CAN解读
      Linux下CAN驱动属于网络设备驱动。CAN在内核中大致框架如下:  1CAN配置 对CAN设备的配置,首先需要打开CAN子系统,然后打开CAN设备驱动,其他还包括调试信息等。Networkingsupport->CANbussubsystemsupport->RawCANProtocol(rawaccesswithCAN-ID......
  • react-router路由懒加载/路由守卫
    路由懒加载目前在网络上搜到的路由懒加载方式基本都是通过React.lazy()方法配合Suspense的方式,可能是受vue-router的影响,我很不喜欢这种方式,不喜欢就改变。上代码import{createBrowserRouter}from"react-router-dom";constrouter=createBrowserRouter([{......
  • 聊聊懒加载以及优化方案
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:霁明什么是懒加载(lazyloading)懒加载是一种将资源标识为非阻塞(非关键)资源并仅在需要时加载它们的策略。这是一种缩短关键渲染路径长度......
  • iOS使用Unity容器动态加载3D模型
    项目背景我们的APP是一个数字藏品平台,里面的很多藏品需要展示3D模型,3D模型里面可能会包含场景,动画,交互。而对应3D场景来说,考虑到要同时支持iOS端,安卓端,Unity是个天然的优秀方案。对于Unity容器来说,需要满足如下的功能:1.在APP启动时,需要满足动态下载最新的模型文件。2.在点击藏......
  • mybatis面试高频问题---执行流程/延迟加载/缓存
    mybatis一.mybatis执行流程理解了各个组件的关系Sql的执行过程(参数映射、sql解析、执行和结果处理)二.mybatis支持延迟加载1.立即加载查询用户信息的同时也可以查询到相关订单信息UserMapper:OrderMapper:UserTest.java打印输出用户信息执行结果:2.延迟加载f......
  • 5 类加载器分类
    5类加载器分类启动类加载器(Bootstrap)启动类加载器(BootstrapClassLoader)是由Hotspot虚拟机提供的、使用C++编写的类加载器默认加载Java安装目录/jre/lib下的类文件,比如rt.jar,tools.jar,resources.jar等。通过启动类加载器加载jar包放入jre/lib下进行扩展(不推荐),尽可能不......
  • ROS 加载yaml教程
    ros加载yaml文件ROS官方提供了自动加载yaml文件的功能,并且集成到了launch文件里面,只需要使用rosparam标签就能把yaml配置文件加载到ros的参数服务器里面,然后使用nodehandle.getParam()函数就可以方便的使用了。下面给出关键的使用步骤:编写yaml文件。注:避免使用-分割数组,否则......
  • python加载库
    #testInstance.pyimportimportlibimportsysclassTestInstance:def__init__(self,projectName):self.projectName=projectNameself.lib=self.load_libraries()defload_libraries(self):#Import......
  • scrapy—图片解析(图片懒加载)
    笔记-图片数据爬取之ImagesPipeline-基于scrapy爬取字符串类型的数据和爬取图片类型的数据区别?-字符串:只需要基于xpth进行解析且提交管道进行持久化存储-图片:xpath解析出图片src属性值。单独的对图片地址发起请求获取图片二进制类型的数据-Imag......
  • 08. 场景加载
    awaitable关键字本节涉及到场景的加载和卸载,在勇士传说中,我们使用协程的方式来加载和卸载场景,在本节使用了unity2023.3最新的特性awaitableawaitable具体是啥,我也不太清楚,见下图加载场景在上一节中,我们监听了LoadRoomEvent事件,成功调用了SceneLoadManager.OnLoadRoom......