• 技术文章 >Java >java教程

    jvm类加载的过程是什么?

    不言不言2019-04-17 14:09:13原创942

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

    未标题-1.jpg

    加载

    通过类的全路径将这个类从外部加载到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类加载的过程是什么?的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:jvm
    上一篇:idea学习第一步之使用详解 下一篇:idea学习第三步之最值得安装的几款插件
    PHP编程就业班

    相关文章推荐

    • JDK,JRE和JVM之间的区别是什么• 什么是java虚拟机?JVM的简单介绍• ​JVM,JRE,JDK三者的简单总结• 怎么使用JVM捕获Java异常?(附示例)• JVM的内存分配方式介绍

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网