JVM系列(六) -对象的创建过程

news2024/9/27 7:21:57

一、摘要

在之前的文章中,我们介绍了类加载的过程和 JVM 内存布局相关的知识。本篇我们综合之前的知识,结合代码一起推演一下对象的真实创建过程,以及对象创建完成之后在 JVM 中是如何保存的。

二、对象的创建

在 Java 中,创建对象的方式有很多种,比如最常见的通过new xxx()来创建一个对象,通过反射Class.forName(xxx).newInstance()来创建对象等。其实无论是哪种创建方式,JVM 底层的执行过程是一样的。

对象的创建过程,可以用如下图来简要概括。

创建对象大致分为 5 个步骤:

  • 1.检查类是否加载,如果没有就先执行类的加载
  • 2.分配内存
  • 3.初始化零值
  • 4.设置头对象
  • 5.执行初始化方法,例如构造方法等

下面我们一起来看下每个步骤具体的工作内容。

2.1、类加载检查

当需要创建一个类的实例对象时,比如通过new xxx()方式,虚拟机首先会去检查这个类是否在常量池中能定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化,如果没有,那么必须先执行类的加载流程;如果已经加载过了,会在堆区有一个类的 class 对象,方法区会有类的相关元数据信息。

为什么在对象创建时,需要有这一个检查判断?

主要原因在于:类的加载,通常都是懒加载,只有当使用类的时候才会加载,所以先要有这个判断流程

关于类的加载过程,在之前的文章中已经有所介绍,有兴趣的朋友可以翻看之前的文章。

2.2、分配内存

类加载成功后,虚拟机就能够确定对象的大小了,此时虚拟机会在堆内存中划分一块对象大小的内存空间出来,分配给新生对象。

虚拟机如何在堆中分配内存的呢?

主要有两种方式:

  • 1.指针碰撞法
  • 2.空闲列表法

下面我们一起来看看相关的内存分配方式。

2.2.1、指针碰撞法

如果内存是规整的,那么虚拟机将采用指针碰撞法来为对象分配内存。

指针碰撞法,简单的说就是所有用过的内存在一边,空闲的内存在另一边,中间放着一个指针作为分界点的指示器,分配内存时会把指针向空闲一方挪动一段,直到能容纳对象大小的位置。

如果垃圾收集器选择的是 Serial、ParNew 这种基于压缩算法的,虚拟机会采用这种分配方式。

2.2.2、空闲列表法

如果内存不是规整的,已使用的内存和未使用的内存相互交错,那么虚拟机将采用空闲列表法来为对象分配内存。

空闲列表法,简单的说就是在虚拟机内部维护了一个列表,会记录哪些内存块是可用的,在分配的时候会从列表中找到一块能容纳对象大小的空间,划分给对象实例,并更新列表上的内容。

如果垃圾收集器选择的是 CMS 这种基于标记-清除算法的,虚拟机会采用这种分配方式。

2.2.3、内存分配安全问题

我们知道,虚拟机是支持多个线程同时分配内存的,是否会有线程安全的问题呢?

答案是:肯定存在的。比如用指针碰撞法时,虚拟机正在给对象 A 分配内存,但指针还没来及修改,此时又有一个线程给对象 B 分配内存,同时使用了原来的指针来分配,最后的结果就是这个区域只分配来一个对象,另一个对象被覆盖了。

针对内存分配时存在的线程安全问题,虚拟机采用了两种方式来进行处理:

  • CAS+重试机制:通过 CAS 操作移动指针,只有一个线程可以移动成功,移动失败的线程重试,直到成功为止
  • TLAB (thread local Allocation buffer):也称为本地线程分配缓冲,这个处理方式思想很简单,就是当线程开启时,虚拟机会为每个线程分配一块较大的空间,然后线程内部创建对象的时候,就从自己的空间分配,这样就不会有并发问题了,当线程自己的空间用完了才会从堆中分配内存,之后会转为通过 CAS+重试机制来解决并发问题

以上就是虚拟机解决对象内存分配时存在的线程安全问题的措施。

2.3、初始化零值

初始化零值,顾名思义,就是对分配的这一块内存初始化零值,也就是给实例对象的成员变量赋于零值,比如 int 类型赋值为 0,引用类型为null等操作。这样对象就可以在没有赋值情况下使用了,只不过访问对象的成员变量都是零值。

2.4、设置头对象

初始化零值完成之后,虚拟机就会对对象进行必要的设置,比如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息,这些信息都会存放在对象头中。这部分数据,官方称它为“Mark Word”。

