温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-10-27 12:06:03 来源:亿速云 阅读:131 作者:小新 栏目:编程语言

小编给大家分享一下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类加载的过程可分为哪三步的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm
AI