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中。
自定义类加载器
使用场景
绝大多数应用都不需要实现自定义的类加载器。一般在以下场景中会用到自定义类加载器:
实现方式
大致步骤:
- 通过指定的名称,找到其二进制实现(字节码),或修改/生成字节码。自定义类加载器一般就是在这做“定制”
- 创建 Class 对象,并完成类加载过程。通过 ClassLoader.defineClass 方法将二进制信息转换为 Class 对象。
加快java类信息加载的技术
Java类的加载、解释、编译都需要时间,这会明显导致Java应用启动变慢。
类加载器获得的类信息是字节码,它与平台无关,具体用于执行时还需要解释/编译。
AOT(Ahead-of-Time Compilation)
这项技术是提前把Java Class提前编译为本地代码(native code),以加速Java应用的启动时间。
目前还只是试验性的特性,局限性比较大。
AppCDS(Application Class-Data Sharing)
这项技术可以将Java Class信息存储在文件系统中,作为 Shared Archive。
JVM会通过内存映射技术映射到相应的地址空间,免除类加载、解析等开销,加速启动,同时也可以减少内存占用(footprint)。
局限性:如果存在大量运行时动态类加载,此技术的帮助会很有限
相关推荐
在Java的世界里,进阶学习主要包括以下几个核心领域: 1. **多线程编程**:Java是并发编程的强大平台,书中会详细介绍Thread类和Runnable接口,如何创建并管理线程,以及如何使用同步机制(如synchronized关键字、...
《Java 语言程序设计-进阶篇》是学习Java编程的高级教程,源自原书第10版,针对已经掌握了Java基础知识的读者,深入探讨了Java的高级特性和技术。这本书涵盖了多个关键知识点,旨在帮助开发者提升Java编程技能,...
3. **集合框架**:Java集合框架是Java库的核心部分,涵盖了List、Set、Map等接口及其实现类,如ArrayList、HashSet、HashMap等。进阶学习会涉及这些集合的高级用法,如泛型、并发容器以及Stream API的使用。 4. **...
在Java的世界里,进阶篇通常会涵盖以下几个核心知识点: 1. **多线程**:Java以其强大的多线程支持而闻名。书中会详细讲解如何创建和管理线程,包括同步机制(如synchronized关键字、wait/notify、Lock接口)、...
在Java编程领域,进阶学习通常涉及以下几个核心知识点: 1. **多线程**:Java作为并发编程的强大工具,深入理解线程的创建、同步和通信至关重要。包括Thread类、Runnable接口的使用,以及synchronized关键字、wait/...
Java-JUC-多线程进阶resources是 Java 并发编程的高级课程,涵盖了 Java 中的并发编程概念、线程安全、锁机制、集合类、线程池、函数式接口、Stream流式计算等多个方面。 什么是JUC JUC(Java Utilities for ...
1. **Driver Manager**:Java中的`java.sql.DriverManager`是JDBC的核心组件之一,负责管理数据库驱动程序,加载并注册数据库驱动,以及建立到数据库的连接。 2. **Connection**:连接是与数据库交互的起点,通过`...
一种常见的方式是将jar文件放置在项目的类路径(classpath)下,这样编译和运行时,Java虚拟机就能够找到并加载所需的类。另一种方法是在Maven或Gradle等构建工具的配置文件中添加依赖,这样在构建过程中,库会被...
10. **Java虚拟机(JVM)**:理解JVM的工作原理,包括类加载、内存管理和垃圾回收,这对优化程序性能有极大帮助。 这本书籍的“轻松进阶”定位意味着它可能采用了易于理解的语言和实例,帮助读者在愉快的学习过程中...
同时,理解JVM(Java虚拟机)的工作原理,如类加载机制和字节码执行,对于编写高效的Java代码至关重要。 文件I/O和网络编程也是本书的重要内容。Java提供丰富的API来处理文件操作,包括读写、流和NIO框架。网络编程...
在Java架构师进阶之路上,需要掌握的核心知识点涵盖了编程基础、集合框架、JVM原理、并发编程、框架原理、微服务架构、网络编程以及分布式系统等多个方面。以下是详细的知识点概述: ### 基础知识 Java基础是架构师...
在Java进阶编程的学习过程中,我们经常会遇到一系列深入...以上这些知识点构成了Java进阶编程的核心内容,通过深入学习和实践,可以提升程序员在Java开发领域的专业素养,为解决复杂问题和构建高质量应用打下坚实基础。
2. **类与对象**:面向对象是Java的核心特性,包括类的定义、对象的创建、封装、继承、多态等概念。深入理解类的构造器、访问修饰符、静态成员、final关键字,以及抽象类和接口的运用,都是面试中常问的话题。 3. *...
理解JVM的工作原理,如类加载机制、字节码执行、类的生命周期,以及如何通过JMX进行监控和管理,对于性能优化和问题排查非常有帮助。 8. **模块化系统(Java 9+)**: 从Java 9开始引入的模块系统(Project ...
综上所述,Java面试中关于JVM的基础和进阶知识点涵盖了从JVM配置、类加载机制、内存管理到垃圾回收等多个方面。深入理解这些内容不仅有助于提高面试成功率,也能更好地应对实际开发中的性能调优等问题。
5. **JVM执行子系统.pdf**:JVM的执行子系统负责解释和编译Java字节码,理解其工作原理对于解决类加载、异常处理和线程调度等问题非常有帮助。文件将深入解析这部分内容。 6. **Tomcat面试专题及答案.pdf**:Tomcat...
总的来说,这个"JAVA项目---个人博客"是一个综合性的学习资源,涵盖了Web开发的基础和进阶知识,包括服务器端编程(JSP和Servlet)、前端交互(JavaScript)、页面组件复用(iframe)以及安全性措施(验证码)。...
6. **类加载器(Class Loader)**:类加载器是Java虚拟机的一部分,负责将类的.class文件加载到JVM中。理解类加载器的工作原理,包括双亲委派模型,对于理解类的生命周期和解决类冲突问题非常重要。 7. **动态连接...
### Java面试资料进阶版知识点解析 #### 一、Redis高级特性详解 ##### 1. 缓存穿透 - **定义**: 当用户查询某个数据时,Redis中不存在该数据,MySQL中同样不存在,这种情况下的查询被称为缓存穿透。 - **危害**: ...