Java类的声明周期、对象的创建过程

一、类的生命周期

  • 使用类时,要先使用类加载器将类的字节码从磁盘加载到内存的方法区中,用Class对象表示加载到内存中的类,Class类是JDK中提供的类
  • 创建对象时,是根据内存中的Class对象,在堆中分配内存,完成对象的创建
    在这里插入图片描述

类的生命周期是指类从被加载到虚拟机内存中开始到卸载出内存为止,它的整个生
命周期可以简单概括为 7 个阶段:

  • 加载(Loading)
  • 验证(Verification)
  • 准备(Preparation)
  • 解析(Resolution)
  • 初始化(Initialization)
  • 使用(Using)
  • 卸载(Unloading)

其中,验证、准备和解析这三个阶段可以统称为连接(Linking)。
注意:

  • 加载类(Loading)是由 类加载器 实现加载的
  • 类加载后在内存中产生一个 Class对象 ,来表示被加载类的元数据
  • 一个类在内存中 只加载一次 ,因此一个类只有一个Class对象

在这里插入图片描述

  • 加载阶段:将字节码加载到内存
  • 验证阶段:验证代码是否符合虚拟机规范,保证代码运行后不会危害虚拟机自身的
    安全
  • 准备阶段:正式为类变量分配内存并设置类变量初始值的阶段
  • 解析阶段:虚拟机将常量池内的符号引用替换为直接引用的过程
  • 初始化阶段:执行初始化是类加载的最后一步,这一步 JVM 才开始真正执行类中定
    义的 Java 程序代码
  • 卸载阶段:卸载阶段是类的 Class 对象被从内存中回收,释放内存

二、对象的创建过程

  • Step1:类加载检查

    虚拟机遇到一条 new 指令时,首先检测类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。

  • Step2:分配内存

    在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。分配方式有 “指针碰撞” 和 “空闲列表” 两种,选择哪种分配方式由 Java 堆是否规整决定,而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

    • 指针碰撞
      • 适用场合:堆内存规整(即没有内存碎片)的情况下。
      • 原理:用过的内存全部整合到一边,没有用过的内存放在另一边,中间有一个分界指针,只需要向着没用过的内存方向将该指针移动对象内存大小位置即可。
    • 空闲列表
      • 适用场合:堆内存不规整的情况下。
      • 原理:虚拟机会维护一个列表,该列表中会记录哪些内存块是可用的,在分配的时候,找一块儿足够大的内存块儿来划分给对象实例,最后更新列表记录。
  • Step3:初始化零值

    内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值,这一步操
    作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用,程序能访
    问到这些字段的数据类型所对应的零值。

  • Step4:设置对象头(了解即可)

    初始化零值完成之后,虚拟机要对对象进行必要的设置,例如这个对象是哪个
    类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄
    等信息。 这些信息存放在对象头中。 另外,根据虚拟机当前运行状态的不同,
    如是否启用偏向锁等,对象头会有不同的设置方式。

  • Step5:执行 init 方法

    在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了,但
    从 Java 程序的视角来看,对象创建才刚开始, 方法还没有执行,所有
    的字段都还为零。所以一般来说,执行 new 指令之后会接着执行 方
    法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全
    产生出来。

对象的创建过程就是类的声明周期中的 使用 阶段
在这里插入图片描述

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

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

相关文章

Servlet与过滤器

目录 Servlet 过滤器 Servlet Servlet做了什么 本身不做任何业务处理,只是接收请求并决定调用哪个JavaBean去处理请求,确定用哪个页面来显示处理返回的数据 Servlet是什么 ServerApplet,是一种服务器端的Java应用程序 只有当一个服务器端的程序使用了Servlet…

网御ACM上网行为管理系统bottomframe.cgi接口存在SQL注入漏洞 附POC

文章目录 网御ACM上网行为管理系统bottomframe.cgi接口存在SQL注入漏洞 附POC1. 网御ACM上网行为管理系统简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 网御ACM上网行为管理系统bottomframe.cgi接口存在SQL注入漏洞 附POC 免责声明&am…

自然语言处理(NLP)是什么?

NLP(自然语言处理) 和 Phoebe Liu 的简介 您有没有和聊天机器人互动过?或者您是否向虚拟助手,例如 Siri、Alexa 或您车上的车载娱乐系统发出过某些请求?您使用过在线翻译吗?我们大多数人都曾与这些人工智能 (AI) 互动过&#xff…

自步学习的介绍 self paced learning

这方面的研究专家,参考西安交通大学的 孟德宇老师 他最近的研究方向: Fundamental problems in machine learning and computer vision, especially including: Meta-learning Variational bayesian methods on inverse problems Robust and interpret…

ELK安装、部署、调试(三)zookeeper安装,配置