在 HotSpot 虚拟机中,对象在内存中存储的布局可以分为 3 块区域:对象头 (Header)、 实例数据 (Instance Data) 和对齐填充位 (Padding)。

以 32 位的虚拟机为例,对象的组成可以用如下图来简要概括。(64位的虚拟机略有不同)

各部分区域功能如下:

  • 对象头:分为 Mark Word 和元数据区,如果是数组对象,还有记录数组长度的区域。这三块保存着对象的 hashCode 值,锁的状态,类元数据指针,对象的分代年龄等等信息。
  • 实例数据:顾名思义,用于保存对象成员变量的值,如果变量是引用类型,保存的是内存地址
  • 对齐填充位:因为 HotSpot 虚拟机要求对象的起止地址必须是 8 字节的整数倍,也就是要求对象的大小为 8 字节的整数倍,如果不足 8 字节的整数倍,那么就需要通过对齐填充进行占位,补够 8 字节的

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

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

相关文章

【SpringBoot】使用Redis

目录 0. 安装Redis 1. 导入依赖 2. 配置Redis 3. idea连接Redis 4. 使用Redis简单实现记录访问次数 1. 配置拦截器 2. 定义拦截器 3. 控制器类 0. 安装Redis 我使用的是本地Redis服务器&#xff0c;安装过程。安装完成后启动Redis服务。 1. 导入依赖 <!-- red…

SQL常见100面试题解析

文章目录 内容简介SQL 初级查询SQL 高级查询设计与开发总结 内容简介 本文介绍并分析了常见的 100 道 SQL 面试题&#xff0c;主要分为三个模块&#xff1a;SQL 初级查询、SQL 高级查询以及数据库设计与开发。内容结构如下图所示&#xff1a; 本文主要使用三个示例表&#xf…

Github 2024-09-06 Java开源项目日报Top10

