JVM--内存与垃圾回收篇1

preview
需积分: 0 0 下载量 112 浏览量 更新于2022-08-03 收藏 23.17MB PDF 举报
Java虚拟机(JVM)是Java程序运行的核心,它的内存管理和垃圾回收机制对于程序的高效运行至关重要。在本文中,我们将深入探讨JVM的类加载子系统及其在内存管理中的作用。 类加载子系统,也被称为Class Loader SubSystem,其主要任务是从文件系统或网络中加载Class Files,这些文件是Java类的二进制表示。每个Class File的开头都有一个特定的文件标识符,以确保文件的合法性。类加载器(ClassLoader)仅负责加载这些类文件,但是否允许执行则由执行引擎(Execution Engine)决定。类加载器可以比作媒婆,它负责介绍对象(类),但能否成功运行则取决于类自身的设计和实现。 类加载过程分为四个主要步骤: 1. **加载**:这一步骤包括了通过类的全限定名获取其二进制字节流,并将这些字节流转化为方法区的运行时数据结构。同时,在内存中创建一个java.lang.Class对象,作为方法区中类数据的访问入口。 2. **链接**: - **验证**:确保Class文件的内容符合JVM的要求,保证类的安全性。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证。 - **准备**:在这个阶段,为类变量分配内存并设置它们的默认初始值,如零值或null。不过,final修饰的static变量在编译阶段就已经分配好。此时不会为实例变量分配内存,因为它们需要等到对象实例化时才分配。 - **解析**:将常量池中的符号引用转化为直接引用,使得程序可以直接访问目标。解析涉及类、接口、字段、类方法、接口方法和方法类型等的引用。 3. **初始化**:执行类构造器方法(),它是由类变量的赋值动作和静态代码块合并生成的。初始化过程保证了子类的()在父类的()执行之后进行。在初始化阶段,类变量的最终值会被赋予。 以给出的代码示例为例,`ClassInitTest`和`ClinitTest1`展示了类初始化的顺序和特性。在`ClassInitTest`中,类变量`num`和`number`的初始化顺序在`main`方法中得到了体现。而`ClinitTest1`则展示了类继承关系下的初始化过程,子类`Son`的初始化会先触发父类`Father`的初始化,确保了类变量`A`的值在`Son`类的`B`变量被赋值时已正确设置。 类加载子系统的这些机制确保了Java程序的稳定性和安全性。理解这些概念有助于开发者更好地优化代码,避免内存泄漏和性能瓶颈,从而提升程序的整体效率。在实际开发中,对JVM内存模型的深入理解能帮助我们编写出更加高效和健壮的Java应用程序。