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…

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…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

git-tf clone 路径有空格处理方案

git-tf clone 路径存在空格情况下,运行命令报错; 需要对路径进行双引号处理

应用TortoiseSVN的SubWCRev管理VisualStudio C#项目编译版本号

首先要安装 TortoiseSVN, 并确保TortoiseSVN的bin目录被加入到系统环境变量Path中。 1、拷贝Porperties目录下的文件AssemblyInfo.cs生成副本AssemblyInfo.template, 作为版本管理的模板文件。 2、修改模板文件中的想要管理的版本号信息 // [assembly: AssemblyVersion(&quo…

MySQL 日期格式 DATETIME 和 TIMESTAMP

MySQL日期格式介绍 存储日期的方式mysql中存储日期的格式datetimetimestampDatetime和Timestamp的比较相同点:不同点: 数值型时间戳(INT)DATETIME vs TIMESTAMP vs INT,怎么选? 存储日期的方式 字符串Date…

EasyAVFilter的初衷:把ffmpeg.c当做SDK来用,而不是当做EXE来用

之前我们做一个视频点播的功能,大概的流程就是将上传上来的各种格式的视频,用FFmpeg统一进行一次转码,如果probe到视频的编码格式是H.264就调用-vcodec copy,如果probe到视频的编码格式不是H.264就调用-vcodec libx264&#xff0c…

SSH远程连接macOS服务器:通过cpolar内网穿透技术实现远程访问的设置方法

文章目录 前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …

kali的学习

网络配置 1.kali的网络设置 首先我们了解kali的网络设置 DHCP:动态主机配置协议 是一个局域网的协议 使用UDP 协议工作静态IP:用于大部分的中小型网络 通过网络管理员手动分配IP原理进程 /etc 系统大部分服务启动过程都要访问该目录 我们直接去看看…

算法笔记:球树

1 KD树的问题 算法笔记:KD树_UQI-LIUWJ的博客-CSDN博客 在kd树中,导致性能下降的最核心因素是因为kd-tree中被分割的子空间是一个个的超方体,而求最近邻时使用的是欧式距离(超球)。超方体与超球体相交的可能性是极高…

keepalived + lvs (DR)

目录 一、概念 二、实验流程命令 三、实验的目的 四、实验步骤 一、概念 Keepalived和LVS(Linux Virtual Server)可以结合使用来实现双机热备和负载均衡。 Keepalived负责监控主备服务器的可用性,并在主服务器发生故障时,将…

maven可用的插件列表

maven可用的插件列表:https://maven.apache.org/plugins/ 在插件列表页面找到自己想要了解的插件,点击进去,可以看到插件的详细信息,例如这个插件有哪些goals,goal的参数、用法、样例等,还是很有用的。 B…