当前位置: 首页 > news >正文

【jvm】类加载分几步

目录

          • 1. 加载(Loading)
          • 2. 链接(Linking)
            • 2.1 验证(Verification)
            • 2.2 准备(Preparation)
            • 2.3 解析(Resolution)
          • 3. 初始化(Initialization)
          • 4. 使用(Using)
          • 5. 卸载(Unloading)

1. 加载(Loading)
  • 1.加载是类加载过程的第一个阶段,由类加载器(ClassLoader)负责执行。
  • 2.通过类的全限定名获取定义此类的二进制字节流:这通常意味着从文件系统、网络或其他来源读取类的.class文件或其他格式的二进制表示。
  • 3.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构:在Java虚拟机(JVM)中,方法区用于存储已被虚拟机加载的类信息常量静态变量即时编译器编译后的代码等数据。
  • 4.在内存中生成一个代表这个类的java.lang.Class对象:这个对象作为方法区这个类的各种数据的访问入口,是程序在运行时访问类的元数据的主要方式。
  • 5. 这些步骤在逻辑上是按顺序进行的,但在实际执行过程中,某些步骤(如解析)可能会与初始化阶段交叉进行,以支持Java语言的动态绑定特性。
2. 链接(Linking)
  • 1.链接过程可以细分为验证(Verification)、准备(Preparation)和解析(Resolution)三个阶段。
2.1 验证(Verification)
  • 1.目的:确保加载的类文件信息符合JVM规范,不会危害虚拟机自身的安全。
  • 2.内容:包括文件格式验证、元数据验证、字节码验证和符号引用验证。这些验证确保了类文件的合法性、合理性和一致性。
2.2 准备(Preparation)
  • 1.任务:为类的静态变量(被static修饰的变量)分配内存设置初始值。这些初始值通常是数据类型默认的零值(如int为0,boolean为false等),而不是被显式赋的值。需要注意的是,如果static变量是final的,并且其基本类型或String类型的值在编译时就已经确定,那么这些值在准备阶段就会被赋上。
2.3 解析(Resolution)
  • 1.过程:将常量池内的符号引用替换为直接引用的过程。符号引用以一组符号来描述所引用的目标,而直接引用则是直接指向目标的指针、相对偏移量或者一个能间接定位到目标的句柄。
3. 初始化(Initialization)
  • 1.初始化阶段是类加载过程的最后一步,主要完成类的静态变量的初始化工作。
  • 2.静态变量的初始化是由类构造器()方法完成的,这个方法由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的。
  • 3.初始化阶段只会在类被主动使用时才会触发,如创建类的实例、访问某个类或接口的静态变量、调用类的静态方法等。
4. 使用(Using)
  • 1.使用阶段是指类被加载、链接和初始化后,通过Java程序中的new关键字创建类的实例,或者通过反射等方式调用类的静态方法、访问静态变量等操作。
  • 2.在这个阶段,类的功能被充分利用,程序执行了类定义中的代码。
5. 卸载(Unloading)
  • 1.卸载是类生命周期的最后一个阶段,也是JVM垃圾回收机制的一部分。
  • 2.当类不再被JVM中的任何对象所引用,即类的所有实例都已被回收,并且加载该类的ClassLoader也已经被回收时,该类就可能被卸载。
  • 3.卸载过程包括释放类在方法区占用的内存空间,以及相关的其他资源。
  • 4.需要注意的是,类卸载并不是强制的,而是由JVM的垃圾回收器来决定的。
http://www.lryc.cn/news/414833.html

相关文章:

  • 使用Apache http client发送json数据(demo)
  • 读零信任网络:在不可信网络中构建安全系统07设备信任
  • 【Java算法专场】前缀和(下)
  • 音视频相关文章总目录
  • 7月31日MySQL学习笔记
  • 什么是容器查询?分享 1 段优质 CSS 代码片段!
  • 【linux深入剖析】初识线程---线程概念
  • 【MySQL】索引——索引的引入、认识磁盘、磁盘的组成、扇区、磁盘访问、磁盘和MySQL交互、索引的概念
  • python部署flask项目
  • 数据建模标准-基于事实建模
  • 量产部落SM2258XT开卡软件,SM2258XT主控128G SSD固态卡死修复
  • 《零散知识点 · 自定义 HandleMapping》
  • 谈谈我对微服务的理解2.0
  • ECCV 2024前沿科技速递:GLARE-基于生成潜在特征的码本检索点亮低光世界,低光环境也能拍出明亮大片!
  • 前端低代码必备:FrontendBlocks 4.0版本重磅发布,助力Uniapp-X原生APP开发
  • 如何将PyCharm 中使用 PDM 管理的 Django 项目迁移到 VS Code 并确保一切正常工作?
  • 认识Android Handler
  • 如何在 Ubuntu VPS 上安装 Cassandra 并运行单节点集群
  • Golang | Leetcode Golang题解之第316题去除重复字母
  • pxe的实验
  • 复杂智能软件系统开发
  • kickstart自动安装脚本
  • linux运维一天一个shell命令之grep详解
  • COMSOL金属氢化物-放氢过程
  • (四)软件性能测试
  • 萱仔大模型学习记录5-langchain实战
  • 安装使用netron
  • JDFrame 一款比 Java 8 Stream 更灵活的数据处理工具
  • 《Android系统开发中高级定制专栏导读》
  • LeetCode 114. 二叉树展开为链表