说一下JVM创建对象的流程?

一、类加载检查

在实例化一个对象的时候,JVM 首先会去检查目标对象是否已经被加载并初始化了。如果没有,JVM 需要立刻去加载目标类,然后调用目标类的构造器完成初始化。然后初始化的过程,主要是对目标类里面的静态变量、成员变量、静态代码块进行初始化

二、分配内存

当目标类被初始化以后,就可以从常量池里面找到对应的类元信息,并且目标对象的大小在类加载之后就已经确定了,所以这个时候就需要为新创建的对象,根据目标对象的大小在堆内存里面分配内存空间。内存分配的方式一般有两种,一种指针碰撞,另一种是空闲列表,JVM 会根据 Java 堆内存是否规整来决定内存分配方式。

  • 指针碰撞:如果Java堆的内存是规整的,即所有用过的内存放在一边,而空闲的的放在另一边。分配内存时将位于中间的指针指示器向空闲的内存移动一段与对象大小相等的距离,这样便完成分配内存工作。

  • 空闲列表:如果Java堆的内存不是规整的,则需要由虚拟机维护一个列表来记录那些内存是可用的,这样在分配的时候可以从列表中查询到足够大的内存分配给对象,并在分配后更新列表记录

划分内存时还需要考虑一个问题-并发,也有两种方式: CAS同步处理,或者本地线程分配缓冲(Thread Local Allocation Buffer, TLAB)。

  • CAS同步处理: 对分配内存空间的动作进行同步处理(采用 CAS + 失败重试来保障更新操作的原子性)

  • 本地线程分配缓冲 TLAB:把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在 Java 堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer, TLAB)。哪个线程要分配内存,就在哪个线程的 TLAB 上分配。只有 TLAB 用完并分配新的 TLAB 时,才需要同步锁。通过-XX:+/-UserTLAB参数来设定虚拟机是否使用TLAB

三、初始化零值

接下来,JVM 会把目标对象里面的普通成员变量初始化为零值,比如 int 类型初始化为0,对象类型初始化为 null,(类变量在类加载的准备阶段就已经初始化过了)。这一步操作主要是保证对象里面的实例字段,不用初始化就可以直接使用,也就是程序能够获得这些字段对应数据类型的零值 。

四、设置对象头

JVM 还需要对目标对象的对象头做一些设置,比如对象所属的类元信息、对象的 GC 分代年龄、hashcode、锁标记等等

五、执行init方法

初始化成员变量的值、执行构造块、最后执行目标对象的构造方法,完成对象的创建。

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

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

相关文章

【CANoe示例分析】EthernetTC8Test

1、工程路径 C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 15.3.89\Ethernet\Test\EthernetTC8Test 在CANoe软件上也可以打开此工程:File|Help|Sample Configurations|Ethernet Testing|TC8Test(Ethernet) 2、示例目的 TC8示例是作者本人使用最多的CANo…

代码随想录day26--贪心基础

什么是贪心 贪心的本质是选择每一阶段的局部最优,从而达到全局最优 举个例子: 有一堆钞票,可以拿走十张,如果想要达到最大的金额,应该怎么拿? 指定每次拿最大的,最终结果就是拿走最大数额的…

MySQL安装、配置与卸载教程(Windows版)

MySQL是一个关系型数据库管理系统,目前为Oracle旗下产品,它具有开源、体积小、速度快的优点,许多网站使用的都是MySQL数据库。 简单而言,MySQL数据库核心功能就是用来存储数据的。 MySQL数据库分为社区版和商业版,这…

idea将文件加入到SVN

文件右键Subversion->Add to Vcs Settings->Version Control->Confirmation 勾上Add silently ,每次自动添加就不用一个个加了

计算机视觉学习指南(划分为20个大类)

计算机视觉的知识领域广泛而庞杂,涵盖了众多重要的方向和技术。为了更好地组织这些知识,我们需要遵循无交叉无重复(Mutually Exclusive Collectively Exhaustive,MECE)的原则,并采用循序渐进的方式进行分类…

ajax 如何从服务器上获取数据?

在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种常用的技术,用于在不重新加载整个页面的情况下,从服务器获取数据并更新网页的某一部分。使用AJAX,你可以创建异步请求,从而提供更快的…

文件上传漏洞--Upload-labs--Pass02--Content-Type绕过

一、什么是 Content-Type 我们在上传文件时利用 Burpsuite 进行抓包,如下图所示: 上传文件后台的源代码可能会对 Content-Type 进行规定,设置白名单 或 黑名单,这时就要利用Content-Type绕过上传含有恶意代码的 php文件。 二、代…

