| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 四、JVM类加载机制 -> 正文阅读 |
|
[Java知识库]四、JVM类加载机制 |
Java代码编写好之后,需要将其编译成Class文件,才能被JVM虚拟机执行。JVM将Class文件加载到内存,并对其进行校验、转换解析和初始化,最终形成可以直接被JVM使用的Java类型,就是JVM的类加载机制。 Java是一门动态语言,也就是在Java里面,类型的加载、连接和初始化过程是在程序的运行期间完成的。例如:如果编写一个面向接口的程序,可以等到在运行时再指定其实际的实现类。(C语言的链接过程是在编译期间完成的,C通过编译链接之后会直接生成一个可执行文件。) 1、类加载的时机类从被加载到JVM内存中,到卸载出内存中为止,它的整个生命周期包括以下七个阶段: ?JVM规范中没有强制约束什么时候开始一个类的加载阶段,但是对类的初始化阶段,严格规定了有且只有以下5种情况必须立即对类进行“初始化”,这5种行为称为对类的主动引用:
除了以上的几种情况,其他引用类的方式不会触发类的初始化,称为被动引用,如下示例:
代码运行结果如下,没有打印"SuperClass init!"
代码运行结果如下,没有打印"SuperClass init!"
代码运行结果,没有打印"Constant init!"。实际上,虽然源码中引用了Constant类的常量str,但是在编译阶段通过常量的传播优化,已经将常量的值“Hello World”存放到了NotInitialization类的常量池中,也就是编译之后说NotInitialization的Class文件中并没有对Constant类的符号引用了,这两个类再编译成Class文件之后就不存在任何联系了。
接口的初始化与类的初始化有点区别: 当一个类初始化时,要求其父类全部已经初始化过了;但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候(如引用父接口中定义的常量)才会初始化。 2、类加载的过程1、加载在加载阶段,JVM需要做以下事情:
对于HotSpot JVM而言,java.lang.Class对象比较特殊,它时存放在方法区里面的。 2、验证验证是连接阶段的第一步,目的是为了确保Class文件中的字节流包含的信息符合JVM规范。虽然在Java代码层面,语法错误将会导致编译器编译失败,无法将具有语法错误的代码编译为Class文件。但是Class文件的来源不仅仅只是java代码编译而来的,可以通过任何途径生成Class文件,甚至直接编写Class文件。即Class文件的来源是不可信的,对Class文件的校验是非常重要的。包括以下几方面的验证:
3、准备准备阶段是正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。(此时没有实例化对象,不会为实例变量分配内存。)这里所说的初始值通常指的是对应数据类型的零值(0、null)。特殊情况下,如果类变量是final变量,则会直接初始化为属性指定的值。 4、解析解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。 5、初始化类的初始化阶段是类加载过程中的最后一步。前面的过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余的动作都是有JVM主导和控制的。而到了初始化阶段,就是真正开始执行类型定义的Java程序代码(或者说是字节码)了。 在准备阶段,类变量已经被赋值过一次初始值,而在初始化阶段,则会根据代码对类变量再次进行初始化,并为其赋予真正的值。 从另一个角度来讲,初始化阶段也是执行类构造器<clinit>()方法的过程。
所以以下代码执行结果为:2
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 10:15:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |