• JVM的类装载子系统


      在JAVA虚拟机中,负责查找并装载类型的那部分被称为类装载子系统。

      JAVA虚拟机有两种类装载器:启动类装载器和用户自定义类装载器。前者是JAVA虚拟机实现的一部分,后者则是Java程序的一部分。由不同的类装载器装载的类将被放在虚拟机内部的不同命名空间中。

      类装载器子系统涉及Java虚拟机的其他几个组成部分,以及几个来自java.lang库的类。比如,用户自定义的类装载器是普通的Java对象,它的类必须派生自java.lang.ClassLoader类。ClassLoader中定义的方法为程序提供了访问类装载器机制的接口。此外,对于每一个被装载的类型,JAVA虚拟机都会为它创建一个java.lang.Class类的实例来代表该类型。和所有其他对象一样,用户自定义的类装载器以及Class类的实例都放在内存中的堆区,而装载的类型信息则都位于方法区

      类装载器子系统除了要定位和导入二进制class文件外,还必须负责验证被导入类的正确性,为类变量分配并初始化内存,以及帮助解析符号引用。这些动作必须严格按以下顺序进行:

      (1)装载——查找并装载类型的二进制数据。

      (2)连接——指向验证、准备、以及解析(可选)。

        ● 验证  确保被导入类型的正确性。(java可以自定义安全策略等)

        ● 准备  为类变量分配内存,并将其初始化为默认值。(这里的准备和下面的初始化的顺序问题体现在java初始化中值变化的各种陷阱)

        ● 解析  把类型中的符号引用转换为直接引用。

      (3)初始化——把类变量初始化为正确初始值。(准备的时候设为默认值,此时才会正式给变量赋值)

      每个JAVA虚拟机实现都必须有一个启动类装载器,它知道怎么装载受信任的类

      每个类装载器都有自己的命名空间,其中维护着由它装载的类型。所以一个Java程序可以多次装载具有同一个全限定名的多个类型。这样一个类型的全限定名就不足以确定在一个Java虚拟机中的唯一性。因此,当多个类装载器都装载了同名的类型时,为了惟一地标识该类型,还要在类型名称前加上装载该类型(指出它所位于的命名空间)的类装载器标识。

  • 相关阅读:
    Largest Rectangle in Histogram
    Vertica环境安装R-Lang包提示缺少libgfortran.so.1
    Sybase数据库收集表及其索引的统计信息
    Linux 内存管理
    ORA-01439: 要更改数据类型, 则要修改的列必须为空
    MySQL ibdata1文件迁移
    exp/imp 参数说明,中英对照
    expdp/impdp 参数说明,中英对照
    Oracle ASM diskgroup在主机重启后启动失败
    Linux NFS 服务部署
  • 原文地址:https://www.cnblogs.com/wade-luffy/p/5813683.html
Copyright © 2020-2023  润新知