Class类加载过程与类加载器 当我们new了一个对象,会发生什么呢?来段代码: public class Tested { public static int T = 10; public int c = 1; } 在编译期,编译器会将 Tested.java类转换成 Tested.class 字节码文件。当虚拟机接收到new 字节码指令时,如果此时类还未被初始化,则虚拟机会先进行类的初始化过程。 1. 虚拟机会通过 Tested.class 文件内的全限定名来获取该类的字节码二进制流。全限定名位于class文件数据存储结构内的常量池中,常量池可以理解为Class文件中的 在Java世界中,JVM(Java虚拟机)是运行Java程序的核心组件,它负责加载、验证、执行字节码,并管理内存。当我们谈论"JVM内一个对象的生死存亡",我们需要理解从对象创建到对象销毁的整个生命周期,这涉及到类加载、内存分配、对象初始化以及垃圾收集等关键环节。 让我们从类加载说起。当JVM遇到`new`指令创建一个对象时,它首先会加载对应的类。类加载分为加载、验证、准备、解析和初始化五个阶段。加载阶段,JVM会通过类的全限定名(例如`Tested`)找到对应的`.class`文件,读取其字节码二进制流。全限定名存储在类文件的常量池中,常量池就像一个资源仓库,保存了类的各种元数据。接着,验证阶段会检查字节码的正确性和安全性。然后,进入准备阶段,虚拟机会在方法区为类变量分配内存并初始化(这里`T = 0`)。初始化阶段,JVM会执行类构造器`<clinit>`方法,将静态变量赋值,例如`T = 10`。 在类加载完成后,JVM开始为`new Tested()`创建对象。内存分配通常在Java堆中进行,Java堆是JVM管理的主要内存区域,用于存放对象实例。有两种常见的内存分配策略:指针碰撞和空闲列表。前者适用于内存规整的情况,分配只需移动指针;后者适用于内存不规整,需要维护空闲列表。分配完内存后,对象的初始化开始,包括将内存初始化为零值(不包括对象头,如`c = 0`)、设置对象头信息(如类型信息、哈希码、GC分代年龄等)以及执行对象构造器(如`c = 1`)。 至于对象的销毁,JVM使用垃圾收集机制来回收不再使用的对象。其中,可达性分析是一种常用的判断对象是否存活的方法。GC Roots是一组特定的对象,包括虚拟机栈中的本地变量、方法区中的静态变量、本地方法栈中的JNI引用等。如果一个对象无法从GC Roots通过引用链到达,那么这个对象被认为是不可达的,也就是可被回收的。 在Java的内存管理中,理解对象的生命周期至关重要,因为它直接影响程序的性能和内存效率。了解类加载过程、内存分配策略、对象初始化和垃圾收集机制,有助于我们编写出更高效、更健壮的Java代码。
































- 粉丝: 275
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 施工企业项目管理工作中需注意的问题.docx
- PLC控制花样喷泉方案设计书[1]2.doc
- PLC控制电镀生产线课程研究设计.doc
- 信息化教学法与实验法相融合探究苯酚.docx
- 网络农业信息资源元数据研究及其著录管理系统开发.docx
- 基于Android平台祖玛游戏的方案设计书与实现.doc
- 基于PLC的全自动洗衣机控制系统课程方案设计书.doc
- 四川省高等学校信息化建设参考指南.doc
- 安全生产网络组织台帐.doc
- 从“治水”谈网络德育.doc
- PLC与物料分拣系统(毕业论文).docx
- 主变间隔智能试验系统软件设计.docx
- 单片机LED点阵屏设计方案与实现.doc
- 判断是否能构成三角形汇编语言程序设计方案.doc
- 大数据平台详细设计.doc
- 信息系统安全测评.doc


