• 深入理解JVM(8)——类加载的时机


    一、类的生命周期

    1. 一个类从加载进内存到卸载出内存一共要经历7个阶段:加载—》验证—》准备--》解析—》初始化—》使用—》卸载。
    2. 类加载包括五部分:加载—》验证—》准备--》解析—》初始化
    3. 在类加载的过程中,以下三个过程成为连接:验证—》准备--》解析
    4. 因此,JVM的类加载过程可以分为三个部分:加载—》连接—》初始化
    5. c/c++语言在程序运行之前需要完成预处理、编译、汇编、连接,但是在Java语言中类加载(加载、连接、初始化)是在程序运行期间完成。在程序运行期间完成类加载过程会增加程序的开销,但是随之会带来更大的好处—能够提高程序的灵活性。Java语言的灵活性主要体现在在程序运行期间能够动态的扩展,所谓的动态扩展就是动态加载和动态链接。

    二、类加载的时机

    1. 类加载过程中每个步骤的顺序

    a)        加载、验证、准备、初始化是按照先后顺序依次执行的

    b)        解析过程会发生在初始化过程中

    1. 类加载过程中“初始化”开始的时机:JVM规范中只定义了类加载过程中初始化过程开始的时机,加载、连接过程都应该在初始化之前开始(解析除外)

    a)        在类加载过程中遇到如下指令(new、getstatic、putstatic、invokestatic),如果当前的类尚未初始化,那么就要进行初始化。分别对应的Java代码场景为:

    1. 通过new创建一个对象
    2. 读取、设置一个类的静态成员变量(final修饰的成员变量除外)
    3. 调用一个类的静态成员函数

    b)        使用Java.lang.reflect进行发射调用的时候,如果这个类没有被初始化,那么就要先进行初始化

    c)        当初始化一个类时,如果这个类的父类还没有被初始化,那么先初始化这个类的父类,再初始化这个类

    d)        当虚拟机启动的时候,虚拟机会首先初始化带有main方法的类

    1. 主动引用和被动引用

    JVM虚拟机规范中要求在程序运行过程中,“当且仅当”出现上述4个条件之一的情况才会初始化一个类。如果间接满足上述初始化条件是不会初始化类的。其中,直接满足上述初始化条件的情况叫做主动引用;间接满足上述初始化过程的情况叫做被动引用。

    那么,只有当程序在运行过程中满足主动引用的时候才会初始化一个类,若满足被动引用就不会初始化一个类。

    1. 接口的初始化和类的初始化比较和区别

    类和接口都需要初始化,他们初始化的过程大致相同,不同点在于:类初始化过程中如果发现该类的父类尚未被初始化,那么会先初始化父类,然后再初始化这个类;但是接口初始化的时候,并不要求父类已经全部初始化,当程序运行过程中需要用到父类的东西的时候在初始化父类接口。

  • 相关阅读:
    React 中使用 pdf.js 将 pdf 转换成图片
    html2pdf 无法导出 html 中 img 图片的解决方法
    js-xlsx 实现前端 Excel 导出(支持多 sheet)
    React 项目引入 Dva
    项目构建分析和 webpack 优化实践
    《写给大家看的设计书》读书笔记
    2019年六月前端面试经验总结
    UITableView .grouped 类型去除顶部间距
    Ant Design Upload 组件上传文件到云服务器
    家庭动物园下载链接
  • 原文地址:https://www.cnblogs.com/BaoZiY/p/10632227.html
Copyright © 2020-2023  润新知