说一下类的生命周期

👽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虚拟机规范,文件格式、版本号、指令信息等等
准备:是为静态变量分配内存赋初始值
解析:是将常量池中的符号引用替换成指向内存的直接引用
初始化阶段会执行静态代码块并为静态变量赋值
使用阶段是程序可以使用类来创建对象、调用方法
卸载的话就是如果一个类不再被使用,且没有任何引用指向它,那么这个类就可能会被垃圾回收,释放内存空间

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开始通过 Amazon SageMaker JumpStart 在亚马逊云科技上使用生成式 AI

目前,生成式 AI 正受到公众的广泛关注,人们围绕着许多人工智能技术展开讨论。很多客户一直在询问有关亚马逊云科技生成式 AI 解决方案的更多信息,本文将为您进行解答。 这篇文章通过一个真实的客户使用案例概述了生成式 AI,提供了…

京东数据分析软件(京东平台数据分析):2023年Q3扫地机器人行业消费报告

随着90后、00后逐渐成为消费主力军,他们对生活品质更加关注、健康意识进一步增强,再加上“懒人经济”的盛行,人们对扫地机器人的使用率和关注热情也不断增长。 根据鲸参谋电商数据分析平台的相关数据显示,今年7月份-9月份&#xf…

Linux ps -ef|grep去除 grep --color=auto信息

linux 监控 进程判断是否启动可通过该指令实现 ps -ef|grep java指令结果为 # -v 参数有过滤作用 ps -ef|grep java |grep -v grep

CentOS 8最小安装,VM使用这个内存占用小很多

文章目录 一、安装包下载作者使用的安装包 二、安装过程截图三、最小化安装拥有的外部命令四、查看ip(方便ssh连接)五、yum源有问题参考文档 一、安装包下载 CentOS 网站: https://www.centos.org/CentOS 维基: https://wiki.cen…

HugeGraph安装与使用

1、HugeGraph-Server与HugeGraph-Hubble下载 HugeGraph官方地址:https://hugegraph.apache.org/ 环境为:linux 官网是有模块版本对应关系,尽量下载较新版本,hubble1.5.0之前是studio功能比较少。官网已经下架server,其他模块下载也比较慢。可以在网上找…

xss-labs靶场1-5关

文章目录 前言一、靶场需要知道的前置知识点1、什么是xss攻击?2、xss攻击分为几大类1、反射型xss2、存储型xss3、dom型xss 3、xss攻击形成的条件 二、xss-labs关卡1-51、关卡12、关卡23、关卡34、关卡45、关卡5 总结 前言 此文章只用于学习和反思巩固xss攻击知识&a…

4.Gin HTML 模板渲染

4.Gin HTML 模板渲染 Gin HTML 模板渲染 1. 全部模板放在一个目录里面的配置方法 创建用于渲染的模板html templates/index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> …

如何入驻抖音本地生活服务商,附上便捷流程!

抖音作为一款短视频社交媒体应用&#xff0c;已经成为全球范围内数以亿计的用户的首选。而在普及的同时&#xff0c;短视频领域也在不断拓展自身的业务领域&#xff0c;其中之一就是本地生活服务。继抖音本地生活服务之后支付宝、视频号也相继开展了本地生活服务&#xff0c;用…

如何在IAR软件中使用STLINK V2编译下载和调试stm8单片机

安装使用IAR后&#xff0c;如使用系统默认设置&#xff0c;往往很难正常实现用stlink v2来下载和调试stm8芯片&#xff0c;我的解决方法如下&#xff1a; 1、打开项目的options菜单&#xff1a; 2、在项目的选项菜单中选择ST-LINK作为调试工具&#xff1a; 3、选择额外的输出…

六、程序员指南:数据平面开发套件

PORT HOTPLUG FRAMEWORK 端口热插拔框架为DPDK应用程序提供在运行时附加和分离端口的能力。由于该框架依赖于PMD实现&#xff0c;PMD无法处理的端口超出了该框架的范围。此外&#xff0c;在从DPDK应用程序分离端口后&#xff0c;该框架不提供从系统中移除设备的方法。对于由物…

1、数仓模型概述

1、问&#xff1a;什么是数据模型&#xff1f; 数仓领域中的模型指的是数据模型&#xff0c;要和商业分析中的模型不同 数据模型就是数据组织和存储方法&#xff0c;它强调从业务、数据存取和使用的角度合理的存储数据 2、问&#xff1a;模型和表的区别&#xff1f; 表是数据物…

只有Target才有PDB

中间的OBJ的debug信息是放在Target里了。

2021秋招-面经

面经总结 微软STCA面试-面经 字节AI lab实习面试记录 腾讯PCG-腾讯新闻面试 百度(AIDU)-内容策略部门面试 百度(AIDU)-搜索策略-机器学习算法工程师 百度(AIDU)-知识图谱部门算法工程师(2020-07-08) 百度(AIDU)-NLP部门算法工程师(2020-07-10) 微软STCA面试-面经 2020-…

HarmonyOS ArkTS 基础组件的使用(四)

1 组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;…

文章系列2:Unraveling the functional dark matter through global metagenomics

这篇文章发布于2023年10月nature。通讯作者是来自于 DOE Joint Genome Institute, Lawrence Berkeley National Laboratory, Berkeley, CA, USA. 背景介绍&目标 作者首先背景介绍了两种主流宏基因组分析方法&#xff0c;包括reads-based reference mapping&#xff08;eg…

8.Gin 自定义控制器

8.Gin 自定义控制器 前言 在上一篇路由文件抽离的过程中&#xff0c;我们发现接口的业务逻辑还写在路由配置中&#xff0c;如下&#xff1a; 1696385129126 但是如果业务逻辑比较多&#xff0c;如果写在路由之中&#xff0c;肯定不合适。 我们可以将业务逻辑抽离&#xff0c;单…

python实战—核心基础4(超市购物小票随机抽奖程序) lv1

目录 一、核心代码解释 二、代码 三、运行截图 一、核心代码解释 1、random() 函数 描述 random() 方法返回随机生成的一个实数&#xff0c;它在[0,1)范围内。 语法 以下是 random() 方法的语法: import randomrandom.random() 注意&#xff1a;random()是不能直接访问…

【高性能计算】CUDA,OpenCL,FPGA 加速,MPI

OpenCL OpenCL&#xff08;Open Computing Language&#xff09;是一种跨平台的GPU加速技术&#xff0c;由Khronos Group开发。OpenCL允许开发人员在不同的硬件平台上编写并行计算应用程序。 OpenCL使用C语言的子集来编写应用程序&#xff0c;并提供了一组API&#xff0c;可以…

Keil MDK 安装

0 Preface/Foreword 1 下载和安装 官网&#xff1a;Keil Embedded Development Tools for Arm, Cortex-M, Cortex-R4, 8051, C166, and 251 processor families. Keil MDK 下载链接&#xff1a;Keil MDK 1.1 下载 根据需求下载对应的Keil MDK edition。 不同的editions包括 …

TensorFlow实战教程(一)-TensorFlow环境部署

从本篇文章开始,作者正式开始研究Python深度学习、神经网络及人工智能相关知识。第一篇文章主要讲解神经网络基础概念,同时讲解TensorFlow2.0的安装过程及基础用法,主要结合作者之前的博客和"莫烦大神"的视频介绍,后面随着深入会讲解具体的项目及应用。基础性文章…