当前位置: 首页 > article >正文

大白话读懂java对象创建的过程

1. java对象创建流程(大白话版)

咱们java对象被创建的过程大致如下,即:

在 JVM 中对象的创建,从⼀个 new 指令开始:
  1. 首先检查这个指令的参数是否能在常量池中定位到⼀个类的符号引用
  2. 检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,就先执行相应的类加载过程
  3. 类加载检查通过后,接下来虚拟机将为新生对象分配内存
  4. 内存分配完成之后,虚拟机将分配到的内存空间(但不包括对象头)都初始化为零值。
  5. 接下来设置对象头,请求头⾥包含了对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。

没听懂?没关系,咱们来看看下面这个例子:

想象你在秋招时一路过关斩将,现在终于准备入职了,这时候会有以下流程:

  1. 背景调查 → 检查类是否已加载(HR查你的学历)
  2. 分配工位 → 分配内存(给你分一个工位)
  3. 初始化设备 → 内存清零(工位电脑装好系统)
  4. 贴工牌 → 设置对象头(给你发工牌和权限)
  5. 入职培训 → 执行构造函数(教你公司规则)

    这个入职的流程就跟咱们java对象创建的过程差不多,下面咱们来分步骤一一详解。

    2. 分步骤详解

    Step 1:类加载检查

    new指令触发时,JVM会问:"这个类合法吗?"

    这时候会检查常量池中的符号引用,触发类加载机制加载 → 验证 → 准备 → 解析 → 初始化


    Step 2:分配内存

    • 方式1:指针碰撞(内存规整时)
    • 方式2:空闲列表(内存碎片化时)

    通过CAS + 失败重试保证线程安全,可能使用TLAB(线程私有分配缓冲区)

    就好像工位分配有两种策略:连续工区直接划一块(指针碰撞),或从碎片工位里拼凑(空闲列表)。

    指针碰撞:假设 Java 堆中内存是 绝对规整 的,所有被使用过的内存都被放在⼀边,空闲的内存被
    放在另⼀边,中间放着⼀个指针作为分界点的指针,那所分配内存就仅仅是把那个指针向空闲空
    间⽅向挪动⼀段与对象大小相等(这里假设是两块内存大小单位)的距离。

    空闲列表:如果 Java 堆中的内存并 不是规整的 ,已被使用的内存和空闲的内存相互交错在⼀起,
    那就没有办法简单地进行指针碰撞了,虚拟机这时候就必须维护⼀个列表,记录上哪些内存块是可用的, 在分配的时候从列表中找到⼀块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”。

    Step 3:内存清零

    将分配的内存初始化为零值(int→0,boolean→false,引用→null),保证对象实例字段不赋初值也能直接使用。就好比给你的工位电脑格式化,装好干净的系统。


    Step 4:设置对象头

    对象头内容:

    • Mark Word:哈希码、GC分代年龄、锁状态等
    • 类型指针:指向类元数据的指针

    对象头占12字节(64位JVM开启压缩指针时),就好像给你工牌贴上姓名、工号、部门等信息。


    Step 5:执行构造函数

    执行<init>方法(显式初始化成员变量),从子类到父类递归调用构造函数

    HR带你熟悉公司,布置你的工位(这才是你看到的new Object()的最终效果)。

          步骤                   技术细节                 比喻
    类加载检查双亲委派机制,元数据验证入职前的背景调查
    分配内存CAS + TLAB避免并发冲突抢会议室避免冲突
    内存清零零值初始化(JVM层)工位电脑格式化
    对象头设置Mark Word + 类型指针工牌信息(姓名/部门)
    构造函数执行程序员可见的初始化(Java层)布置工位(放私人物品)

    3. 代码示例

    Object obj = new Object();

    JVM背后做的事:

    1. 检查Object类是否加载 → 没加载则加载类
    2. 分配内存(假设8字节)
    3. 内存清零 → 所有字段为0/null
    4. 设置对象头(MarkWord + 类型指针指向Object.class)
    5. 调用Object的构造函数(这里是个空方法)

    4. 高频面试问题

    (1)为什么先清零再执行构造函数?
    :保证对象创建时字段一定有初始值(避免脏数据)。

    (2)内存分配如何保证线程安全?
    : CAS + 失败重试 或 TLAB(线程本地分配缓冲)。

    (3)对象头和对象体是什么关系?
    :对象头是元数据(如锁、GC信息),对象体是实例数据。

    相关文章:

    大白话读懂java对象创建的过程

    1. java对象创建流程&#xff08;大白话版&#xff09; 咱们java对象被创建的过程大致如下&#xff0c;即&#xff1a; 在 JVM 中对象的创建&#xff0c;从⼀个 new 指令开始&#xff1a; 首先检查这个指令的参数是否能在常量池中定位到⼀个类的符号引用检查这个符号引用代表…...

    Ubutu20.04安装docker与docker-compose

    系统&#xff1a;20.04.6 LTS (Focal Fossa)" 1.配置apt源(在/etc/apt/sources.list中输入以下内容) # deb cdrom:[Ubuntu 20.04.6 LTS _Focal Fossa_ - Release amd64 (20230316)]/ focal main restricted deb http://mirrors.aliyun.com/ubuntu/ focal main restricted …...

    AI图像理解技术的演进

    在CLIP等现代多模态模型出现之前&#xff0c;早期的图生文技术主要依赖人工标注的ImageNet等数据集&#xff0c;但其技术路线与当前方法存在本质差异。 一、传统图生文技术的标注依赖 ImageNet的核心地位 在2012-2020年间&#xff0c;ImageNet的1,400万张人工标注图像&#xff…...

    STM32 —— MCU、MPU、ARM、FPGA、DSP

    在嵌入式系统中&#xff0c;MCU、MPU、ARM、FPGA和DSP是核心组件&#xff0c;各自在架构、功能和应用场景上有显著差异。以下从专业角度详细解析这些概念&#xff1a; 一、 MCU&#xff08;Microcontroller Unit&#xff0c;微控制器单元&#xff09; 核心定义 集成系统芯片&a…...

    aiosignal

    文章目录 安装 一、关于 aiosignal Github : https://github.com/aio-libs/aiosignal官方文档&#xff1a;https://aiosignal.aio-libs.org/gitter聊天&#xff1a;https://gitter.im/aio-libs/Lobby许可证 : Apache 2 aiosignal 管理 asyncio 项目中回调的项目。 Signal是已…...

    在 VSCode 远程开发环境下使用 Git 常用命令

    在日常开发过程中&#xff0c;无论是单人项目还是团队协作&#xff0c;Git 都是版本管理的利器。尤其是在使用 VSCode 连接远程服务器进行代码开发时&#xff0c;Git 不仅能帮助你管理代码版本&#xff0c;还能让多人协作变得更加高效。本文将介绍一些常用的 Git 命令&#xff…...

    电脑节电模式怎么退出 分享5种解决方法

    在使用电脑的过程中&#xff0c;许多用户为了节省电力&#xff0c;通常会选择开启电脑的节能模式。然而&#xff0c;在需要更高性能或进行图形密集型任务时&#xff0c;节能模式可能会限制系统的性能表现。这时&#xff0c;了解如何正确地关闭或调整节能设置就显得尤为重要了。…...

    kubernetes高级实战

    一、模拟企业环境进行一个实战部署 [rootmaster node]# kubectl apply -f pod-tomcat.yaml pod/tomcat-test created [rootmaster node]# kubectl get pods NAME READY STATUS RESTARTS AGE tomcat-test 2/2 Running 0 2s [rootmaster node]…...

    【Java】——程序逻辑控制(构建稳健代码的基石)

    &#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;【Java】内容概括 文章目录&#xff1a; 一.顺序结构二.分支结构1.if 语句1.1 语法格式11.2 语法格式21.3 语法格式3 …...

    QT编程之PCM音频处理

    一、高级播放接口&#xff08;未压缩编码的音频文件&#xff09; ‌QMediaPlayer‌ 支持MP3/WMA等压缩格式及网络流媒体播放&#xff0c;集成媒体控制&#xff08;播放/暂停/进度调节&#xff09;需设置QAudioOutput指定输出设备&#xff0c;支持播放速度调节&#xff08;setPl…...

    卫星互联网智慧杆:开启智能城市新时代​

    哇哦&#xff01;在当下这个数字化浪潮正以雷霆万钧之势席卷全球的超酷时代&#xff0c;智慧城市建设已然成为世界各国你追我赶、竞相发力的核心重点领域啦&#xff01;而咱们的卫星互联网智慧杆&#xff0c;作为一项完美融合了卫星通信与物联网顶尖技术的创新结晶&#xff0c;…...

    Numpy broadcasting规则

    Numpy的broadcast操作是为了将两个不同形状的数组&#xff0c;通过一系列规则&#xff0c;变换成形状相同的数组&#xff0c;从而使得它们之间可以进行按元素进行的计算。 Broadcasting的机制并不复杂&#xff0c;只要记住以下几条规则就可以了&#xff1a; 1. 顺序。首先&am…...

    掌握 Shopee 商品数据:用爬虫解锁无限商机

    在电商的浩瀚宇宙中&#xff0c;Shopee 宛如一颗璀璨星辰&#xff0c;吸引着无数卖家与买家在此汇聚。对于电商从业者、市场调研人员或是数据分析师而言&#xff0c;获取 Shopee 店铺的商品信息就如同掌握了开启财富之门的钥匙。而爬虫技术&#xff0c;正是帮助我们高效获取这些…...

    Qt-QChart实现折线图

    一、介绍场景 动态查看数据变化&#xff0c;或者了解数据发展趋势&#xff0c;让数据可以形象直观展现出来&#xff0c;这里推荐使用折线图的方式展现&#xff0c;本文抛砖引玉&#xff0c;简单实现一个实例&#xff0c;效果图如下&#xff1a; 二、实现步骤 1、charts组件 …...

    取消Win10锁屏界面上显示的天气、市场和广告的操作

    要取消Win10锁屏界面上显示的天气、市场和广告&#xff0c;您可以按照以下步骤操作&#xff1a; 方法一&#xff1a;更改锁屏界面设置 打开“设置”&#xff1a; 点击“开始”菜单&#xff0c;然后点击齿轮状的“设置”图标。 进入“个性化”&#xff1a; 在“设置”窗口中&a…...

    IoT设备测试:从协议到硬件的全栈验证体系与实践指南

    一、引言&#xff1a;IoT技术浪潮下的质量挑战 根据IDC预测&#xff0c;到2027年全球IoT设备数量将突破290亿台&#xff0c;涵盖智能家居、工业物联网&#xff08;IIoT&#xff09;、智慧城市、车联网等场景。然而&#xff0c;IoT系统的复杂性远超传统嵌入式设备——硬件异构性…...

    大白话详细解读React框架的diffing算法

    1. Diffing 算法是什么&#xff1f; Diffing 算法是 React 用来比较虚拟 DOM&#xff08;Virtual DOM&#xff09;树的一种算法。它的作用是找出前后两次渲染之间的差异&#xff08;diff&#xff09;&#xff0c;然后只更新这些差异部分&#xff0c;而不是重新渲染整个页面。 …...

    自然语言处理入门

    第一章 自然语言处理入门 1 什么是自然语言处理 【什么是人工智能&#xff0c;分别对应哪几个领域】 AI是模仿甚至超越人的某项机能&#xff0c;NLP、CV、ASR NLP是机器理解并生成人类语言2 自然语言处理的发展简史 1950 -- 图灵提出“机器能思考吗”&#xff0c;划时代性的…...

    Arduino示例代码讲解:Pitch follower 跟随

    Arduino示例代码讲解:Pitch follower 跟随 Pitch follower代码功能代码逐行解释1. 注释部分功能:硬件连接:2. `setup()` 函数3. `loop()` 函数硬件连接**扬声器连接**:**光敏电阻连接**:**Arduino板**:运行结果修改建议视频讲解Pitch follower 这段代码是一个Arduino示例…...

    从TouchDriver Pro到Touchdriver G1,Weart触觉手套全系解析:XR交互的“真实触感”如何实现?

    Weart旗下的Touchdriver Pro触觉手套和Touchdriver G1触觉手套&#xff0c;凭借其技术创新&#xff0c;为用户带来了全新的触觉体验。Touchdriver Pro触觉手套通过多模态触觉反馈技术&#xff0c;提供力反馈、纹理渲染和温度提示&#xff0c;让用户在虚拟环境中感受到真实的触觉…...

    华为OD机试-阿里巴巴找黄金宝箱(I)-双指针(Java 2023 B卷 100分)

    题目描述 阿里巴巴在去砍柴的路上发现了强盗集团的藏宝地,藏宝地有编号从 0 到 N 的箱子,每个箱子上贴有一个数字。黄金宝箱满足排在它之前的所有箱子数字和等于排在它之后的所有箱子数字和。第一个箱子左边部分的数字和定义为 0;最后一个宝箱右边部分的数字和定义为 0。请…...

    ubuntu20如何升级nginx到最新版本(其它版本大概率也可以)

    前言&#xff1a; Nginx非常常用&#xff0c;所以在网络安全方面备受“关注”。其漏洞非常多&#xff0c;要经常保持软件更新版本才能更好的保证安全。但是Ubuntu官网适配nginx非常慢&#xff0c;所以nginx官方也会推出针对主流Linux操作系统的包管理工具安装方式。 步骤&…...

    排序算法实现:插入排序与希尔排序

    目录 一、引言 二、代码整体结构 三、宏定义与头文件 四、插入排序函数&#xff08;Insertsort&#xff09; 函数作用 代码要点分析 五、希尔排序函数&#xff08;ShellSort&#xff09; 函数作用 代码要点分析 六、打印数组函数&#xff08;PrintSort&#x…...

    UDP协议原理

    UDP协议原理 本篇介绍 在前面使用UDP编程时已经基本了解了UDP的工作模式&#xff0c;也知道了UDP有三个特点&#xff1a; 无连接不可靠面向数据报 但是当时并没有具体谈论为什么UDP有以上三个特点&#xff0c;基于这个原因&#xff0c;本篇就会针对这三个原因进行介绍 UDP…...

    EtherCAT转Modbus网关如何在倍福plc组态快速配置

    EtherCAT转Modbus网关如何在倍福plc组态快速配置 在工业控制领域&#xff0c;EtherCAT和Modbus是两种常见的总线通信协议。EtherCAT以其高速的数据传输和灵活的网络配置被广泛应用于高性能自动化控制系统中&#xff0c;而Modbus则因其简单、稳定且兼容性强而被许多设备所支持。…...

    如何设计大模型意图识别?

    环境&#xff1a; 大模型 问题描述&#xff1a; 如何设计大模型意图识别&#xff1f; 解决方案&#xff1a; 1. 意图识别定义与核心任务 定义&#xff1a;意图识别&#xff08;Intent Recognition&#xff09;是从用户输入&#xff08;文本、语音等&#xff09;中解析其核…...

    FPGA设计中时间单位科普

    FPGA设计中时间单位主要有秒s&#xff0c;毫秒ms&#xff0c;微秒us&#xff0c;纳秒ns&#xff0c;皮秒ps&#xff0c; 使用秒s作为单位时一定要谨慎&#xff0c;因为秒s对于FPGA来说是一个很大的单位。FPGA的时钟周期通常是20ns左右&#xff0c;1秒意味着需要等待50000000个…...

    DooTask在Linux的离线部署教程

    DooTask在Linux的离线部署教程 下载安装包 从网盘中将安装包下载到本地&#xff0c;下载地址 通过网盘分享的文件&#xff1a;DooTask项目管理工具 链接: https://pan.baidu.com/s/1hGmLXonT4c8hLiDP1QBr8w?pwdgdp6 提取码: gdp6 通过网盘分享的文件&#xff1a;DooTask项目…...

    Python实现WYY音乐下载

    一、需求背景 WYY音乐作为国内主流音乐平台,其歌曲资源丰富但下载接口存在多重加密保护。本文将通过Python结合JS逆向技术,解析其核心加密逻辑,实现免费歌曲的下载功能。 二、技术难点分析 1. 接口加密机制 通过抓包分析可知,网易云核心接口使用两次加密: 第一次:获取…...

    Java基础面试题学习

    转换成自已的语言来回答&#xff0c;来源小林coding、沉默王二以及其它资源和自已改编。 1、概念 1、说一下Java的特点 我认为Java有很多特点 首先是平台无关性&#xff1a;Java可以实现一次编译到处运行&#xff0c;因为Java的编译器将源代码编译成字节码&#xff0c;使得该…...