189 8069 5689

jvm类加载的过程可分为哪三步

小编给大家分享一下jvm类加载的过程可分为哪三步,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

创新互联专注于沙依巴克网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供沙依巴克营销型网站建设,沙依巴克网站制作、沙依巴克网页设计、沙依巴克网站官网定制、微信小程序开发服务,打造沙依巴克网络公司原创品牌,更为您提供沙依巴克网站排名全网营销落地服务。

jvm类加载的过程分为三步:加载、连接和初始化。

jvm类加载的过程可分为哪三步

加载

通过类的全路径将这个类从外部加载到jvm中,同时在方法区生成该类的描述信息并在内存生成该类的Claas类型。作为方法区这个类的数据访问入口。

连接

这是很重要的一步,过程比较复杂,分为三步:验证、准备和解析。  

验证:确保类加载的正确性。一般情况由javac编译的class文件是不会有问题的,但是可能有人的class文件是自己通过其他方式编译出来的,这就很有可能不符合jvm的编 译规则,这一步就是要过滤掉这部分不合法文件 

准备:为类的静态变量分配内存,将其初始化为默认值 。我们都知道静态变量是可以不用我们手动赋值的,它自然会有一个初始值 比如int 类型的初始值就是0 ;boolean类型初始值为false,引用类型的初始值为null 。 这里注意,只是为静态变量分配内存,此时是没有对象实例的 

解析:把类中的符号引用转化为直接引用。解释一下符号引用和直接引用。比如在方法A中使用方法B,A(){B();},这里的B()就是符号引用,初学java时我们都是知道这是java的引用,以为B指向B方法的内存地址,但是这是不完整的,这里的B只是一个符号引用,它对于方法的调用没有太多的实际意义,可以这么认为,他就是给程序员看的一个标志,让程序员知道,这个方法可以这么调用,但是B方法实际调用时是通过一个指针指向B方法的内存地址,这个指针才是真正负责方法调用,他就是直接引用。

初始化

在初始化阶段会调用类的初始化方法clinit()为静态变量赋予实际的值(例如将value赋值为123)、执行静态代码块。在 JVM 规范中没有强制约束加载的时机,不过对于初始化,JVM规范严格规定了有且只有5种情况必须立即对类进行初始化:

下面我们讲解 一下clinit()方法是怎么生成的。clinit()方法是编译器 自动收集类中的静态变量和静态语句所产生的。编译器收集的顺序是由语句出现的顺序 所 决定的,静态语句块只能复制定义在它后面的变量,但是不能使用,如下 图 所示,而且虚拟机规范保证,父类的clinit()方法一定 在子类之前执行,但不是 通过继承来的。

以上是jvm类加载的过程可分为哪三步的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


网页名称:jvm类加载的过程可分为哪三步
当前地址:http://cdxtjz.cn/article/jiihpe.html

其他资讯