类的生命周期:
简介java虚拟机的作用:java虚拟机为java程序提供运行时环境,其中一个重要的任务就是管理类和对象的生命周期,类的生命周期从类被加载、连接和初始化开始,到类被卸载结束。当类处于生命周期时,它的二进制数据位于方法区内,在堆区中还有一个描述该类的Class对象。只有当类处于生命周期中时,java程序才能使用它,比如调用类的静态变量,静态方法和创建类的实例。
java虚拟机加载某个类过程:
1、加载:查找并加载类的二进制数据
2、连接:包括验证、准备和解析类的二进制数据
a、验证:确保加载类的正确性
b、准备:为类的静态变量分配内存并将其初始化为默认值
c、解析:把类的符号应用转换为直接应用
3、初始化:为类的静态变量赋予正确的初始值
加载详解:
类的加载是把类的.class文件中的二进制数据读入到内存中,把它放到运行时数据区的方法区内,然后在堆区创建一个java.lang.class对象,用类封装类在方法区内的数据结构。
类的加载的最终产品时位于运行时数据区内的堆区的class对象。class对象封装了类在方法区内的数据结构,并且向java程序提供了访问类在方法区内的数据结构的接口。
类的加载是由类的加载器完成的,类的加载器分为两种:
一是:java虚拟机自带的加载器,包括启动类加载器、拓展类加载器、系统类加载器。
二是:用户自定义的类的加载器,是java.lang.ClassLoader类的子类的实例,用户可以通过定制它来定制类的加载方式。
类的验证:
当类被加载后,就进入到连接阶段。连接就是把已经读入到内存中的类的二进制数据合并到虚拟机的运行时环境中去。
类的验证包括如下内容:
1、类文件的结构检查:确保类文件遵从java类文件的固定格式
2、语义检查:确保类本身符合java语言的语法规定,比如final修饰的类有没有子类,final修饰的方法有没有被覆盖等等
3、字节码检查:确保字节码流可以被java虚拟机安全的执行
4、二进制兼容验证:确保相互应用类之间的协调一致
类的准备:
在准备阶段,java虚拟机为类的静态变量分配内存,并赋予默认初始值。
类的解析:
在类的解析阶段,java虚拟机把类中的二进制数据中的符号引用替代为直接引用
类的初始化:
在初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋予初始值。
静态变量的初始化有两种方式:一种是在声明时初始化,另一种是在静态代码块中初始化。
java虚拟机初始化一个类包含以下步骤:
a、加入这个类还没有被加载和连接,那就先进性加载和连接。
b、加入这个类存在直接父类,并且这个父类还没有被初始化,那就先初始化直接父类。
c、加入类中很有初始化语句,那就依次执行这些初始化语句。
类的初始化时机:
如下六种活动被看做程序对类或接口的主动使用:
a、创建类的实例。包括new关键字创建,通过反射、克隆创建
b、调用类的静态方法
c、访问某个类或接口的静态变量,或给这些静态变量赋值。
d、调用java api中的某些反射方法
e、初始化一个类的子类。
f、java虚拟机启动时被标明为启动类的类
特殊情况:
a、对于final的静态常量,如果在编译时能够计算出变量的取值,那么使用该静态常量不会导致类的初始化。
b、对于final的静态常量,如果在编译时不能够计算出变量的取值,那么使用该静态常量会导致类的初始化。
c、当java虚拟机初始化一个类时,要求他的所有父类已经被初始化,但这条规则不适用于接口
相关推荐
例如,使用 OSGi(Open Service Gateway Initiative)框架,就可以管理多个模块化应用的生命周期,每个模块有自己的类加载器,允许动态安装、卸载和更新。 1.5 常见问题分析 类加载过程中可能会遇到一些问题,如类...
类加载器不仅涉及类的加载,还关系到类的可见性和生命周期管理。例如,不同类加载器加载的类之间默认是不可见的,除非有明确的导包声明。此外,类的卸载在Java中相对复杂,通常只有在以下情况才会发生:类的加载器被...
这些内置的类加载器加载的类在JVM生命周期中不会被卸载。而用户自定义的类加载器加载的类,当它们的`Class`对象不再被引用时,可能会被卸载,以节省内存资源。 了解类加载机制对于优化性能、理解和解决类加载相关...
双亲委派模型的工作流程是:从顶层的Bootstrap ClassLoader开始,逐级向下尝试加载类,直到找到能加载的类为止。 通过深入JDK源码,我们可以更清晰地理解类加载机制的细节,从而在遇到问题时能迅速定位并解决。对于...
类的生命周期包括加载、验证、准备、初始化和卸载。卸载通常发生在JVM运行时内存资源紧张时,会回收无用的类,但这在标准Java应用程序中并不常见,因为类一旦加载就很少被卸载。 5. 类的静态变量和静态代码块: ...
JVM的类加载机制是Java程序运行的基础...通过理解类加载机制,我们可以更好地管理类的生命周期,实现动态加载和卸载类,以及优化程序的性能。随着Java技术的不断发展,对JVM类加载机制的深入理解和应用将变得更加重要。
在深入了解Java中类的生命周期之前,我们首先需要了解Java虚拟机(JVM)及其生命周期的概念。 **1. Java虚拟机启动** 当我们通过`java`命令运行一个Java程序时,会启动一个Java虚拟机进程。这个进程从启动到终止的...
类的生命周期包括加载、验证、准备、解析和初始化五个阶段。其中,加载是读取.class文件,验证确保字节码安全,准备分配静态变量内存,解析绑定符号引用,初始化执行类的初始化方法。 4. **类的加载条件** 类的...
### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...
在实际编程中,了解这些概念有助于我们理解和优化程序性能,尤其是在涉及类加载策略、类加载器自定义以及类的生命周期管理时。通过实例和实践,我们可以更深入地掌握这些概念,提升我们的JVM调优技能。
类加载器是JVM中负责加载类的组件。类加载器可以是启动类加载器,也可以是用户自定义的类加载器。类加载器的作用是将类加载到Java虚拟机中。 垃圾收集器 垃圾收集器是JVM中的垃圾回收机制。垃圾收集器的作用是回收...
- 加载阶段是类生命周期的起始点。在此阶段,JVM负责读取类的二进制数据,并将其转换为运行时数据结构。 - 这个过程中,JVM还会创建一个代表该类的`java.lang.Class`对象,以便于后续操作(如反射)。 2. **连接...
这是两个不同阶段的区别,也是理解类生命周期的关键点。 在Java中,类加载器主要有以下几种: - **Bootstrap ClassLoader**:启动类加载器,负责加载JRE核心库。 - **Extension ClassLoader**:扩展类加载器,负责...
8. 类的生命周期: - 加载后的类经历初始化、使用和卸载的过程。卸载类在JVM中不常见,通常只发生在内存资源极度紧张时,且由JVM自动管理。 9. 安全与隔离: - 动态加载类可以实现安全的代码隔离,因为不同加载器...
类加载的过程不仅涉及类的生命周期,还与JVM的类加载器紧密相关。类加载器负责加载类字节码,并决定何时、何地以及如何加载。默认的类加载器包括启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ...
通过类加载器,JVM能够按需加载类,实现了高效、灵活的类管理机制。了解类的加载过程对于理解Java程序的执行流程、优化性能等方面具有重要意义。同时,掌握Java程序的生命周期有助于更好地控制程序的运行状态,提高...
双亲委派模型是指类加载器在加载类之前,先委托给父类加载器尝试加载,如果父类加载器加载失败,则由当前类加载器尝试加载。这一机制的优点是可以避免重复加载相同的类,同时保证了核心API类的安全性。 #### 三、...
类加载器可以从多种来源加载类的二进制数据,包括本地系统、网络、ZIP或JAR文件、数据库甚至动态编译Java源文件。开发人员可以使用默认类加载器或自定义类加载器来控制加载过程。 4. 加载过程详解: 加载阶段的...
JVM的生命周期 JVM的体系结构 JVM类加载器 JVM执行引擎 JVM运行时数据区 JVM垃圾回收 问题