说一下类的生命周期

news2024/11/15 13:12:59

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,双非大四,Java实习中…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:接下来的三个月里,对梦想的追逐 ");

文章

    • 类的生命周期
      • 加载阶段
      • 连接阶段
        • 验证:验证内容是否满足《Java虚拟机规范》
        • 准备:给静态变量赋初始值
        • 解析:将常量池中的符号引用替换成指向内存的直接引用
      • 初始化阶段
    • 总结回答

类的生命周期

描述了一个类加载、使用、卸载的整个过程
生命周期: 加载、连接、初始化、使用、卸载

  • 连接:验证、准备、解析

加载阶段

  1. 加载阶段:通过类加载器把字节码信息(类的信息)加载到内存中,Java虚拟机在方法区和堆区各保存一个对象
  • 第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。程序员可以使用Java代码拓展的不同的渠道
    • 本地文件:磁盘上的字节码文件
    • 动态代理生成:程序使用动态代理生成
    • 通过网络传输的类:早期的Applet技术使用
  • 类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。
    • 生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。

image.png

  • 同时Java虚拟机还会再堆中生成一份与方法区中数据类似的java.lang.Class对象
    • 作用是在Java代码中去获取类的信息以及存储静态字段的数据(JDK8之后)

image.png

思考1:为什么需要在方法区和堆区都要创建一个对象?image.png

  • InstanceKlass对象是使用C++编写的对象,Java代码一般不能直接操作
  • 堆区中的Java.lang.Class是使用Java包装后的对象,Java程序员可以获取到
    • 字段是少于InstanceKlass对象的字段的(控制开发者访问数据的范围,保证安全性)

思考2:在类的加载阶段怎么查看内存中的对象?

  • 使用jdk自带的hsdb工具查看Java虚拟机内存信息。工具位于JDK安装目录lib文件夹下的sa-jdi.jar中。
  • 启动命令:java -cp sa-jdi.jar sun.jvm.hotspot.HSDB
  • image.png

image.png

  • jps 是 Java 虚拟机自带的一个小工具,用于列出当前系统上所有正在运行的 Java 进程的主类名和它们各自的 Java 虚拟机参数。可以在命令行中直接运行 jps 命令来查看当前系统上正在运行的 Java 进程列表。

image.png

连接阶段

验证:验证内容是否满足《Java虚拟机规范》
  1. 文件格式验证
    1. 格式是否正确:文件以0xcafebabe开头
    2. 主次版本号是否满足当前Java虚拟机的要求【主版本号不能高于运行环境主版本号;如果主版本号相同,副版本号也不能超过】
  2. 元信息验证
    1. 比如:super不能为空,一定有父类Object
  3. 验证程序执行指令的语义
    1. 比如:方法内的指令执行中跳转到不正确或不存在的位置
  4. 符号引用验证
    1. 比如:是否访问了其他类中private的方法等
准备:给静态变量赋初始值
  • 为静态变量分配内存并设置初始值,每一种基本类型和引用类型都有初始值
数据类型初始值数据类型初始值
int0byte0
long0Lbooleanfalse
short0double0.0
char‘\u0000’引用数据类型null

注意: final修饰的基本数据类型的静态变量,准备阶段直接会将代码中的值进行赋值

解析:将常量池中的符号引用替换成指向内存的直接引用
  • 符号引用:在字节码文件中使用编号来访问常量池中的内容,并不是直接引用
  • 直接引用:在字节码文件中不再使用编号,而是使用内存中地址进行访问具体的数据

初始化阶段

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

  • clinit方法中的执行顺序与Java中编写的顺序一致

添加Java虚拟机参数 -XX:+TraceClassLoading 开启功能打印出加载并初始化的类
怎样会触发类的初始化操作?

  1. 访问一个类的静态变量或者静态方法
  • 注意:静态变量是final修饰的并且等号右边是常量不会触发初始化(在连接的准备阶段就会被赋值-初始化)
  1. 调用Class.forName(String className)
  2. new 一个该类的对象时
  3. 执行Main方法的当前类

clinit指令在特定情况下不会出现

  1. 没有静态代码块且没有静态变量赋值语句
  2. 有静态变量的声明,但没有赋值语句(初始化目的是为了给静态变量赋值)
  3. 静态变量是final修饰的并且等号右边是常量(在连接的准备阶段就会被赋值-初始化)

