类的生命周期

  • 类的加载
  • 类加载过程
    • 加载
    • 链接
      • 验证
      • 准备
      • 解析
    • 初始化
  • 总结

首先我们先简单了解一下整个JVM的体系结构是怎样的,如下图所示(图1):

再详细具体一点(图2):

上面的图片有些地方看不懂没关系,先在脑子里大体有个印象。
我们这篇文章讲的是类的加载过程,所以在讲类加载之前先要知道类的生命周期是一个怎样的过程。
如下图所示(图3):

类的生命周期一共有5个阶段,分别是:
1.加载(Loading)
2.链接(Linking)
3.初始化(Initialization)
4.使用(Using)
5.卸载(UNLoading)

其中链接(Linking)阶段又可以细分为三个阶段:
1)验证(Verification)
2)准备(Preparation)
3)解析(Resolution)

今天我们只讲类的加载过程。如下图所示(图4):

类的加载

类的加载:指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

类加载过程

通过以上图片我们可以看出类的加载过程是发生在类装载器子系统中的。

类装载器子系统:虚拟机把描述类的数据从class文件加载到内存,并对数据进行验证、准备、解析和初始化,最终形成可以被虚拟机直接使用的Java类型。

加载

加载是类加载过程的第一个阶段,不要将这2个概念混淆了。

1)通过一个类的全限定名来获取其定义的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。

链接

验证

确保被加载的类的正确性。

验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合

当前虚拟机的要求,并且不会危害虚拟机自身的安全。

  • 文件格式验证:验证字节流是否符合Class文件格式的规范,如:是否以模数0xCAFEBABE开头、主次版本号是否在当前虚拟机处理范围内等等。
  • 元数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求;如:这个类是否有父类,是否实现了父类的抽象方法,是否重写了父类的final方法,是否继承了被final修饰的类等等。
  • 字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的,如:操作数栈的数据类型与指令代码序列能配合工作,保证方法中的类型转换有效等等。
  • 符号引用验证:确保解析动作能正确执行;如:通过符合引用能找到对应的类和方法,符号引用中类、属性、方法的访问性是否能被当前类访问等等。

验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反

复验证,那 么可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类

加载的时间。

准备

为静态变量(类变量)分配内存并且设置该静态变量(类变量)的默认初始值,即零值。

这些内存都将在方法区中进行分配。

  • 只对static修饰的静态变量进行内存分配、赋默认值(如0、0L、null、false等)。
  • 对final的静态字面值常量直接赋初值(赋初值不是赋默认值,如果不是字面值静态常量,那么会和静态变量一样赋默认值)。

解析

将虚拟机常量池内的符号引用解析为直接引用,指到内存中的具体地址。

  • 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用进行。符号引用就是一组符号来描述目标,可以是任何字面量。
    直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

初始化

为类的静态变量赋初值。

初始化阶段是执行类构造器<clinit>()方法的过程。

类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块

(static块)中的语句合并产生的。也就是说,当我们代码中包含static变量的时候,就会有

<clinit>( )方法;如果当前类不存在static变量,那么它的字节码文件是不会存在<clinit>( )

  • <clinit>( )方法中的指令按语句在源文件中出现的顺序执行
  • <clinit>( )不同于类的构造器(构造方法)。(关联:构造器是虚拟机视角下的<init>( ))
  • 若该类具有父类,JVM会保证子类的<clinit>( )执行前,父类的<clinit>( )已经执行完毕
  • 虚拟机会保证一个类的<clinit>( )方法在多线程环境中被正确加锁和同步。

注意:需要明确类加载过程类初始化类的实例化区别,具体内容等再写一篇文章。

总结

最后用一张图总结这个过程。

Java类加载过程详解相关推荐

  1. Java类加载机制详解【java面试题】

    Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...

  2. JVM系列(一):JVM类加载过程详解

    Java 通过引入字节码和 JVM 机制,提供了强大的跨平台能力,理解 Java 的类加载机制是深入 Java 开发的必要条件. 一.Java代码执行流程 Java程序运行时,必须经过编译和运行两个步 ...

  3. 最通俗易懂的JAVA虚拟机类加载过程详解,看完还不懂你考虑转行吧!

    前言 当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.链接.初始化三个步骤对该类进行类加载. Java Class文件 class文件是一组以8位字节为基础的二进制流,各个数据项目 ...

  4. Java类加载器详解

    Java虚拟机中的类加载有三大步骤:,链接,初始化.其中加载是指查找字节流(也就是由Java编译器生成的class文件)并据此创建类的过程,这中间我们需要借助类加载器来查找字节流. Java虚拟机默认 ...

  5. Java 类加载机制详解

    一.类加载器 类加载器(ClassLoader),顾名思义,即加载类的东西.在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘.网络或其他来源加载到内存中,并对字节码进行解 ...

  6. Java基础学习总结(115)——Java 类加载机制详解

    一.类加载器 类加载器(ClassLoader),顾名思义,即加载类的东西.在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘.网络或其他来源加载到内存中,并对字节码进行解 ...

  7. Java类加载器详解 1

    1 特点 双亲委派: 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启 ...

  8. 深入理解Java虚拟机之Java类加载机制,Java类实例化过程详解。

    目录 Java类加载机制 类加载过程 加载(Loading) 连接(Linking) 初始化(Initialzation) 使用(Useing) 卸载(Unloading) 引言 什么情况下开始类加载 ...

  9. Java类的加载过程详解 面试高频!!!值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话: 八小时内谋生活,八小时外谋发展. 望别日与 ...

最新文章

  1. Bagging与随机森林算法原理小结
  2. loadrunner 录制 odbc 迭代出现lrd_db_option: ERROR, return-code=LRDE2009错误
  3. ListView(列表)
  4. 补习系列(10)-springboot 之配置读取
  5. vue中给window添加滚动监听无效的解决方案
  6. 移动端常见兼容性问题及解决办法
  7. kali字典爆破wifi密码
  8. Activeperl安装教程MAC苹果电脑
  9. Tracert命令原理
  10. 上机练习2 类与对象 pc cpu harddisk对象组合
  11. 计算机 随机分组的方法,最小化随机分组方法介绍及其SAS实现
  12. 解决win10没Wifi功能了,无线网卡驱动异常代码56的问题
  13. python禅语_但行好事,莫问前程,如何理解?
  14. PKU红的HSB值,以及THU紫的HSB值。北大红,清华紫
  15. -1-1 java 基础语法 java关键字 java 注释 常量 语句 运算符 函数 数组定义
  16. 数据库 string (varchar) 类型 按数值 进行排序
  17. python中噪音是什么意思_Perlin噪声和Python的ctypes
  18. matlab向量化 什么意思,什么是“向量化”?
  19. 我国长征系列航天飞船剖解
  20. Ubuntu服务器的安装和配置----系统安装

热门文章

  1. 阿里巴巴Java开发手册(黄山版)
  2. 华为员工论坛集体吐槽新办公环境:周围像荒野,交通乱糟糟!
  3. m基于matlab的雷达信号分选技术研究,包括时域瞬时自相关法,频域复倒频分析法,调制域过零检测法,时频小波变换法
  4. qt creator源码全方面分析(2-6)
  5. java calendar 设置小时_Java Calendar类的时间操作
  6. 华为注册鸿蒙商标的故事,华为注册“鸿蒙”商标:意在把传说化为现实奇迹
  7. 取消Windows server 2008关机提示的方法
  8. 运行ReactNative工程watchman运行错误
  9. ps如何制作点阵图效果
  10. AndroidP刘海(水滴)形状适配