类加载器子系统
类加载器子系统指jvm系统中负责查找和加载类型的子系统。jvm有两种类加载器:启动类加载器和用户定义类加载器。
前者是jvm实现的一部分,后者是java应用的一部分。由不同的类加载器加载的类被放在了jvm的不同名字空间中。
类加载器子系统包括了jvm的其他几个部分,利用了java.lang库中的几个类。例如,用户定义类加载器继承了类java.lang.ClassLoader。ClassLoader的方法为应用提供了访问jvm类加载器子系统的接口。另外,对每个加载上来的类,类加载器都会创建一个java.lang.Class的实例来描述这个类。象其他所有对象一样用户定义类加载器和Class的实例也放在堆中。加载的类型信息放在方法区。
加载,链接 和初始化
类加载器子系统除了定位和加载二进制类文件外,还必须保证类文件的正确性,为类变量分配内存并初始化和帮助对符号引用的解析。这些行为严格遵照以下的顺序:
加载:包括定位和加载某类型的二进制数据
链接:包括进行验证,准备和解析(可选)
a 验证:确信引入类型的正确性
b 准备:为类变量分配内存并初始化
c 解析:将符号引用改为直接引用
初始化:激活类变量的初始化java代码
启动类加载器
jvm必须能够识别和加载放在符合类文件格式的二进制文件中的类和接口.除了类文件,jvm实现也可以识别其他文件。
启动类加载器对每个jvm实现都是必须的,它知道如何加载包括java api的可信类。jvm规范并没有定义启动类如何定位类文件,这个将由jvm实现者自行掌握。
启动类加载器必须能够根据一个完整的有效的类型名称产生这个类型的定义数据。在Windows98平台上采用Sun's 1.1 jdk的jvm实现提供了一个常用的方法。启动类加载器通过对定义在环境变量classpath中的所有路径进行搜寻,直到找到了这个类定义文件,类定义文件的名称是类名加".class"。通常一个类都有一个所属包,启动类加载器会到相应的子目录下去找,例如一个叫做java.lang.Object的类,启动类加载器会在所有定义在CLASSPATH的路径中的java\lang目录下找一个叫做Object.class的类,直到找到。
在1.2的版本中,启动类加载器只在系统类的安装目录中查找,而不是所有定义在classpath的目录。这个任务交给了
系统类加载器,系统类加载器是一个用户定义的类加载器,它在jvm启动时就被自动创建。
用户定义的类加载器
尽管用户定义类加载器本事是属于java应用的,但可以通过它的四个函数与jvm交互。
// 在类java.lang.ClassLoader中声明的四个函数:
protected final Class defineClass(
String name,
byte data[],
int offset,
int length);
protected final Class defineClass(
String name,
byte data[],
int offset,
int length,
ProtectionDomain protectionDomain);
protected final Class findSystemClass(String name);
protected final void resolveClass(Class c);
任何jvm的实现都必须把这四个函数连到内部的类加载器子系统。两个defineClass()方法都有一个类型为字节数组名称为
data[]的输入参数,defineClass()希望data[offset]到data[offset +length]中的数据是一个合法的类型数据,这个新类型将会被放到指定的保护区中,如果是第一个defineClass方法则会放到缺省保护区中,每个jvm实现必须保defineClass能够把新类型放到方法区中。findSystemClass()方法以一个类型名为参数。在1.0和1.1版本,这个方法会通过启动类加载器加载这个类型。假如类加载器已经加载了这个类型,它就会返回描述这个类型的Class对象。如果没有找到,就会抛出一个ClassNotFoundException.在1.2版本,findSystemClass()方法通过系统类加载器来加载这个类型。不管通过那个类加载器,其对外的行为是被规范的。resolveClass()方法接收一个对Class对象的引用。它对这个
Class对象代表的类型进行链接。
名字空间
每个类加载器都有自己的名字空间,所以一个java应用可以对同一个类型加载多次。这样一个类型的完整的有效名称并不足以确定在jvm中的唯一性。当有多个类加载器都加载了同一个类型,为了唯一确定类型还要在类型名称前加上类加载器的名字。
除了加载类型的数据外,jvm还要记录类型的加载器。当jvm解析一个类到另一个类的符号引用时,jvm会保证被引用类的类加载器与引用类的类加载器相同。
分享到:
相关推荐
2. **类加载器及类加载器的委托机制**:JVM中有三种内置的类加载器,分别是启动类加载器、扩展类加载器和应用类加载器。此外,还可以自定义类加载器。类加载器之间遵循委托机制,即下级类加载器先请求上级类加载器...
2. 安全性问题:如果允许用户自定义类加载器任意加载代码,可能会破坏系统的安全策略,因为类加载器可以加载不受限制的代码。 3. 单例模式的实现:在多线程环境中,如果每个线程都有自己的类加载器,可能导致单例...
例如,当我们尝试加载 `java.lang.Object` 类时,首先会由启动类加载器加载,如果它找不到,会继续交给扩展类加载器,接着是系统类加载器,最后才会由用户自定义的类加载器尝试加载。 1.3 类加载双亲委派示例 为了...
Java代码执行流程是JVM的核心流程之一,它首先通过编译器把Java代码转换成字节码,然后通过类加载器加载到内存中,并将其放在运行时数据区的方法区内。最后,执行引擎将字节码翻译成底层系统指令,再交由CPU去执行。
本部分我们将深入探讨JVM中的类加载器,特别是根类加载器、扩展类加载器和系统类加载器。 首先,让我们了解类加载的基本过程。当JVM启动时,会触发类加载。这个过程分为三个阶段:加载、链接和初始化。加载阶段,类...
JVM类加载器 test
类加载器是JVM实现动态加载的核心组件,它的主要任务是根据类名找到对应的.class文件,并将其转换为内存中的Class对象。Java中的类加载器主要有以下几种: 1. Bootstrap ClassLoader:引导类加载器,负责加载JRE...
JVM类加载跟踪器,用于排查jar包冲突、类冲突、类版本冲突、NoClassDefFoundError、ClassNotFoundException 等等类加载相关问题的辅助工具
在Java世界中,类加载器(ClassLoader)是关键组件,它们负责将类的字节码加载到Java虚拟机(JVM)中。JVM、OSGI(Open Service Gateway Initiative)和Tomcat等容器都涉及到了类加载器的概念,理解它们的工作原理对...
Java虚拟机(JVM)的类加载器子系统是Java运行时环境的一个重要组成部分,它负责将.class文件加载到内存中,并生成对应的Java类对象。这一过程涵盖了从文件系统或网络获取.class文件、验证类文件的正确性、准备类...
- **直接引用**: 当一个类直接引用另一个类时(例如,类A引用类B),JVM会使用加载类A的类加载器来加载类B。 - **反射调用**: 使用`Class.forName()`方法也会触发类的加载。 - **初始化**: 当类的静态块或静态成员被...
在Java中,类加载器(Class Loader)是一项核心机制,用于将字节码(.class文件)加载到JVM中,使其成为运行时的对象。类加载器不仅实现了类的加载功能,还确保了Java程序在多线程环境中的安全性和隔离性。类加载器...
这些内置的类加载器加载的类在JVM生命周期中不会被卸载。而用户自定义的类加载器加载的类,当它们的`Class`对象不再被引用时,可能会被卸载,以节省内存资源。 了解类加载机制对于优化性能、理解和解决类加载相关...
JVM使用类加载器(ClassLoader)来完成这一任务。在Java中,每个类都由一个对应的ClassLoader实例负责加载。默认的类加载器包括Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader(扩展类加载器)和...
Java类加载器是JVM的重要组成部分之一,它负责查找并加载类文件到JVM的内存空间中。Java程序的运行依赖于类加载器将`.class`文件加载到JVM中,并对其进行验证、准备和解析等步骤,最终使类能够在JVM中执行。 #### ...
Java中的类加载器是JVM(Java虚拟机)的核心组件之一,它们负责将.java源代码编译成的.class字节码文件加载到JVM中,从而使得程序能够运行。类加载器不仅涉及到程序的正常执行,还与Java的动态加载、模块化系统以及...
当一个类加载请求到来时,除非已经加载过该类,否则JVM会委托父类加载器去尝试加载,只有当父类加载器无法加载时,才会尝试用自己的加载器进行加载。这样可以防止不同加载器加载相同的类造成的问题,保持类加载的...
在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及解决实际开发中的问题至关重要。 **1.1 类加载器分类** 类加载器可以...
2. 主要的类加载器: - 引导(Bootstrap)类加载器:这是最基础的类加载器,由本地代码实现,负责加载JRE的基础类库,如rt.jar,它不直接暴露给开发者。 - 扩展(Extension)类加载器:由ExtClassLoader实现,加载...