根据Github Trendings的统计,今日(2024-09-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9TypeScript项目2非开发语言项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache License …

Java队列详细解释

队列 一、什么是队列&#xff08;Queue&#xff09; java队列是一种线性数据结构&#xff0c;它的特点是先进先出。在队列中&#xff0c;元素的添加&#xff08;入队&#xff09;操作在队尾进行&#xff0c;而元素的移除&#xff08;出队&#xff09;操作则在队头进行。因此&a…

『功能项目』账号登陆注册界面UI搭建【27】

打开上一篇26DOTween动态文字的项目&#xff0c; 本章要做的事情是搭建账号登录界面&#xff0c;输入账号及密码存储到本地数据库&#xff0c;本地数据库数据是否可登陆游戏进入游戏场景&#xff0c;如果没有账号可以通过账号注册来进入游戏&#xff0c;之后每次账号输入使用注…

项目日志——框架模块设计实用工具类的设计、实现、测试

文章目录 框架模块设计功能叙述模块划分模块关系图 实用工具类设计实现测试 框架模块设计 功能叙述 日志系统的作用就是将一条消息格式化指定格式的字符串之后&#xff0c;写入到指定位置 这个指定位置就有说法了 标准输出指定文件滚动文件 我们可以写入到其中的一种&…

半天攻略:用ChatGPT快速搞定高质量论文,从选题到完稿一站式指南!

在学术论文的撰写过程中&#xff0c;ChatGPT可以作为一个强大的辅助工具&#xff0c;帮助完成从确定主题到整理参考文献的各个环节。接下来&#xff0c;我们将详细介绍如何利用ChatGPT提升论文写作的效率和质量。 确定论文主题 初步探索&#xff1a;通过ChatGPT探索主题&#…

UAEXpert连接kepserver的OPC服务时,出现BadCertificateHostNamelnvalid报错--解决办法

描述&#xff1a; 虚拟机win10安装kepserver&#xff0c;本机的uaexpert软件连接虚拟机上的OPC UA服务&#xff0c;遇到BadCertificateHostNamelnvalid报错问题 报错信息如下&#xff1a; Error BadCertificateHostNamelnvalidwas returned during CreateSession,press Ignor…

Spring事务和事务传播机制(下)

我们上一篇文章学习了 Transactional 的基本使用。接下来我们学习 Transactional 注解的使用细节。 Transactional 注解当中有下面三个常见属性&#xff1a; 1、rollbackFor&#xff1a;异常回滚属性。指定能够触发事务回滚的异常类型。可以指定多个异常类型 2、IsoIation&…

开学季好物狂欢,这些神仙好物让你开学季事半功倍!

随着秋风送爽&#xff0c;开学季再次悄然而至。对于即将迎接新学期的学生们来说&#xff0c;这不仅仅是一个新起点&#xff0c;也是准备全新装备、挑战更高学习效率的好时机。在这个特殊的时节&#xff0c;我们特别为大家策划了一场“开学季好物狂欢”&#xff0c;精选了一系列…

数字人直播防封技巧升级!头部源码厂商如何实现7*24小时无间断直播?

当前&#xff0c;许多用户在使用数字人直播的过程中都遇到了直播间违规和账号被封两大问题&#xff0c;并因此蒙受了一定的损失。在此背景下&#xff0c;不少有计划引入数字人直播的企业和搭建数字人直播系统的创业者也开始有了犹豫。为了让大家能够更放心地入局&#xff0c;本…

Linux之MySQL日志

前言 数据库就像一个庞大的图书馆&#xff0c;而日志则是记录这个图书馆内每一本书的目录。正如在图书馆中找到特定书籍一样&#xff0c;数据库日志帮助我们追溯数据的变更、定位问题和还原状态。 在MySQL中&#xff0c;日志是非常重要的一个组成部分&#xff0c;它记录了数据…

创客匠人对话:如何让客户主动为你付费?北大教授发售秘籍大公开

老蒋创客圈第65期对话标杆直播连麦&#xff0c;我们邀请到【YD世界人才创造社】平台创始人白钰玮老师。为我们分享“家庭教育赛道如何创新模式&#xff0c;单场发售实现高创收&#xff1f;”&#xff0c;深度剖析如何去提升自己的核心竞争力&#xff1f;如何提升个人影响力&…

引领AI PC浪潮,Arm人工智能创新应用大赛火热报名中

AI PC&#xff0c;即搭载人工智能技术的个人电脑&#xff0c;正成为个人电脑市场的新宠儿。而正在如火如荼进行中的 Arm人工智能创新应用大赛&#xff0c;则为敏锐的开发者探索 AI PC 应用开发掘金之路提供了平台。 点击报名 挑战10万奖金池 AI PC 增长强劲&#xff0c;年出货…

2024跨境旺季营销:多渠道广告覆盖中,哪些平台是首选?

跨境电商的旺季即将来临&#xff0c;对于卖家们来说&#xff0c;如何进行有效的营销推广至关重要。在多渠道广告覆盖的策略下&#xff0c;选择合适的平台成为关键。那么&#xff0c;哪些平台是跨境旺季营销的首选呢&#xff1f; 一、社交媒体平台 1、Instagram 以图片和短视频…

易保全出席人工智能应用场景高峰论坛,发布AI-数据资产管理平台2.0应用成果

2024年9月5日&#xff0c;由上海合作组织国家多功能经贸平台、重庆市科技发展基金会指导&#xff0c;重庆市渝中区商务委员会等相关部门主办、华智未来(重庆)科技有限公司承办&#xff0c;重庆民营经济国际合作商会协办的“智驭未来创想无界人工智能应用场景高峰论坛暨成果发布…

使用 nuxi init 创建全新 Nuxt 项目

title: 使用 nuxi init 创建全新 Nuxt 项目 date: 2024/9/6 updated: 2024/9/6 author: cmdragon excerpt: 摘要:本文介绍了如何使用nuxi init命令创建全新的Nuxt.js项目,包括安装所需环境、命令使用方法、指定模板、强制克隆、启动开发服务器等步骤,并提供了完整的项目初…

DAY87 APP 攻防-安卓逆向篇Smail 语法反编译签名重打包Activity 周期Hook 模块

1、APK 逆向-数据修改-结构&格式 2、APK 逆向-逻辑修改-Smail 语法 3、APK 逆向-视图修改-Activity&Xml #章节点&#xff1a; 1、APP 资产-内在提取&外在抓包 2、APP 逆向-反编译&删验证&重打包 3、APP 安全-存储&服务&组件&注册等 演示案例&a…

RasberryPi 3B树莓派基本配置

RaspberryPi 3B树莓派基本配置 文章目录 RaspberryPi 3B树莓派基本配置一、准备工作1.1 硬件准备&#xff1a;1.1.1 树莓派和电源适配器&#xff1a;1.1.2 USB转TTL模块&#xff1a;1.1.3 读卡器和TF卡&#xff1a; 1.2 软件准备&#xff1a;1.2.1 下载 Raspberry Pi OS&#x…

SpringMvc后续3

返回值问题 ModelAndView返回 字符串返回 转发和重定向 默认返回页面是转发效果 如果需要重定向&#xff0c;在返回页面的时候&#xff0c;追加redirect:&#xff0c;后边需要追加视图后缀 Ajax返回 控制层 jsp文件 导入json包 Session问题