zoukankan      html  css  js  c++  java
  • 具体解释Java虚拟机类载入

    概述

    在Java语言里面,类型的载入、连接和初始化过程都是在程序运行期间完毕的。虚拟机把描写叙述类的数据从Class文件或其他地方载入到内存,并对数据进行校验、转换解析和初始化,终于形成能够被虚拟机直接使用的Java类型,这就是虚拟机的类载入过程。

    类载入的时机

    载入、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的载入过程必须依照这样的顺序按部就班地開始。而解析阶段则不一定:它在某些情况下能够在初始化阶段之后開始。这些阶段通常都是互相交叉地混合式进行的,一般会在一个阶段运行的过程中调用、激活另外一个阶段。

    Java虚拟机规范并没有进行强制约束開始类载入过程。可是对于初始化阶段。虚拟机规范则是严格规定了有且仅仅有5种情况必须马上对类进行初始化:

    1. 使用newkeyword实例化对象的时候、读取或设置一个类的静态字段的时候,以及调用一个类的静态方法的时候。

    2. 使用java.lang.reflect包的方法对类进行反射调用的时候。
    3. 当初始化一个类的时候。假设发现其父类还没有进行过初始化。则须要先触发其父类的初始化。
    4. 当虚拟机启动时,用户须要指定一个要运行的主类(包括main()方法的那个主类),虚拟机会先初始化这个主类。
    5. 当使用JDK1.7的动态语言支持时,假设一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic/REF_invokeStatic/REF_putStatic的方法句柄,而且这种方法句柄所相应的类没有初始化,则须要先触发其初始化。

    除这5种场景之外。全部引用类的方式都不会触发初始化。

    类载入的过程

    我画了一张思维导图来描写叙述这一过程。例如以下图:

    类载入的过程

    假设在浏览器看不清楚。保存到电脑上在打开图片。

  • 相关阅读:
    分析java程序的命令总结jps,jstack
    Tomcat配置详解及tomcat的连接数与线程池
    Go入门练习题
    WebSocket的原理,及如何测试websocket是否连接成功
    day3-每天进步一点基础知识-正则练习题
    day2-每天进步一点基础知识
    day1-每天进步一点
    数组有没有length()这个方法? String有没有length()这个方法?
    List, Set, Map是否继承自Collection接口?
    启动一个线程是用run()还是start()?
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7162672.html
Copyright © 2011-2022 走看看