1.准备 java安装,系统自带即可 2.下载zookeeper zookeeper.apache.org上可以下载 tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /usr/local mv apache-zookeeper-3.7.1-bin zookeeper 3.配置zookeeper mv zoo_sample.cfg zoo.cfg /usr/local/zookeeper/con…

匿名内部类、Lambda、方法引用 的总结

在今天的项目中看到这样一行代码 Integer syncCount consumer.consumerInfo( Collections.singletonList(KafkaTopicConst.Event_BMS_SYSLOG_ROLE),consumer::handle); 直接傻眼,无法理解consumer::handle这种用法,因此总结如下 consumer::handle这种写…

微前端:重塑大型项目的前沿技术

引言 随着互联网技术的飞速发展,前端开发已经从简单的页面制作逐渐转变为复杂的应用开发。在这个过程中,传统的前端开发模式已经难以满足大型项目的需求。微前端作为一种新的前端架构模式,应运而生,它旨在解决大型项目中的前端开…

如何使用 ChatGPT 快速制作播客和其他长篇内容

使用ChatGPT快速制作播客和其他长篇内容是一个高效且具有一定创造性的过程。以下是一些详细的步骤和技巧,以帮助你充分利用ChatGPT来制作高质量的内容。 一、准备阶段 确定主题或话题:在开始制作之前,你需要明确你的播客或长篇内容将聚焦的主…

从0-1的docker镜像服务构建

文章目录 摘要一、环境准备1、docker安装2、docker-compose安装 二、镜像制作2.1、编写Dockerfile文件2.1.1、熟悉常用Dockerfile命令2.1.2、制作php镜像案例 2.2、build镜像 三、docker-compose管理容器3.1、编写docker-compose.ymal配置文件3.2、编写systemctl配置 摘要 由于…

C++-list实现相关细节和问题

前言:C中的最后一个容器就是list,list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指…

【面试经典150题】买卖股票的最佳时期 JavaScript版

题目链接 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…

力扣:77. 组合(Python3)

题目: 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平…

方面级别情感分析之四元组预测

情感四元组预测现有方法 阅读本文之前我们默认你对情感分析有基本的认识。 如果没有请阅读文章(https://tech.tcl.com/post/646efb5b4ba0e7a6a2da6476) 情感分析四元组预测涉及四个情感元素: 方面术语a,意见术语(也叫观点术语)o, 方面类别ac&#xff0c…

0基础学习VR全景平台篇 第93篇:智慧景区教程

一、上传素材 1.上传全景素材 第一步:进入【素材管理】 第二步:选择【全景图智慧景区】分类 第三步:选择相对景区作品分组,上传全景素材 2.素材标注 第一步:选择上传成功后素材,点击【未标注】 第二步&…

15-数据结构-二叉树的遍历,递归和非递归

简介: 本文主要是代码实现,二叉树遍历,递归和非递归(用栈)。主要为了好理解,直接在代码处,加了详细注释,方便复习和后期默写。主要了解其基本思想,为后期熟练应用…

VMware 设置仅主机模式无法访问外网的问题说明

参考链接 VMware仅主机模式访问外网 如果根据以上参看仍旧无法访问物理机网段其他设备以及无法访问外网,可以尝试在虚拟机上根据 vmnet1 网卡设置的 ip 地址添加默认路由,如下图所示: 首先查看对应网卡设置的 ip 地址 然后在虚拟机上执行如…

Android学习之路(6) 其他UI控件

ImageView(图像视图) RadioButton(单选按钮)&Checkbox(复选框) 开关按钮ToggleButton和开关Switch ProgressBar(进度条) SeekBar(拖动条) RatingBar(星级评分条) ScrollView(滚动条)

为什么别的职业都是越老越值钱,唯独程序员越老越容易失业?

因为其他职业都是技术稀缺型产业,而程序员却是技术密集型产业。 那些越老越值钱的职业有一个特征:越资深越稀缺,靠技术经验积累或是人脉资源吃饭,如医生、律师、老师等,而程序员这一职业的技术经验、人脉资源的积累相对…

使用Axios中的onUploadProgress实现显示文件上传进度

onUploadProgress 是 Axios 这个 JavaScript 库中用于处理 HTTP 请求的一个配置选项之一。Axios 是一个基于 Promise 的 HTTP 客户端,用于在浏览器和 Node.js 中进行 HTTP 请求。 onUploadProgress 允许指定一个回调函数,在上传进度发生变化时被调用。这…

jeecgboot vue3使用DatePicker组件设置可用日期

文档: Ant Design Vue文档 设置不能选择今天之前的日期 (1)使用表单的formSchema中的componentProps组件属性通过disabledDate设置 import dayjs, {Dayjs} from "dayjs";{label: 日期,field: guidDate,component: DatePicker,dy…