继续jvm的学习,昨天学习了根据十六进制的class文件分析还原类结构,今天学习类加载的过程
一、类加载的过程
1、加载(类加载过程中的其中一个过程)
(1)通过一个类的全限定名来获取定义此类的二进制字节流
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
(3)在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口
虚拟机规范的这三点并不具体,例如通过全限定名才获取字节流,并没有限制获取的方式,在此基础上,可以自定义类加载器,或者从jar、ear、war等格式读取,也可以运行时计算生成,典型的场景就是代理技术,或者还可以由其他文件生成,比如说jsp。
2、验证
验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
大都会完成下面四个阶段的检验过程:文件格式验证、元数据验证、字节码验证、符号引用验证
(1)文件格式验证:验证字节流是否符合Class文件格式的规范,并且能够被当前版本的虚拟机处理。经过这个阶段的验证后,字节流才会进入内存的方法区中进行存储,所以后面的三个验证阶段全部是基于方法区的存储结构进行的。
(2)元数据验证:对字节码描述的信息进行语义分析,以保证符合java规范,例如检查是否继承了不允许继承的类
(3)字节码验证:进行数据流和控制流分析,对类的方法体进行校验分析,例如子类和父类的类型转换
(4)符号引用验证:对类自身以外的信息进行匹配性的校验,例如引用中的类、字段和方法的访问性是否可被当前类访问
3、准备
准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。
首先,这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在java堆中。其次是这里所说的初始值通常情况下是数据类型的零值。
4、解析
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程
5、初始化
类初始化阶段是类加载过程的最后一步,开始执行类中定义的java程序代码
二、类加载器
虚拟机设计团队把类加载阶段中的通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为类加载器。
1、类与类加载器
类加载器虽然只用于实现类的加载动作,但它在java程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在java虚拟机中的唯一性。比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使他们来源于同一个class文件,只要他们的类加载器不同,那这两个类就必定不相等。
2、双亲委派模型
站在虚拟机的角度讲,只存在两种不同的类加载器:一种是启动类加载器,这个类加载器使用C++语言实现,是虚拟机滋生的一部分;另外一种就是所有其他的类加载器,这些类加载器都有java实现,独立于虚拟机之外,并且全部继承自抽象类java.lang.ClassLoader。
类加载器之间的关系是启动类加载器--扩展类加载器--应用程序类加载器
工作工程:如果一个类加载器收到了加载类的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父加载器,因此最终的加载请求都会委派到顶层的启动类加载器中,只有当父加载器反馈自己无法加载这个类时,子加载器才回去尝试自己加载。
双亲委派模型的好处是java类随着它的类加载器一起具备了一种带优先级的层次关系。例如java.lang.Object类,他存放在rt.jar中,无论哪个类加载器要加载这个类,最终都委派给启动类加载器加载,所以Object在程序各种类加载环境中都是同一个类,保证了java类型体系中最基础的行为。
分享到:
相关推荐
### JVM学习笔记(一) #### 一、JVM概述与工具使用 JVM(Java Virtual Machine)是Java语言的核心组成部分之一,它为Java程序提供了一个跨平台的运行环境。本篇学习笔记主要介绍如何利用一系列工具来查看和监控JVM...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。在深入探讨JVM之前,我们先要理解Java编程语言的...通过学习和实践,我们可以更好地理解和优化JVM,提升Java应用的整体性能。
对于第4以上的本地变量将使用iload命令这种形式,在它后面给一参数,以表示是对第几个(从0开始)本类型的本地变量进行操作。 本资源提供了JVM指令的详细手册,涵盖了各种系列命令的作用和用法,可以帮助开发者更好地...
- `src.zip`:包含了源代码,允许开发者查看和分析SAP JVM的实现细节,便于调试和学习。 - `bin`:包含了可执行文件和脚本,用户可以直接运行这些文件启动JVM。 - `include`:包含了头文件,供C/C++程序链接到...
第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)算法 第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集器 1.3Parallel Scavenge收集器 1.4Parallel Old收集器 1.5CMS...
这本书的第二版更是加入了更多最新的JVM特性,使得学习内容更加全面且贴近实际。配套的源代码提供了丰富的实践机会,让理论知识与实战结合,使学习更加有效。 首先,我们要了解JVM(Java Virtual Machine)是Java...
- **THIRDPARTYLICENSEREADME.txt**:列出SAP JVM可能依赖的第三方库及其许可信息,对于合规使用软件非常重要。 - **buildinfo.txt**:提供了关于SAP JVM构建过程的详细信息,如版本、编译日期和构建参数等。 - *...
第四章:类加载与字节码技术 1. 类文件结构 2. 字节码指令 3. 编译期处理 4. 类加载阶段 5. 类加载器 6. 运行期优化 第五章:内存模型 1. Java 内存模型 2. 可见性 3. 有序性 4. CAS 与原子类 5. synchronized 优化
《JVM高级特性与最佳实践(第2版)》是一本深入探讨Java虚拟机(JVM)技术的书籍,其源代码提供了丰富的实践案例和示例,帮助读者更直观地理解JVM的工作原理和优化技巧。以下是根据书名和描述所涉及的一些关键知识点...
6. 可扩展性:JVM提供了强大的扩展能力,Java类库和第三方库可以提供各种功能来增强JVM的性能和特性。例如,通过Java Native Interface(JNI)技术,可以调用本地(非Java)代码来扩展JVM的功能。 而在Java特性方面...
4. **第4章:JVM字节码与指令集** - 这一章深入讲解字节码指令,包括如何阅读和理解字节码,以及它们在程序执行中的作用。源代码可能包含对特定字节码指令的实例分析。 5. **第7章:性能调优工具** - 讲解如...
1. **早期阶段**:1995年,Sun Microsystems发布了Java的第一个版本,JVM作为其核心组成部分,主要应用于嵌入式设备和网络应用。初代JVM性能较低,但具备“一次编写,到处运行”的跨平台特性。 2. **HotSpot VM**:...
这份笔记由咕泡学院的第4期训练营编撰,共计55页,采用图文并茂的方式,便于读者理解和掌握。 在Java编程中,JVM起着至关重要的作用,它是Java程序运行的平台,负责执行字节码,实现了跨平台的“一次编写,到处运行...
《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》是一本针对Java开发者深入解析JVM机制的权威指南。本书主要涵盖了Java虚拟机的高级特性及其最佳实践,旨在帮助开发者优化程序性能,提升系统稳定性。在...
《JVM高级特性与最佳实践(第2版)》是一本深入探讨Java虚拟机的专著,涵盖了JVM的重要概念、特性和优化策略。这本书旨在帮助开发者理解和掌握JVM的工作原理,从而提升Java应用程序的性能和稳定性。源码的提供则使得...
《JAVA8虚拟机(jvm)规范_Chinese version》提供了关于JVM的详细中文指南,对于理解Java程序的运行机制、优化性能以及深入学习Java技术体系至关重要。下面我们将探讨一些重要的JVM知识点: 1. **内存模型**:JVM内存...
OpenJDK 8u60 是 OpenJDK 项目的第 60 个更新版本,它是 Java Development Kit(JDK)的一个开源实现。OpenJDK 是由 Sun Microsystems 开始的项目,后来被甲骨文公司接手,并且遵循 GPL2 许可协议,允许开发者自由地...
例如,`aload_0` 指令加载局部变量表中的第一个引用值到操作数栈,`iconst_1` 则将整数1压入操作数栈。 3. **操作数栈**:JVM在执行指令时使用操作数栈来存储中间结果和数据。大部分指令会从栈中弹出值,执行操作,...
#### 二、学习资源推荐 1. **开源项目启动脚本**:参考成熟的开源项目如ElasticSearch和Cassandra的启动脚本可以获取一些实用的JVM参数设置。例如,ElasticSearch和Cassandra在启动脚本中对JVM参数进行了细致的配置...