深入理解JVM:加载、链接与初始化解析
172 浏览量
更新于2024-09-05
收藏 64KB PDF 举报
"Test静态块开始";
test1=newTest();
System.out.println("Test静态块结束");
}
publicTest(){
System.out.println("Test实例化开始");
}
@Override
publicStringtoString(){
return"Test";
}
}
在上述代码中,我们有两个类,`ClassLoaderDemo` 和 `Test`。`ClassLoaderDemo` 是主类,而 `Test` 包含了静态变量和静态初始化块。当我们运行 `ClassLoaderDemo`,会触发 `Test` 类的加载。
1. **加载阶段**:
- JVM 会根据类名查找对应的 `.class` 文件。这里的查找路径包括 BootstrapClassLoader(引导类加载器)加载的 `jre/lib` 下的类,ExtensionClassLoader(扩展类加载器)加载的 `jre/lib/ext` 目录下的类,以及 ApplicationClassLoader(应用类加载器)加载的 `classpath` 指定路径下的类。在这个例子中,`Test` 类是由 ApplicationClassLoader 加载的,因为它位于工程目录下。
- 加载过程会创建一个 `java.lang.Class` 对象,该对象代表了类的信息,并在方法区存放字节码,在堆中分配内存给静态变量。
2. **链接阶段**:
- **校验**:确保字节码符合Java虚拟机规范,防止恶意代码注入。
- **准备**:在这个阶段,为类的静态变量分配内存,并赋予它们默认值。例如,`Test` 类的 `a` 和 `b` 都会被初始化为 `0`。
- **解析**:将符号引用(如方法名或字段名)转换为直接引用,使得可以直接访问到这些方法和字段。
3. **初始化阶段**:
- 在初始化阶段,静态变量会按照它们在源代码中的顺序被赋值。在这个例子中,`Test` 类的静态块首先被执行,打印出 "Test静态块开始",然后创建 `test1` 对象,接着打印 "Test静态块结束"。此时,`a` 和 `b` 分别被赋值为 `2`。
- 当 `Test` 类的静态成员首次被引用时,如 `new Test()`,才会执行静态初始化。因此,在 `ClassLoaderDemo` 的 `main` 方法中创建 `test2` 实例时,`Test` 类的静态初始化块和静态变量已经完成初始化。
总结来说,类加载过程包括加载、链接(校验、准备、解析)和初始化这三个主要步骤。每个步骤都有其特定的任务,保证了类的正确加载和运行。在实际开发中,理解这些概念有助于优化应用程序性能,避免内存泄漏,以及处理类加载相关的错误。通过自定义类加载器,开发者还可以实现更灵活的类加载策略,满足特定场景的需求。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2018-05-10 上传
2009-01-20 上传
2021-01-07 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38699593
- 粉丝: 6
- 资源: 912
最新资源
- Excel模板4-间隔填充趋势图.zip
- STM32F207参考手册_STM32F207参考手册_
- 行业分类-设备装置-便携式听力测试和助听器验配一体化系统.zip
- picture-puzzle:在JS中旋转(甚至可能滑动)图片拼图游戏
- complexity-finder:一个简单的程序来找到函数的大 O 复杂度
- 基于PyTorch的车辆检测与车牌识别融合技术设计源码
- Java基础18共21页.pdf.zip
- matlab自相关代码-BHM2020:BHM2020
- Loadinfo-开源
- NavicatforMySQL_maven常用合集_maven_
- UFO凭证修改工具 ,老版本
- 行业文档-设计装置-种子发芽纸.zip
- node-sap-upload
- dataStructTool
- Lince-开源
- 基于SpringBoot的网上书城书店管理系统设计源码