`
yucang52555
  • 浏览: 70033 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

深入java虚拟机——类加载器

阅读更多

    类加载器完全可以说是是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。

    Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节码(.class 文件)。类加载器负责读取 Java 字节码,并转换成java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例。

    首先,我们讲一下类的加载过程。

      JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)。其中链接又分为:验证,准备,解析三个阶段。各个步骤执行操作如下:

      1) 装载:查找并加载类的二进制数据;

      2)链接:

验证:确保被加载类的正确性;

准备:为类的静态变量分配内存,并将其初始化为默认值;

解析:把类中的符号引用转换为直接引用;

      3)初始化:为类的静态变量赋予正确的初始值;

      也需要说明一下,验证这一步存在的必要性。

      如果由编译器生成的class文件,它肯定是符合JVM字节码格式的,但是万一有高手自己写一个class文件,让JVM加载并运行,用于恶意用途,就不妙了,因此这个class文件要先过验证这一关,不符合的话不会让它继续执行的,也是为了安全考虑吧。

 

      接下来,我们看一下类的加载具体操作。

      类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的java.lang.Class对象,用来封装类在方法区类的对象。由此我们可以得出:

    (1)类的加载的最终产品是位于堆区中的Class对象;

    (2)Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

      JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:


 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:

(1)引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader

(2)扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。

(3)系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。

      除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。

      真正完成类的加载工作是通过调用 defineClass来实现的;而启动类的加载过程是通过调用 loadClass来实现的。前者称为一个类的定义加载器(defining loader),后者称为初始加载器(initiating loader)。在 Java 虚拟机判断两个类是否相同的时候,使用的是类的定义加载器。也就是说,哪个类加载器启动类的加载过程并不重要,重要的是最终定义这个类的加载器。两种类加载器的关联之处在于:一个类的定义加载器是它引用的其它类的初始加载器。

      如类 com.example.Outer引用了类com.example.Inner,则由类 com.example.Outer的定义加载器负责启动类 com.example.Inner的加载过程。方法 loadClass()抛出的是 java.lang.ClassNotFoundException异常;方法 defineClass()抛出的是java.lang.NoClassDefFoundError异常。

      类加载器在成功加载某个类之后,会把得到的 java.lang.Class类的实例缓存起来。下次再请求加载该类的时候,类加载器会直接使用缓存的类的实例,而不会尝试再次加载。也就是说,对于一个类加载器实例来说,相同全名的类只加载一次,即 loadClass方法不会被重复调用。

 

程序猿行业技术生活交流群:181287753(指尖天下),欢迎大伙加入交流学习。

  • 大小: 180.7 KB
2
0
分享到:
评论

相关推荐

    实战Java虚拟机——JVM故障诊断与性能优化.pdf

    《实战Java虚拟机——JVM故障诊断与性能优化》是一本深入探讨Java开发中的关键环节——Java虚拟机(JVM)的专著。本书聚焦于实际应用中的问题解决和性能调优,对于Java开发者和系统管理员来说,是提升技术水平的重要...

    深入java虚拟机——applet 演示

    本篇将深入探讨Java虚拟机与Applet的相关知识点。 1. Java虚拟机(JVM) JVM 是Java平台的核心,它的主要职责是执行Java字节码。它包括类装载器、运行时数据区、执行引擎、本地方法接口和本地方法库。JVM 的设计...

    深入java虚拟机(六)——类加载的父亲委托机制1

    《深入Java虚拟机(六)——类加载的父亲委托机制》 在Java编程中,类加载器(ClassLoader)扮演着至关重要的角色,它负责将类的.class文件加载到Java虚拟机(JVM)中,使程序得以运行。从JDK 2.0开始,Java引入了...

    实战Java虚拟机——JVM故障诊断与性能优化

    《实战Java虚拟机——JVM故障诊断与性能优化》是一本深入探讨Java开发人员和运维人员必备技能的书籍。本书作者葛一鸣以其丰富的实战经验,详细阐述了JVM(Java Virtual Machine)的工作原理,以及如何有效地进行故障...

    Java之——类热加载

    传统的Java应用程序在启动时,由JVM(Java虚拟机)通过类加载器将类加载到内存中,一旦加载完成,除非程序退出,否则这些类通常不会被重新加载。然而,在开发过程中,我们可能希望在不重启应用的情况下,对已加载的...

    深入java虚拟机(二)——类的生命周期(上)类的加载和连接1

    【深入Java虚拟机(二)——类的生命周期(上)类的加载和连接】 Java虚拟机(JVM)是Java程序的核心,它负责解释和执行Java字节码。类的生命周期在JVM中是一个关键的概念,它涵盖了从类的加载到卸载的整个过程。...

    深入java虚拟机最新版

    ### 深入Java虚拟机最新版:执行引擎与类加载机制详解 #### 执行引擎:一次探索之旅 Java虚拟机(JVM)的核心组件之一就是执行引擎,它负责将字节码转换为机器指令执行。在《深入Java虚拟机最新版》这本书中,我们...

    实战JAVA虚拟机 JVM故障诊断与性能优化

    2. **类加载机制**:JVM通过类加载器将类文件加载到内存中,分为引导类加载器、扩展类加载器和应用程序类加载器等。理解类加载过程有助于解决类冲突和双亲委托模型等问题。 3. **运行时数据区**:包括程序计数器、...

    深入Java虚拟机 Bill Venners著 2003.09 P461.rar

    《深入Java虚拟机》是Bill Venners的经典之作,该书详细揭示了Java技术的核心——Java虚拟机(JVM)的内在运作机制。在2003年9月出版的这个版本中,作者深入浅出地阐述了JVM的架构和功能,帮助读者理解Java程序的...

    MiniJavaVM—个Java虚拟机的设计和实现

    MiniJavaVM—个Java虚拟机的设计和实现 在本篇文章中,我们将详细介绍 MiniJavaVM 的设计和实现,包括其总体架构、功能、运行环境和开发工具,以及具体的实现步骤。 第一章绪论 Java 虚拟机(Java Virtual ...

    深入java虚拟机第二版

    《深入Java虚拟机第二版》是一本专注于Java技术体系中核心部分——Java虚拟机(JVM)的深度解析书籍。本书全面介绍了JVM的工作原理、内存管理、性能优化以及相关工具的使用,对于理解Java程序的运行机制和提升开发...

    java虚拟机源码-JVMbookSource:实战Java虚拟机———JVM故障诊断与性能优化(第2版)源码.rar

    《实战Java虚拟机——JVM故障诊断与性能优化(第2版)》是Java开发者深入理解JVM工作原理、诊断问题以及进行性能调优的重要参考资料。该书籍的源码提供了丰富的示例和实践案例,帮助读者更好地掌握Java虚拟机的内部...

    深入java虚拟机读后笔记

    Java语言的设计者们为了使Java程序能够跨平台运行,引入了一个概念——Java虚拟机(JVM)。简单来说,Java源代码在编译成`.class`文件后,并不是直接被操作系统执行,而是通过JVM来解释执行这些`.class`文件中的字节...

    深入JAVA虚拟机第二版

    《深入JAVA虚拟机第二版》是一本专注于Java技术体系中核心部分——Java虚拟机(JVM)的权威著作。本书全面、深入地探讨了JVM的工作原理,是Java开发者提升技术水平,理解Java运行机制,优化代码性能的重要参考资料。...

    深入java虚拟机第二版..pdf

    《深入Java虚拟机第二版》是一本专注于Java技术体系中核心部分——Java虚拟机(JVM)的权威著作。这本书全面、深入地探讨了JVM的内部工作机制,为开发者提供了理解并优化Java程序运行性能的宝贵知识。在阅读这本书的...

    30+个视频+深入理解Java虚拟机(jvm优化+内存模型+虚拟机原理)

    JVM通过类加载器将类加载到内存中。类加载过程主要包括加载、验证、准备、解析和初始化五个阶段。其中,类的初始化阶段是执行类构造器`()`的地方,负责对类变量进行初始值设置。 #### 字节码解释与JIT编译 Java程序...

Global site tag (gtag.js) - Google Analytics