深入理解JVM类加载:Singleton模式与内存剖析

需积分: 19 1 下载量 22 浏览量 更新于2024-09-16 收藏 367KB PDF 举报
本篇JVM类加载学习笔记深入探讨了Java虚拟机(JVM)的工作原理,特别是类加载器机制。在Java中,类加载器是负责将.class字节码文件转换成可执行的Java类,并将其放入JVM运行时环境中的内存区域。它遵循"类的双亲委派模型",确保了对标准库和第三方库类的统一加载。 1. **类加载器(Classloader)**: Java中的类加载器分为启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)。每个类加载器都有自己的职责范围,且互不干扰。当一个类被请求加载时,如果该类尚未被加载,会按照从上到下的顺序逐级委派给父加载器来查找和加载。 2. **`Singleton` 示例**: 提供了一个名为`Singleton`的类,其中包含一个单例模式实现。`Singleton`类有两个静态变量`a`和`b`,以及一个私有构造函数,保证了类实例的唯一性。通过`GetInstence()`方法获取这个单例实例。在`MyTest`类的`main`方法中,展示了如何通过`GetInstence`方法创建并访问`Singleton`对象的静态成员。 3. **双亲委派模型**: 当`MyTest`中的`Singleton.GetInstence()`被调用时,JVM并不会立即创建新的类实例,而是先由应用类加载器尝试加载。如果找不到,它会递交给扩展类加载器,最后交给启动类加载器。如果所有父加载器都未能找到,才会在当前类加载器中加载。这样设计是为了避免重复加载和提高安全性。 4. **类加载时机**: 类只有在第一次被请求加载时才会进行实际的加载和初始化。`Singleton`类的静态变量`a`和`b`在类加载时会被初始化为0,而实例化的次数则通过构造函数`singleton()`控制。 5. **内存管理**: 类加载完成后,类的字节码会被存储在堆内存中,而静态变量存储在方法区(现在称为元空间)。当程序结束时,类加载器会卸载不再使用的类,以节省内存。 总结来说,这篇笔记重点介绍了JVM的类加载过程、类加载器的层次结构、双亲委派模型的应用以及类的静态变量初始化时机。理解这些概念有助于开发人员更好地掌握Java程序的运行机制,优化代码性能和处理依赖关系。