注意:

  • 访问父类的静态变量。只初始化父类
  • 数组的创建不会导致数组中的类进行初始化:new的是数组
  • final修饰的变量右边不是一个单纯的常量,如果需要执行指令才能得出结果,则会执行clinit方法进行初始化

总结回答

类的生命周期有加载、连接、初始化、使用、卸载
加载阶段是通过类加载器把字节码信息加载到内存中,转换成内部可识别的信息,存放在方法区和堆上。字节码信息可以通过本地文件、网络传输和动态代理生成
连接阶段又被分为验证、准备和解析。
验证:是否符和Java虚拟机规范,文件格式、版本号、指令信息等等
准备:是为静态变量分配内存赋初始值
解析:是将常量池中的符号引用替换成指向内存的直接引用
初始化阶段会执行静态代码块并为静态变量赋值
使用阶段是程序可以使用类来创建对象、调用方法
卸载的话就是如果一个类不再被使用,且没有任何引用指向它,那么这个类就可能会被垃圾回收,释放内存空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1236337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

同为科技(TOWE)桌面PDU插排:一款可以DIY定制的“超级插座”

当今社会,各种电子产品和家用电器已成为人们日常生活中不可或缺的一部分,在带给人们便利的同时,也使得电力使用变得更加频繁和重要。然而,当前市面上很多普通插座由于功能单一、材质粗劣、插口数量受限、充电速度过慢、插头间互相…

Vue 项目实战——如何在页面中展示 PDF 文件以及 PDFObject 插件实战

文章目录 📋前言🎯使用 HTML 标签🧩 embed 标签🧩 object标签🧩 iframe标签🧩完整代码 🎯使用 PDFObject 插件🧩为什么使用 PDFObject 插件(AI翻译)&#x1f…

Gitlab安装与操作

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。 可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的…

c++|引用

目录 一、引用概念 二、引用特性 三、常引用 (具有常属性的引用变量) 四、使用场景 一、引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,他和他引用的变量共用同…

C++ 使用c++类模板实现动态数组-可实现自定义数据类型存储

.hpp文件 #include <iostream> #include <cstdlib> #include <cstring> using namespace std; template <class T> class arraylist { private:T* data ;//数组地址int size;//长度int count;//容量public:arraylist();~arraylist();void add(T t);T&…

革新突破!智能指标平台引领时代,国产大模型与企业级部署的完美结合

11月21日&#xff0c;跬智信息&#xff08;Kyligence&#xff09;圆满召开了线上数智论坛暨产品发布会&#xff0c;升级智能一站式指标平台 Kyligence Zen 及 AI 数智助理 Kyligence Copilot 的一系列企业级能力&#xff0c;包括正式支持智谱 AI、百川智能等在内的多款国产大模…

什么是数字化工厂?企业数字化转型有什么好处?

科技在发展&#xff0c;时代在进步&#xff0c;全球信息化、数字化的步伐越来越快&#xff0c;数字化转型是否成功也成为企业在未来发展中能否做大做强的关键因素。而数字化工厂就是制造业数字化发展的一个重要发展方向&#xff0c;那么究竟什么是数字化工厂呢&#xff1f;它和…

IDEA如何将本地项目推送到GitHub上?

大家好&#xff0c;我是G探险者。 IntelliJ IDEA 是一个强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它支持多种编程语言和工具。它也内置了对Git和GitHub的支持&#xff0c;让开发者可以轻松地将本地项目推送到GitHub上。以下是一个操作手册&#xff0c;描述了…

JSP:Tag文件的使用

需求&#xff1a;多个JSP页面可能需要使用一些相同的信息 例如:导航栏、标题等。 目标&#xff1a;提高这些相同信息的代码的复用性。 方法&#xff1a;将这些相同的元素形成一种特殊的文件&#xff0c;以便所有页面都可以使用&#xff0c;即&#xff1a;Tag文件 1、Tag对…

关于lenra你需要了解的

monorepo&#xff1a;项目代码管理方式&#xff0c;单个仓库中管理多个项目是一种设计思想 lenra&#xff1a;是一种工具&#xff0c;对于使用npm和git管理多软件包代码仓库的工作流程进行优化 使用这些工具的优点&#xff1a; 公共依赖只要安装一次&#xff0c;Monorepo 中…

