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虚拟机中的唯一性。因此,当多个类装载器都装载了同名的类型时,为了惟一地标识该类型,还要在类型名称前加上装载该类型(指出它所位于的命名空间)的类装载器标识。

时间: 2024-08-07 00:16:00

JVM的类装载子系统的相关文章

Java类装载过程

类装载过程由JVM类装载子系统负责,主要包括一下三个步骤: 1)装载:查找并装载类型的二进制数据到虚拟机中 1.通过某些途径,产生一个代表该类型的二进制数据流 2.解析二进制数据流为方法区的内部数据结构 3.在堆中创建一个表示该类型的Class实例(装载步骤的最终产品) 注意:Java虚拟机规范允许类装载器缓存Java类型的二进制表现形式,如果预装载出错,则要等待该类被主动使用时抛出LinkageError的子类的异常 2)连接: 1.验证 确保导入的类格式正确 检查final类不能有子类,fi

Java虚拟机类装载的原理及实现(转)

Java虚拟机类装载的原理及实现(转) 一.引言 Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程.JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块, 而不影响系统其他功能模块的正常运行.本文将分析JVM中的类装载系统,探讨JVM中类装载的原理.实现以及应用. 二.Java虚拟机的类装载实现与应用 2.1 装载过程简介 所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的c

jvm的类加载器,类装载过程

混沌初开,在一片名为jvm的世界中,到处都是一片虚无,直到一个名为BootstrapClassLoader的巨人劈开了世界,据说它是由名叫C++的女神所造,它从一个叫做jre/lib的宝袋中拿出一把开天之斧ExtensionClassLoader,以及其他各种各样五颜六色的宝物,这些宝物撒落在混沌世界中,化作了山山水水.紧接着,巨人又使用ExtensionClassLoader这把巨斧劈开了一个叫做jre/lib/ext的巨峰,那里瞬间迸发出了五颜六色的彩芒,彩芒四溅而去,让这个灰色的世界不再那

ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗

1.ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗? :当然是运行期间啊,我自己有个理解误区,改正后如下:编译期间编译器是不去加载类的,只负责编译而已,去rt.jar拿数据干嘛,不依然是class文件,jvm是只要是class文件就能运行. 2.类加载ClassLoader,各个类加载器执行顺序是什么? :永远是自己写的加载器先去加载,记住并不是真正的加载,而是双亲委派机制,每个加载器都不真正去加载,而是去让父加载器去加载,想一下,自然界亦是如

JVM查找类文件的顺序(转)

配置classpath 根据path环境变量的原理,可以定义一个名为classpath环境变量,将要运行的class文件所在目录定义在该变量中. 例:set classpath=c:\ classpath变量值是java类文件的目录 path变量是windows程序文件的目录 JVM查找类文件的顺序: 如果没有配置classpath环境变量,JVM只在当前目录下查找要运行的类文件. 如果配置了classpath环境,JVM会先在classpath环境变量值的目录中查找要运行的类文件. 值的结尾处

Java中的类装载和初始化模块

在Java中,初始化模块是指用一对"{}"括起来的代码,可以与构造方法一起来对对象进行初始化.初始化模块又分为实例初始化模块和静态初始化模块(只能由类的静态成员引用,在类装载时进行调用) Java中,代码的执行顺序是: 1.装入类     1.1递归装入父类,直到继承链上的父类全部装入为止.     1.2类装入内存之后,静态数据域和静态初始块按照在类中出现的顺序进行执行. 2.调用类的构造方法     2.1递归调用父类的构造方法,直到父类为java.lang.Object为止.  

jvm类装载机制

1.Class.forName("org.whatisjava.reflect.Foo")首先会将reflection.Foo类装入JVM,并 返回与之关联的Class对象.JVM装入Foo类后对其进行初始化,调用了其static块中的代码. 2.类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性.. 一.简单过程 Java程序运

【转】JVM类装载机制的解析,热更新的探讨(二)

同样,一个Class对象必须知道自己的超类.超级接口.因此,Class对象会引用自己的超类和超级接口的Class对象.这种引用一定是实例引用.(实际上,超类.超级接口的引用也存储在常量池中,但为了区分依赖类的引用,将它特殊表述一下.) 因此,我暂且得到两条结论. 结论一:持有一个Class对象的引用,则任何该Class对象直接或间接依赖的所有类(如果被加载了),都不可能被卸载.同样,只要有一个类直接或间接依赖某个类,则该类不可能被卸载. 结论二:持有一个Class对象的引用,则该类的所有超类.超

类装载机制的类的初始化顺序

1.通过子类来调用父类的静态字段,只会触发父类的初始化,但是这是要看不同的虚拟机的不同实现. 2.每个开发人员对Java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载. 3.对JVM采用的双亲委派类加载机制 4.Java的连接模型允许用户运行时扩展引用程序 你的程序可以装载在编译时并不知道或者尚未存在的类或者接口,并动态连接它们并进行有选择的解析. 运行时动态扩展java应用程序有如下两个途径: 5. 3.1 调用java