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

类的生命周期

文章目录

  • 类的生命周期
    • 加载阶段
    • 连接阶段
      • 验证
      • 准备
      • 解析
    • 初始化阶段

类的生命周期

生命周期:加载 -> 连接 -> 初始化 -> 使用 -> 卸载

加载阶段

加载阶段主要完成以下两个步骤:

  • 加载类的字节码文件

    • 类加载器(Class Loader)负责从文件系统、网络或其他来源找到类的字节码文件(.class文件),并将其读入到JVM中。
    • 类加载器通常按需加载,即第一次使用该类时才加载。
  • 数据存储

    • 一旦字节码文件被读入JVM,它将被存储在方法区(Method Area)中。生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。方法区是JVM内存中的一个逻辑区域,用于存储类结构信息,如字段、方法、构造函数等。
    • 在这个阶段,JVM会在堆中为这个类创建一个对应的java.lang.Class对象,作为方法区中这个类的各种数据的访问入口。对于开发者来说,只需要访问堆中的Class对象而不需要访问方法区中所有信息。 这样Java虚拟机就能很好地控制开发者访问数据的范围。

连接阶段

验证

连接(Linking)阶段的第一个环节是验证,验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规 范》中的约束。这个阶段一般不需要程序员参与。

主要包含如下四部分:

  • 文件格式验证,比如文件是否以0xCAFEBABE开头,主次版本号是否满足当前Java虚拟机版本要求。
  • 元信息验证,例如类必须有父类(super不能为空)。
  • 验证程序执行指令的语义,比如方法内的指令执行到一半强行跳转到其他方法中去。
  • 符号引用验证,例如是否访问了其他类中private的方法等。

准备

准备阶段是连接阶段的第二步,它为类变量分配内存,并设置默认初始值。这些变量所使用的内存都在方法区中进行分配。准备阶段需要完成以下工作:

  • 分配内存:为类变量分配内存,这些变量不包括实例变量,实例变量会在对象实例化时随着对象一起分配在堆内存中。
  • 设置默认值:为类变量设置默认初始值,例如int类型的变量默认值为0,对象的引用默认值为null。(final修饰的基本数据类型的静态变量,准备阶段直接会将代码中的值进行赋值。)

解析

解析阶段是连接阶段的第三步,它是将类、接口、字段和方法的符号引用(字节码文件中使用编号来访问常量池中的内容)转换为直接引用(内存地址)的过程。

初始化阶段

  • 初始化阶段会执行静态代码块中的代码,并为静态变量赋值。执行流程与代码流程一致。
  • 初始化阶段会执行字节码文件中clinit部分的字节码指令。

请添加图片描述

以下几种方式会导致类的初始化:

  • 访问一个类的静态变量或者静态方法,注意变量是final修饰的并且等号右边是常量不会触发初始化。
  • 调用Class.forName(String className)。
  • new一个该类的对象时。
  • 执行Main方法的当前类。

java8中添加-XX:+TraceClassLoading 参数可以打印出加载并初始化的类

java8以上版本可添加-Xlog:class+load=info参数打印出加载并初始化的类

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【ORACLE】独有的函数
  • Azure OpenAI models being unable to correctly identify model
  • 新办建筑智能化专项乙级设计资质,郑州企业需要达到哪些要求?
  • 枚举专题.
  • 有效寻找潜在客户的五个方法
  • Docker常用操作(基础篇)
  • 主动学习和贝叶斯优化 - smartly collect data
  • 2024外滩大会:机器人汽车飞机都来了
  • MIT License:全面解析与商用指南
  • C++---string类常见接口
  • MySQL 8.0.24 表 ‘/tmp/#sql1_f519f_7‘ 已满
  • Linux常见操作指令
  • VScode:前端开发中的常用快捷键和技巧
  • Comsol 点激励条件下薄板声辐射响应
  • C#游戏服务器开发框架设计与架构详解
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Bytom交易说明(账户管理模式)
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • emacs初体验
  • ES6之路之模块详解
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript类型识别
  • Mysql数据库的条件查询语句
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • 创建一个Struts2项目maven 方式
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 给初学者:JavaScript 中数组操作注意点
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 码农张的Bug人生 - 见面之礼
  • 入口文件开始,分析Vue源码实现
  • 使用putty远程连接linux
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 责任链模式的两种实现
  • 阿里云移动端播放器高级功能介绍
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​Linux·i2c驱动架构​
  • # 数论-逆元
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • (04)odoo视图操作
  • (19)夹钳(用于送货)
  • (9)STL算法之逆转旋转
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (全注解开发)学习Spring-MVC的第三天
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转) Face-Resources
  • (转)负载均衡,回话保持,cookie
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .htaccess 强制https 单独排除某个目录
  • .NET Framework .NET Core与 .NET 的区别