一、类的生命周期

  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. 接口的初始化和类的初始化比较和区别

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

转载于:https://www.cnblogs.com/BaoZiY/p/10632227.html

深入理解JVM(8)——类加载的时机相关推荐

  1. jvm类加载过程_JVM知识点——深入理解JVM的类加载

    前言: 前面又说到Java程序实际上是将.class文件放入JVM中运行.虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机直接使用的Java类 ...

  2. JVM中类加载的时机

      本文主要记录下类的加载过程,一个类从加载到内存中开始到被卸载的整个生命周期作为java程序员来说应该还是要清楚的. 类的生命周期   类从加载到内存中到卸载的整个过程中经历了如下的过程:   这几 ...

  3. 深入理解Java虚拟机——类加载的时机

    目录 一.类加载的时机概述 二.加载阶段 三.初始化阶段 3.1.初始化阶段的概述 3.2.以下5种情况必须立即对类进行"初始化" 3.3.以下3种情况不被"初始化&qu ...

  4. 深入理解JVM(6)——类加载器

    虚拟机设计团队把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流(即字节码)"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现 ...

  5. 深入理解JVM文章合集

    原文地址:http://ddrv.cn/a/88331 Java动态追踪技术探究 在Java虚拟机中,字符串常量到底存放在哪 一次生产 CPU 100% 排查优化实践 聊聊 Java 虚拟机:类的加载 ...

  6. 深入理解JVM虚拟机(六):虚拟机类加载机制

    1. 概述 虚拟机把描述类的数据从Class文件加载到内存中,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类记载机制. 与那些在编译时需要进行连接工作 ...

  7. 深入理解JVM(5)——虚拟机类加载机制

    在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用.而虚拟机中,而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机中会发生什么变化?本文将逐步解答这些问题 ...

  8. JVM之类加载机制(基于《深入理解Java虚拟机》之第七章类加载机制)(上)

    asd在前两篇文章中,我们总结了Class文件结构以及相应的字节码指令,它让我们明白了Class文件存储格式的具体细节,接下来我们就要学习JVM如何加载Class文件. dsadClass文件应当是一 ...

  9. 深入理解JVM虚拟机6:深入理解JVM类加载机制

    深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体 ...

最新文章

  1. 软件外包是中国程序员的大金矿,大家一起来挣×××吧
  2. python 除法取模_Python的运算符和表达式(上)
  3. Spring Transactional还能导致生产事故?
  4. AI时代,产品经理需要掌握的5项新技能
  5. 电机贴上锡纸到底有没有作用?
  6. lightoj 1063 求割点
  7. python多进程怎么样_Python执行多进程任务的方法
  8. 作者:刘勇,山东农业大学教授、博士生导师。
  9. 从一线技术人员到阿里合伙人,主导了去“IOE”,没有他,阿里只能给美国公司打工!...
  10. CS0656 缺少编译器要求的成员“Microsoft.CSharp..........
  11. 计算机网络第二章-----物理层
  12. python Django音乐推荐系统(课设、毕设、学习)
  13. Android CallStack
  14. 线段树学习总结 - 关于猹 ACM 生涯的第一次受苦受难
  15. linux触摸屏校准命令,Linux 触摸屏校准
  16. 小程序从云服务器获取视频,小程序从云服务器获取视频代码
  17. Spring Cloud的基本认识和使用Spring Cloud的基本教程
  18. 2021-10-27 求方向盘转角
  19. matlab学习笔记(一):清除命令
  20. 万字长文全解读 | 浅析银行数字化转型之二:打造金融敏捷中心

热门文章

  1. 有关调试CRM系统的一些感想
  2. ExpressQuantumGrid.Suite.v6.30 在Delphi 7中的安装 收藏
  3. 一文读懂除法溢出-使用汇编重定向0号中端(除法错误中断,比如,执行div指令产生的除法溢出)
  4. 高级C语言教程-sscanf()函数使用方式
  5. 「 每日一练,快乐水题 」258. 各位相加
  6. C++ 应用程序性能优化,第 6 章:内存池
  7. zcmu-1957(状态压缩枚举)
  8. 区块链技术 好文收藏
  9. 【译】Making Sense of Ethereum’s Layer 2 Scaling Solutions: State Channels, Plasma, and Truebit
  10. Generative Adversarial Networks 生成对抗网络的简单理解