大白话说说Docker容器默认网络模型工作原理

Docker的默认网络模型 —— 桥接模式(Bridge) 当你不做任何特殊设置时,Docker会使用一种叫做“桥接模式”的网络设置。这就像是给你的容器小房子安装了一个虚拟的桥接网络。这座桥连接着容器和你的电脑(宿主机)&#…

Spring Boot项目中TaskDecorator的应用实践

一、前言 TaskDecorator是一个执行回调方法的装饰器,主要应用于传递上下文,或者提供任务的监控/统计信息,可以用于处理子线程与主线程间数据传递的问题。 二、开发示例 1.自定义TaskDecorator import org.springframework.core.task.Task…

摄像设备+nginx+rtmp服务器

前言 由于html中的video现在不支持rtmp协议(需要重写播放器框架,flash被一刀切,360浏览器还在支持flash),遂用rtmp作为桥梁,实际是hls协议在html中起作用. 在此推荐一款前端播放器,.ckplayer 简直了,写点页面,一直循环,洗脑神曲 dream it po…

【rust】7、命令行程序实战:std::env、clap 库命令行解析、anyhow 错误库、indicatif 进度条库

文章目录 一、解析命令行参数1.1 简单参数1.2 数据类型解析-手动解析1.3 用 clap 库解析1.4 收尾 二、实现 grep 命令行2.1 读取文件,过滤关键字2.2 错误处理2.2.1 Result 类型2.2.2 UNwraping2.2.3 不需要 panic2.2.4 ? 问号符号2.2.5 提供错误上下文-自定义 Cust…

山海鲸可视化软件:多场景下的数据呈现利器

在当今数据驱动的时代,数据可视化成为了企业和个人不可或缺的工具。作为一个老数据人,本文想借用自己常用山海鲸可视化软件,带大家了解在不同使用场景下数据可视化的应用。山海鲸可视化是一款可以免费编辑、本地化部署的产品,对数…

小程序域名可以使用免费的SSL证书吗?

对于小程序域名而言,选择何种类型的SSL证书主要取决于小程序域名的具体情况。如果小程序域名是单独的域名,那么可以选择最为常见的免费单域名证书;如果小程序是公司主域名的子域名,则可以选择免费的通配符证书,一张证书…

facebook群控如何做?静态住宅ip代理在多账号运营重的作用

在进行Facebook群控时,ip地址的管理是非常重要的,因为Facebook通常会检测ip地址的使用情况,如果发现有异常的使用行为,比如从同一个ip地址频繁进行登录、发布内容或者在短时间内进行大量的活动等等,就会视为垃圾邮件或…

【架构】GPU虚拟化

GPU虚拟化方法 远程调用API 半虚拟化和全虚拟化 硬件划分 局限:授权付费 Hardware Partition:Ampere 架构的 A100 GPU 所支持的 MIG,即是一种 Hardware Partition。它的问题是不灵活: 只有高端 GPU 支持;只支持 CUDA 计算&#x…

基于springboot校园志愿者管理系统源码和论文

随着信息化时代的到来,管理系统都趋向于智能化、系统化,校园志愿者管理系统也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化,…

电脑恢复删除数据的原理和方法

在恢复数据的时候,很多人都会问,为什么删除的数据还能恢复?本篇和大家一起了解下硬盘上数据的存储方式,文件被删除的时候具体发生了什么,帮助大家理解数据恢复的基本原理。最后还会分享一个好用的数据恢复工具并附上图…

垂起固定翼无人机基础知识,垂起固定翼无人机应用前景,垂起固定翼无人机优缺点分析

无人机定义与类型 无人机,也称为无人驾驶飞行器,是一种无需人工直接操作的航空器。根据其用途、设计及技术特点,可以分为多种类型。垂起固定翼无人机是其中的一种,它具有垂直起降的能力并采用固定翼设计以提高飞行效率和稳定性。…

Excel SUMPRODUCT函数用法(成绩求和,分组排序)

SUMPRODUCT函数是Excel中功能比较强大的一个函数,可以实现sum,count等函数的功能,也可以实现一些基础函数无法直接实现的功能,常用来进行分类汇总,分组排序等 SUMPRODUCT 函数基础 SUMPRODUCT函数先计算多个数组的元素之间的乘积…

解决flask结合layui前端框架模板(laytpl 语法)与gin语法出现冲突的问题。

在模板中加了laytpl的写法 例如: gin框架渲染数据的语法也是{{ }} 例如: 如何两者都出现在html模板页,运行gin框架会识别为框架定义的变量,运行之后发现报如上错误,出现了错误是因为刚好gin的写法也是"{{ 变量 }…