阿里云ECS服务器如何搭建并连接FTP,完整步骤

怎么用终端连接服务器就不多说了&#xff0c;直接开始搭建FTP。 我是用root账号执行的命令&#xff0c;如果不使用root账号&#xff0c;注意在命令前面加sudo。 一、安装FTP 我这里安装的是vsftpd。 1、检查是否已安装vsftpd&#xff1a; vsftpd -v如果出现了版本信息&…

JAVAEE---多线程

内核 内核时操作系统的核心 操作系统有内核态和用户态&#xff0c;像我们平时所用到的qq音乐&#xff0c;微信等都属于用户态执行的程序。那么qq音乐播放音乐需要用到扬声器&#xff0c;扬声器的操作就是在内核空间进行操作&#xff0c;用户态不能对其进行操作。 操作系统 …

QT专栏2 -Qt for Android

#2023年11月18日 # Qt version 6.6 JDK17 JDK 安装 Java Downloads | Oracle 设置环境变量 鼠标右键我的电脑&#xff0c;出现如下界面 Qt配置 改用JDK18&#xff0c;没有乱码&#xff0c;由于不影响APK产生。 做了好多尝试&#xff0c;更换JDK版本(11,18,19,21)&…

Python+OpenCV裂缝面积识别系统(部署教程&源码)

1.研究背景与意义 随着科技的不断发展&#xff0c;计算机视觉技术在各个领域中得到了广泛的应用。其中&#xff0c;图像处理是计算机视觉中的一个重要分支&#xff0c;它通过对图像进行数字化处理&#xff0c;提取出其中的有用信息&#xff0c;为后续的分析和应用提供支持。而…

Git——感谢尚硅谷官方文档

Git——尚硅谷学习笔记 第1章 Git 概述1.1 何为版本控制1.2 为什么需要版本控制1.3 版本控制工具1.4 Git 简史1.5 Git 工作机制1.6 Git 和代码托管中心 第2章 Git 安装第 3 章 Git 常用命令3.1 设置用户签名3.2 初始化本地库3.3 查看本地库状态3.4 添加暂存区3.4.1 将工作区的文…

大数据平台红蓝对抗 - 磨利刃,淬精兵! | 京东云技术团队

一、背景 目前大促备战常见备战工作&#xff1a;专项压测&#xff08;全链路压测、内部压测&#xff09;、灾备演练、降级演练、限流、巡检&#xff08;监控、应用健康度&#xff09;、混沌演练&#xff08;红蓝对抗&#xff09;&#xff0c;如下图所示。随着平台业务越来越复…

限时开发、码力全开、2w奖金!AGI Hackathon等你挑战!

AGI时代&#xff0c;我们已不再满足于简单的产品开发&#xff0c;与大模型结合的无限想象力&#xff0c;成为开发者们新的追求。 你有能力将想法转化为现实吗&#xff1f;你有勇气接受挑战&#xff0c;创造全新的AI应用吗&#xff1f; 如果你有热情&#xff0c;有信心&#xff…

深度学习之生成唐诗案例(Pytorch版)

主要思路&#xff1a; 对于唐诗生成来说&#xff0c;我们定义一个"S" 和 "E"作为开始和结束。 示例的唐诗大概有40000多首&#xff0c; 首先数据预处理&#xff0c;将唐诗加载到内存&#xff0c;生成对应的word2idx、idx2word、以及唐诗按顺序的字序列。…

注册中心CAP架构剖析

Nacos 支持 AP 或 CP AP Nacos 通过临时节点实现 AP 架构&#xff0c;将服务列表放在内存中&#xff1b; CP Nacos 通过持久化节点实现 CP 架构&#xff0c;将服务列表放在文件中&#xff0c;并同步到内存&#xff0c;通过 Raft 协议算法实现&#xff1b; 通过配置 epheme…

中科创达:所有产品都可以用生成式AI重做一遍

对于制造企业的数字化转型来说&#xff0c;生成式AI究竟具备怎样的意义和价值&#xff1f; 在与亚马逊云科技的合作中&#xff0c;中科创达对此有着深刻的领会和感悟。 生成式AI助力制造业数字化转型 “科技是第一生产力”&#xff0c;对于这句脍炙人口的名言&#xff0c;制造企…