`

【Java核心-进阶】类加载

    博客分类:
  • Java
 
阅读更多

Java类加载的三个阶段

Loading, Linking, and Initializing

 

加载(Loading)

将Java字节码数据读取到JVM中,并映射为 Class 对象。
数据源可以是 jar文件、class文件或网络数据源。
 

用户可以实现自己的类加载器来自定义加载过程。

 

链接(Linking)

把原始的类定义信息平滑地转化入JVM。
分为三个子步骤:

验证(Verification)

这是JVM安全的重要保障。
JVM会核验字节信息是否符合 Java 虚拟机规范,防止恶意信息或不合规的信息危害JVM运行。
验证阶段可能会触发更多 class 的加载。

 

准备(Preparation)

创建类或接口中的静态变量,并初始化静态变量的初始值。
此步骤侧重于分配内存空间,不会去执行更进一步的JVM指令;与后续的“初始化”不同。

 

解析(Resolution)

将常量池中的 符号引用(Symbolic Reference)替换为直接引用。

 

初始化(Initialization)

真正执行类初始化的代码逻辑,包括 对静态字段进行赋值、执行静态代码块。
这些代码逻辑事先由编译器在编译阶段整理好。父类型的初始化 优先于 当前类型。

Parent Delegation Model(“双亲委派模型”)

其实翻译为“双亲”很容易误导中文读者。(在学习“树”的数据结构时,我们会把“parent node”翻译为“父节点”)
 

此处的委派模型指:当一个ClassLoader需要加载一个类时,会尝试将该任务委托给它的 父ClassLoader,除非父ClassLoader找不到目标资源。
目的:这种委派模型的目的是为了避免重复加载Java类型
这体现了类加载机制的“可见性”和“单一性”。
可见性:子ClassLoader可见到父ClassLoader加载的类型(反之不能)。
单一性:子ClassLoader不会加载父ClassLoader已经加载过的类型。
但是“邻居”ClassLoader之间,同一类型仍然可以被加载多次;因为它们互相不可见。

 

Java 8 及以前的 类加载器


 

三个内建的 类加载器

Bootstrap Class-Loader(启动类加载器)

加载 jre/lib 目录下的 jar包。如,rt.jar。

 

Extension Class-Loader(扩展类加载器)

加载 jre/lib/ext 目录下的 jar包。

 

Application Class-Loader(应用类加载器)

加载 classpath 下的资源

 

Java 9 的类加载器

Jigsaw 项目为 Java 9 引入了 Java平台模块化系统(JPMS)。Java SE的源码被划分为一系列模块,类加载器也发生了非常大的变化。
如,扩展类加载器被重命名为“平台类加载器”(Platform Class-Loader);rt.jar 被移除,JDK核心类库被存储在 jimage 文件中。
新增的 Layer 抽象可以更方便地实现类似容器的逻辑。
 

内建类的加载器都在 BootLayer 中;
其它Layer内部有自定义的类加载器;
不同版本模块可以同时工作在不同的 Layer中。



 

 

自定义类加载器

使用场景

绝大多数应用都不需要实现自定义的类加载器。一般在以下场景中会用到自定义类加载器:

  • 实现“进程内隔离”
    类加载器作用于不同的命名空间,它可以提供类似 容器/模块化 的效果。
    如,两个模块分别依赖于某个类库的不同版本,让这两个模块分别被不同的“容器”加载就可以互不干扰。
    Java EEOSGIJPMS 等框架都有这种机制

  • 从不同的数据源获取类定义信息
    如,应用需要从网络数据源获取类信息,而不是本地文件系统

  • 需要自己操作字节码,动态修改或生成类型

 

实现方式

大致步骤:

  1. 通过指定的名称,找到其二进制实现(字节码),或修改/生成字节码。自定义类加载器一般就是在这做“定制”
  2. 创建 Class 对象,并完成类加载过程。通过  ClassLoader.defineClass 方法将二进制信息转换为 Class 对象。

扩展:《Class Loaders in Java

加快java类信息加载的技术

Java类的加载、解释、编译都需要时间,这会明显导致Java应用启动变慢。
类加载器获得的类信息是字节码,它与平台无关,具体用于执行时还需要解释/编译。

AOT(Ahead-of-Time Compilation)

这项技术是提前把Java Class提前编译为本地代码(native code),以加速Java应用的启动时间。
目前还只是试验性的特性,局限性比较大。

 

AppCDS(Application Class-Data Sharing)

这项技术可以将Java Class信息存储在文件系统中,作为 Shared Archive。
JVM会通过内存映射技术映射到相应的地址空间,免除类加载、解析等开销,加速启动,同时也可以减少内存占用(footprint)。
 

局限性:如果存在大量运行时动态类加载,此技术的帮助会很有限

 

  • 大小: 55.9 KB
  • 大小: 57.3 KB
分享到:
评论

相关推荐

    Java语言程序设计-进阶篇(原书第8版)

    在Java的世界里,进阶学习主要包括以下几个核心领域: 1. **多线程编程**:Java是并发编程的强大平台,书中会详细介绍Thread类和Runnable接口,如何创建并管理线程,以及如何使用同步机制(如synchronized关键字、...

    Java 语言程序设计-进阶篇(原书第10版).pdf

    《Java 语言程序设计-进阶篇》是学习Java编程的高级教程,源自原书第10版,针对已经掌握了Java基础知识的读者,深入探讨了Java的高级特性和技术。这本书涵盖了多个关键知识点,旨在帮助开发者提升Java编程技能,...

    Java语言程序设计-进阶篇%28原书第8版

    3. **集合框架**:Java集合框架是Java库的核心部分,涵盖了List、Set、Map等接口及其实现类,如ArrayList、HashSet、HashMap等。进阶学习会涉及这些集合的高级用法,如泛型、并发容器以及Stream API的使用。 4. **...

    [Java语言程序设计-进阶篇(原书第8版)]

    在Java的世界里,进阶篇通常会涵盖以下几个核心知识点: 1. **多线程**:Java以其强大的多线程支持而闻名。书中会详细讲解如何创建和管理线程,包括同步机制(如synchronized关键字、wait/notify、Lock接口)、...

    java程序设计进阶版

    在Java编程领域,进阶学习通常涉及以下几个核心知识点: 1. **多线程**:Java作为并发编程的强大工具,深入理解线程的创建、同步和通信至关重要。包括Thread类、Runnable接口的使用,以及synchronized关键字、wait/...

    Java-JUC-多线程 进阶

    Java-JUC-多线程进阶resources是 Java 并发编程的高级课程,涵盖了 Java 中的并发编程概念、线程安全、锁机制、集合类、线程池、函数式接口、Stream流式计算等多个方面。 什么是JUC JUC(Java Utilities for ...

    Java进阶-JDBC(八).zip

    1. **Driver Manager**:Java中的`java.sql.DriverManager`是JDBC的核心组件之一,负责管理数据库驱动程序,加载并注册数据库驱动,以及建立到数据库的连接。 2. **Connection**:连接是与数据库交互的起点,通过`...

    mysql-connector-java-5.1.25-bin.jar

    一种常见的方式是将jar文件放置在项目的类路径(classpath)下,这样编译和运行时,Java虚拟机就能够找到并加载所需的类。另一种方法是在Maven或Gradle等构建工具的配置文件中添加依赖,这样在构建过程中,库会被...

    java2轻松进阶

    10. **Java虚拟机(JVM)**:理解JVM的工作原理,包括类加载、内存管理和垃圾回收,这对优化程序性能有极大帮助。 这本书籍的“轻松进阶”定位意味着它可能采用了易于理解的语言和实例,帮助读者在愉快的学习过程中...

    Java程序设计语言进阶篇(原书第8版)

    同时,理解JVM(Java虚拟机)的工作原理,如类加载机制和字节码执行,对于编写高效的Java代码至关重要。 文件I/O和网络编程也是本书的重要内容。Java提供丰富的API来处理文件操作,包括读写、流和NIO框架。网络编程...

    JAVA架构师进阶之路核心知识整理.pdf

    在Java架构师进阶之路上,需要掌握的核心知识点涵盖了编程基础、集合框架、JVM原理、并发编程、框架原理、微服务架构、网络编程以及分布式系统等多个方面。以下是详细的知识点概述: ### 基础知识 Java基础是架构师...

    Java进阶编程(经典网帖合集)

    在Java进阶编程的学习过程中,我们经常会遇到一系列深入...以上这些知识点构成了Java进阶编程的核心内容,通过深入学习和实践,可以提升程序员在Java开发领域的专业素养,为解决复杂问题和构建高质量应用打下坚实基础。

    Java八股文.zip

    2. **类与对象**:面向对象是Java的核心特性,包括类的定义、对象的创建、封装、继承、多态等概念。深入理解类的构造器、访问修饰符、静态成员、final关键字,以及抽象类和接口的运用,都是面试中常问的话题。 3. *...

    Java进阶.zip

    理解JVM的工作原理,如类加载机制、字节码执行、类的生命周期,以及如何通过JMX进行监控和管理,对于性能优化和问题排查非常有帮助。 8. **模块化系统(Java 9+)**: 从Java 9开始引入的模块系统(Project ...

    java-面试题合集,基础,进阶

    综上所述,Java面试中关于JVM的基础和进阶知识点涵盖了从JVM配置、类加载机制、内存管理到垃圾回收等多个方面。深入理解这些内容不仅有助于提高面试成功率,也能更好地应对实际开发中的性能调优等问题。

    JAVA进阶资料 进阶资料

    5. **JVM执行子系统.pdf**:JVM的执行子系统负责解释和编译Java字节码,理解其工作原理对于解决类加载、异常处理和线程调度等问题非常有帮助。文件将深入解析这部分内容。 6. **Tomcat面试专题及答案.pdf**:Tomcat...

    JAVA项目---个人博客

    总的来说,这个"JAVA项目---个人博客"是一个综合性的学习资源,涵盖了Web开发的基础和进阶知识,包括服务器端编程(JSP和Servlet)、前端交互(JavaScript)、页面组件复用(iframe)以及安全性措施(验证码)。...

    Java基础加强-个人总结doc

    6. **类加载器(Class Loader)**:类加载器是Java虚拟机的一部分,负责将类的.class文件加载到JVM中。理解类加载器的工作原理,包括双亲委派模型,对于理解类的生命周期和解决类冲突问题非常重要。 7. **动态连接...

    Java 面试资料 进阶版

    ### Java面试资料进阶版知识点解析 #### 一、Redis高级特性详解 ##### 1. 缓存穿透 - **定义**: 当用户查询某个数据时,Redis中不存在该数据,MySQL中同样不存在,这种情况下的查询被称为缓存穿透。 - **危害**: ...

Global site tag (gtag.js) - Google Analytics