深入理解JVM:加载、链接与初始化解析
160 浏览量
更新于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` 类的静态初始化块和静态变量已经完成初始化。
总结来说,类加载过程包括加载、链接(校验、准备、解析)和初始化这三个主要步骤。每个步骤都有其特定的任务,保证了类的正确加载和运行。在实际开发中,理解这些概念有助于优化应用程序性能,避免内存泄漏,以及处理类加载相关的错误。通过自定义类加载器,开发者还可以实现更灵活的类加载策略,满足特定场景的需求。
2021-01-07 上传
2018-05-10 上传
2023-03-24 上传
2023-08-11 上传
2023-05-09 上传
2023-04-01 上传
2023-06-06 上传
2023-05-28 上传
2023-04-11 上传
weixin_38699593
- 粉丝: 6
- 资源: 912
最新资源
- C++多态实现机制详解:虚函数与早期绑定
- Java多线程与异常处理详解
- 校园导游系统:无向图实现最短路径探索
- SQL2005彻底删除指南:避免重装失败
- GTD时间管理法:提升效率与组织生活的关键
- Python进制转换全攻略:从10进制到16进制
- 商丘物流业区位优势探究:发展战略与机遇
- C语言实训:简单计算器程序设计
- Oracle SQL命令大全:用户管理、权限操作与查询
- Struts2配置详解与示例
- C#编程规范与最佳实践
- C语言面试常见问题解析
- 超声波测距技术详解:电路与程序设计
- 反激开关电源设计:UC3844与TL431优化稳压
- Cisco路由器配置全攻略
- SQLServer 2005 CTE递归教程:创建员工层级结构