• JVM(一)类加载机制


      

    1)Java文件先通过编译器变为.class文件
    2)类加载器将.class文件加载到JVM。
      类加载的过程简述:
      Java文件先通过编译器变为.class文件
      类加载器将.class文件加载到JVM。

    一、JVM 组成和作用
    1、 类装载器(Class Loader):.class文件由类加载器加载到数据运行区,
    2、数据运行区 (Runtime data area):;
    3、 执行引擎(Execution Engine):由于字节码只是JVM的指令集规范,不能交给底层操作系统执行,需要特定的命令解析器执行引擎翻译成底层系统指令,再交由CPU执行;
    4、 本地库接口(Native Interface): 执行底层命令操作系统,需要调用其他语言的本地库接口来实现功能;

    二、类装载的过程
      类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们的顺序如下图所示

      

    1、加载

      根据查找路径找到相应class文件导入;


    2、检查

      检查加载的class文件正确性;


    3、准备:

      给类中的静态变量分配内存空间;
         类变量(static)会分配内存,但是实例变量不会,实例变量主要随着对象的实例化一块分配到java堆中;
      这里的初始值指的是数据类型默认值,而不是代码中被显示赋予的值。比如
      public static int value = 1; //在这里准备阶段过后的value值为0,而不是1。赋值为1的动作在初始化阶段。

      

      注:准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在堆中。其次,这里所说的初始值“通常情况”下是数据类型的零值,假设一个类变量的定义为:

    public static int value=123;

      那变量value在准备阶段过后的初始值为0而不是123。因为这时候尚未开始执行任何java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器()方法之中,所以把value赋值为123的动作将在初始化阶段才会执行。

      至于“特殊情况”是指:public static final int value=123,即当类字段的字段标注为final之后,value的值在准备阶段初始化为123而非0.

      总结:final是在准备阶段时就赋值了,static准备阶段时数据是零值,在初始化阶段才会赋值。(面试题)

    4、解析

      是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。

    5、初始化

      类初始化阶段是类加载过程的最后一步,到了初始化阶段,才真正开始执行类中定义的java程序代码。

      码文件被加载到内存后,先进行链接的验证这一步骤,验证通过后准备阶段,给a分配内存,因为变量a是static的,所以此时a等于int类型的默认初始值0,即a=0,然后到解析(后面在说),到初始化这一步骤时,才把a的真正的值10赋给a,此时a=10。

    三、类的初始化时机

    3.1、类什么时候才被初始化

    1. 创建类的实例,也就是new一个对象
    2. 访问某个类或接口的静态变量,或者对该静态变量赋值
    3. 调用类的静态方法
    4. 反射(Class.forName("com.lyj.load"))
    5. 初始化一个类的子类(会首先初始化子类的父类)
    6. JVM启动时标明的启动类,即文件名和类名相同的那个类

    3.2、类的初始化步骤

    1. 如果这个类还没有被加载和链接,那先进行加载和链接
    2. 假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)
    3. 加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句

    ------------------------------------------------------------------------------

    【1】https://www.jianshu.com/p/2e818109bb3d

    【2】https://blog.csdn.net/zxd8080666/article/details/78087646

  • 相关阅读:
    在javascript中如何取消事件冒泡
    ThinkPHP与EasyUI整合之二(datagrid):删除多条记录
    Jquery动画效果地铁站名指示等效果
    ubuntu 10.4 setup vm tools log
    Windows下Critical Section、Event、Mutex、Semaphores区别
    联通GPRS卡在windows mobile操作系统手机上网如何设置
    hope DATA
    电动车电池正确的使用方法
    C语言运算符表
    深圳市职业技能鉴定报名
  • 原文地址:https://www.cnblogs.com/Jomini/p/13625349.html
Copyright © 2020-2023  润新知