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

基础篇五 你以为 new 一下就完事了?Java 对象诞生背后的五道关卡

文章目录一、全流程概览二、第一关类加载检查——JVM 认不认识你三、第二关分配内存——给对象找个房子并发安全两个人抢同一间房怎么办四、第三关零值初始化——毛坯房刷白墙五、第四关设置对象头——装门牌号和监控对象头包含什么六、第五关执行构造方法——精装修完整执行顺序七、回到全貌一张图串起来八、面试速答模板个人网站写代码时new Person()一敲对象就出来了——就像你在餐厅点个菜菜就端上来了。但你有没有想过厨房里到底经历了什么食材采购、清洗切配、大火爆炒、摆盘装饰……你看到的只是最后一秒。Java 对象的创建也是一样。你以为只是一句newJVM 却在背后默默跑了五道流程哪一道出了问题你的对象都活不了。今天我们就去后厨看看一个 Java 对象到底是怎么被造出来的。一、全流程概览一个对象从new到可用要经过以下五步new Person() │ ├─ ① 类加载检查 → 你这个类 JVM 认识吗 ├─ ② 分配内存 → 给对象找个房子 ├─ ③ 零值初始化 → 毛坯房刷白墙字段设默认值 ├─ ④ 设置对象头 → 装门牌号和监控HashCode、GC 分代年龄等 └─ ⑤ 执行构造方法 → 精装修你写的赋值逻辑下面逐步拆解保证你看完就懂。二、第一关类加载检查——JVM 认不认识你当 JVM 遇到new Person()第一件事不是分配内存而是问Person 这个类加载了吗就像你去酒店入住前台先查你有没有预约记录。没有对不起先去办手续。PersonpnewPerson();JVM 会检查Person这个符号引用是否已在方法区中已加载→ 直接进入下一步未加载→ 触发类加载过程加载 → 验证 → 准备 → 解析 → 初始化加载完再继续这就是为什么有时候new一个对象会触发一堆 static 代码块执行——类加载的初始化阶段会执行clinit()方法里面包含了所有 static 变量赋值和 static 代码块。classPerson{static{System.out.println(类加载了);// new 之前会先执行}}newPerson();// 控制台输出类加载了三、第二关分配内存——给对象找个房子类加载通过后JVM 要给对象分配一块内存。对象需要多大JVM 根据类信息一算就知道——就是所有实例变量不包括静态变量占的空间。分配方式取决于堆内存是否规整而是否规整取决于垃圾收集器是否带压缩整理分配方式适用场景原理指针碰撞Bump the Pointer堆内存规整如 Serial、ParNew、CMS 带压缩移动指针即可高效空闲列表Free List堆内存不规整如 CMS 不压缩模式维护一个哪些空间空闲的列表分配时查找指针碰撞 ┌────┬────┬────┬────┬──────────────────────┐ │ 对象│ 对象│ 对象│ 对象│ 空闲空间 │ └────┴────┴────┴────┴──────────────────────┘ ↑ 指针 分配后指针右移即可 空闲列表 ┌────┬ ┬────┬ ┬────┬──────────────┐ │ 对象│空闲│ 对象│ 空闲 │ 对象│ 空闲 │ └────┴ ┴────┴ ┴────┴──────────────┘ 需要查表找到合适大小的空闲块并发安全两个人抢同一间房怎么办对象分配是高频操作线程 A 和线程 B 可能同时抢同一块内存。JVM 用两种方案解决方案一CAS 失败重试对分配动作做原子操作抢到了就分配抢不到就重试。方案二TLABThread Local Allocation Buffer每个线程在 Eden 区预先分一小块私有空间先在自己的地盘上分配用完了再去公共区域用 CAS 抢。大部分情况下都在 TLAB 里分配几乎无竞争。// 开启 TLAB默认开启-XX:UseTLAB面试加分点TLAB 虽好但空间有限。对象太大或 TLAB 用完还是要走 CAS 在 Eden 区分配。四、第三关零值初始化——毛坯房刷白墙内存分到后JVM 会把这块空间全部初始化为零值不包括对象头类型零值int0long0Lfloat0.0fdouble0.0dbooleanfalsechar‘\u0000’引用类型nullclassPerson{intage;Stringname;booleanalive;}PersonpnewPerson();// 此时age 0, name null, alive false// 但你一行赋值代码都还没执行这一步保证了 Java 代码即使不赋初值也不会拿到随机垃圾值——C/C 程序员流下了羡慕的泪水。注意这里的零值初始化和构造方法中的赋值是两回事。如果构造方法里写了age 18那先被初始化为 0再被构造方法改为 18。五、第四关设置对象头——装门牌号和监控这一步是很多人忽略的但对 JVM 至关重要。JVM 会在对象头中设置对象头包含什么┌─────────────────────────────────────────────┐ │ 对象头 │ ├──────────────┬──────────────┬───────────────┤ │ Mark Word │ 类型指针 │ 数组长度 │ │ (8 字节) │ 4/8 字节 │ 仅数组对象 │ └──────────────┴──────────────┴───────────────┘Mark Word标记字段——存的是重量级信息对象的 HashCode第一次调用时才计算并存入GC 分代年龄经过几次 GC 还活着锁状态标志无锁、偏向锁、轻量级锁、重量级锁偏向线程 ID类型指针——指向类元数据JVM 通过它知道这个对象是Person还是Dog。数组长度——只有数组对象才有普通对象不需要。面试常考点synchronized 的锁升级过程就记录在 Mark Word 中。从无锁 → 偏向锁 → 轻量级锁 → 重量级锁Mark Word 的存储内容会随之变化。六、第五关执行构造方法——精装修前面四步都是 JVM 自动完成的到这一步终于轮到你的代码登场了。JVM 会执行init()方法也就是你写的构造方法classPerson{intage18;// 实例变量赋值 → 编译后放进 init()Stringname张三;// 实例变量赋值 → 编译后放进 init()Person(){// 构造方法age25;// 会覆盖上面的 18System.out.println(对象创建完毕);}}newPerson();// 执行顺序// 1. 零值初始化age0, namenull// 2. 实例变量赋值age18, name张三// 3. 构造方法体age25, 打印对象创建完毕完整执行顺序如果你有父类顺序更完整1. 父类静态变量赋值 父类 static 代码块类加载时只执行一次 2. 子类静态变量赋值 子类 static 代码块类加载时只执行一次 3. 父类实例变量赋值 4. 父类构造方法 5. 子类实例变量赋值 6. 子类构造方法classAnimal{static{System.out.println(1: Animal 静态代码块);}{System.out.println(3: Animal 实例代码块);}Animal(){System.out.println(4: Animal 构造方法);}}classDogextendsAnimal{static{System.out.println(2: Dog 静态代码块);}{System.out.println(5: Dog 实例代码块);}Dog(){System.out.println(6: Dog 构造方法);}}newDog();// 输出1 → 2 → 3 → 4 → 5 → 6为什么静态代码块只执行一次因为类加载只发生一次。而实例代码块和构造方法是每次 new 都执行的。七、回到全貌一张图串起来new Dog() │ ├─ ① 类加载检查 │ Animal 已加载→ 是 │ Dog 已加载 → 否 → 触发类加载 │ ├─ 加载 Animal.class → 执行 Animal clinit输出 1 │ └─ 加载 Dog.class → 执行 Dog clinit输出 2 │ ├─ ② 分配内存堆上分配 Dog 实例所需空间 │ ├─ ③ 零值初始化所有字段设为默认值 │ ├─ ④ 设置对象头Mark Word 类型指针 │ └─ ⑤ 执行 init() ├─ 调用父类 init() │ ├─ Animal 实例代码块输出 3 │ └─ Animal 构造方法输出 4 ├─ Dog 实例代码块输出 5 └─ Dog 构造方法输出 6八、面试速答模板QJava 对象的创建过程A五步——① 类加载检查确保类已被加载未加载则先触发类加载② 分配内存根据类信息计算大小在堆上分配方式有指针碰撞和空闲列表③ 零值初始化将内存空间初始化为零值保证字段有默认值④ 设置对象头存入 HashCode、GC 分代年龄、锁状态、类型指针等⑤ 执行构造方法按先父类后子类的顺序执行实例变量赋值和构造方法体。Q对象分配内存时的并发问题怎么解决A两种方案——① CAS 失败重试保证分配动作的原子性② TLAB线程本地分配缓存每个线程在 Eden 区预分一小块私有空间优先在私有空间分配用完再用 CAS 在公共区域分配。TLAB 默认开启能消除大部分竞争。Q对象头里存了什么A主要存两块信息——Mark Word 存储 HashCode、GC 分代年龄、锁状态标志、偏向线程 ID 等类型指针指向类元数据JVM 据此确定对象属于哪个类。数组对象还会额外存储数组长度。相关文章原文阅读内容有帮助点赞、收藏、关注三连评论区等你

相关文章:

基础篇五 你以为 new 一下就完事了?Java 对象诞生背后的五道关卡

文章目录一、全流程概览二、第一关:类加载检查——JVM 认不认识你?三、第二关:分配内存——给对象找个"房子"并发安全:两个人抢同一间房怎么办?四、第三关:零值初始化——毛坯房刷白墙五、第四关…...

MyBatis RowBounds分页踩坑实录:一次线上OOM事故教会我的事

MyBatis分页陷阱:从RowBounds内存泄漏到高效分页实战 凌晨三点,手机突然响起刺耳的报警声。打开监控系统一看,某核心服务的堆内存曲线像坐了火箭一样直线上升,最终触发了OOM崩溃。经过彻夜排查,罪魁祸首竟是项目中一段…...

Java Loom插件部署实录(2024最新版IDEA/Eclipse兼容清单+离线安装包获取通道)

第一章:Java 项目 Loom 响应式编程转型指南Project Loom 与响应式编程并非互斥范式,而是可协同演进的技术路径。Loom 的虚拟线程(Virtual Threads)为传统阻塞式 I/O 密集型响应式栈(如 Spring WebFlux Reactor&#x…...

【Spring Boot 4.0 Agent-Ready 架构终极指南】:20年架构师亲授生产级字节码增强实战秘技

第一章:Spring Boot 4.0 Agent-Ready 架构全景认知Spring Boot 4.0 首次将 JVM Agent 集成能力深度融入核心启动生命周期,标志着可观测性、安全增强与运行时治理从“可选插件”跃迁为“原生契约”。Agent-Ready 并非仅指支持 Java Agent 加载&#xff0c…...

算一笔账:招剪辑师VS用易元AI,一年的成本差距有多大?

电商短视频成本,正在成为压在商家头上的一座隐形大山。在当前环境下,AI省人工成本已经不再是“锦上添花”,而是影响利润结构的关键变量。越来越多团队开始重新审视一个问题:继续招剪辑师,还是用AI替代? 当内…...

当n和L大到1e18时,别再暴力模拟了!详解‘3437 melon’吃瓜问题的O(1)公式推导与边界条件处理

极端数据规模下的算法优化:从暴力模拟到O(1)公式推导 在算法竞赛和高性能编程中,我们常常会遇到数据规模极其庞大的问题。当输入参数达到1e18量级时,传统的暴力模拟或动态规划方法往往无法在合理时间内完成计算。本文将以经典的"3437 me…...

基于西门子S7-1500 PLC的空压站自控系统设计方案

基于西门子S7-1500 PLC的空压站自控系统设计方案 摘 要 本文针对空压站自控系统需求,基于西门子S7-1500系列PLC(可编程逻辑控制器),配合华杰(华茂)分布式I/O模块,设计了一套完整的群控控制方案。系统涵盖10台空压设备通信、水泵变频恒压控制、阀门联动控制及现场控制柜…...

从调试到量产:高通QDCM与QDCM-FF工具链全解析,实现‘千屏一面’的屏幕一致性校准

从调试到量产:高通QDCM与QDCM-FF工具链全解析,实现‘千屏一面’的屏幕一致性校准 在智能手机和平板电脑的制造过程中,屏幕显示质量的一致性一直是困扰硬件工程师的难题。想象一下,当消费者购买同一型号的两台设备,却发…...

AI辅助设计系统定制方案

一、系统概述 本系统旨在打造一套集成平面设计、三维设计、办公管理、CAD设计及视频制作五大核心功能的AI辅助设计平台。系统采用微服务架构,前端基于React + TypeScript + TailwindCSS构建统一的工作台界面,后端各领域能力以独立服务形式部署,通过API网关统一对外提供服务…...

[盖茨同步带] 盖茨 Poly Chain® ADV® 同步带 | ADV 14MGT/19MGT

关键词:盖茨 Poly Chain ADV 型号,同步带 Poly Chain ADV,工业皮带描述:盖茨Poly Chain ADV同步带参数详解,涵盖材质、规格、适配设备及核心优势,专业工业皮带选型参考,支持价格咨询与定制服务&…...

XML 用途

XML 用途 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它被广泛应用于互联网和内部系统中,用于数据的表示、存储和交换。本文将详细介绍XML的用途,帮助读者全面了解这一重要的技术。 XML的基本概念 什么是XML? XML是一种标记语言,它使用标签来定义…...

如何在Mac上安装飞秋:跨平台局域网通信的终极解决方案

如何在Mac上安装飞秋:跨平台局域网通信的终极解决方案 【免费下载链接】feiq 基于qt实现的mac版飞秋,遵循飞秋协议(飞鸽扩展协议),支持多项飞秋特有功能 项目地址: https://gitcode.com/gh_mirrors/fe/feiq 还在为Mac与Windows电脑之间…...

如何彻底释放华硕笔记本的隐藏性能?G-Helper轻量控制工具全解析

如何彻底释放华硕笔记本的隐藏性能?G-Helper轻量控制工具全解析 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, …...

内容运营的配图噩梦:我是怎么用工具批量给文章插入图片解决的

如果你经常需要给大量文章加配图,手动操作的效率瓶颈你一定深有体会。上周同事找我帮忙,说他那积压了快三百篇历史文章要重新发布到新平台。这些文章都是纯文本格式,当初写的时候没配图,现在平台要求必须带图才有推荐。他之前试过…...

SVG 文本:设计与实现详解

SVG 文本:设计与实现详解 引言 SVG(可缩放矢量图形)文本是网页设计中常用的元素之一,它允许开发者创建可缩放的文本,并具有丰富的样式和动画效果。本文将详细介绍SVG文本的设计与实现,包括其基本概念、使用方法以及在实际项目中的应用。 SVG文本的基本概念 1. SVG简介…...

如何防御SQL注入恶意代码_对上传文件执行严格过滤

...

Linux设备树实战:如何为IMX6ULL开发板定制dts文件(附完整编译流程)

Linux设备树实战:如何为IMX6ULL开发板定制dts文件(附完整编译流程) 在嵌入式Linux开发中,设备树(Device Tree)已经成为硬件描述的标准方式。对于使用NXP i.MX6ULL处理器的开发者来说,掌握设备树…...

SAP PP生产订单状态管理实战:从系统状态到用户状态,手把手教你配置审批流与差异控制

SAP PP生产订单状态管理实战:从系统状态到用户状态深度配置指南 在制造业数字化转型浪潮中,SAP PP模块作为生产计划与执行的中枢神经,其订单状态管理能力直接决定了企业生产流程的精细度与合规性。不同于基础教程对状态概念的简单罗列&#x…...

企业网站设计|网站建设公司哪家好?2026十家网站制作公司深度盘点

在数字经济与产业融合持续推进的当下,企业网站不再是单一的线上展示窗口,而是承载品牌形象、业务衔接、用户交互的核心数字化载体。2026 年,国内网站建设行业逐步完成从模板化搭建到定制化开发的转型,多终端适配、数据安全防护、多…...

大师之上,再造大师:玲珑轮胎“三个向上”战略的深度解码

4月16日,玲珑大师二代轮胎如约而至。这不仅仅是一款新品的亮相,更是玲珑轮胎在五十年发展长河中,对“中国第一,世界一流”这一目标的又一次庄严兑现。 玲珑轮胎总裁周令坤在发布会上,将玲珑的战略路径凝练为“三个向上…...

【限时首发|内部白皮书节选】Spring Boot 4.0 Agent-Ready架构设计规范V1.2(含12个不可绕过的SPI扩展点与8个已知CVE规避方案)

第一章:Spring Boot 4.0 Agent-Ready架构的演进背景与核心定位随着云原生可观测性标准(OpenTelemetry、eBPF、W3C Trace Context)的成熟,以及Java平台对JVM TI、JVMTI Attach API和Instrumentation API的持续增强,传统…...

Rust Trait 对象的动态派发

Rust Trait对象的动态派发:灵活多态的实现之道 在Rust中,Trait对象是实现运行时多态的核心机制之一。与静态派发不同,动态派发通过Trait对象在运行时决定调用哪个具体实现,为代码提供了更大的灵活性。这种机制尤其适合需要处理多…...

医用电气环境测试GB/T 14710-2009实战解读

做医疗器械注册、检测和研发的人,基本都绕不开 GB/T 14710-2009。它不只是一份合规标准,更是医用电气设备的环境适应性 “生存考试”,专门验证设备在医院、库房、运输途中能不能稳定扛住各种工况。标准把设备按气候环境和运输强度分成 Ⅰ、Ⅱ…...

基于STM32LXXX的无线收发芯片(SI4732-A10-GSR)应用程序设计

一、简介: Si4732-A10数字CMOS调幅/调频/短波/低频/射频数字接收器集成电路,实现了从天线输入端到数字音频输出端的完整广播调谐与接收功能。该器件采用Silicon Labs经过广播验证的数字低中频架构,为消费电子应用提供高性价比的数字音频平台,具备优异的时分多址抗噪能力、卓…...

基于STM32LXXX的无线收发芯片(Ci24R1)应用程序设计

一、简介: Ci24R1 是南京中科微推出的一款工作在 2.4GHz ISM 频段的 GFSK/FSK 无线收发芯片。它在设计上高度兼容 nRF24L01+ 的寄存器映射,常被视为低成本替代方案,同时增加了与 BLE4.2 的物理层兼容性 。 二、主要技术特性: ◼ 工作在2.4GHz ISM频段 ◼ 调制方式:GFSK…...

南北阁Nanbeige4.1-3B计算机组成原理:CPU设计模拟

南北阁Nanbeige4.1-3B计算机组成原理:CPU设计模拟 计算机组成原理是计算机科学的核心课程,但传统教学往往停留在理论层面,学生很难真正理解CPU是如何工作的。南北阁Nanbeige4.1-3B模型为这门课程带来了全新的教学体验。 1. 计算机组成原理的教…...

压力测试工具 JMeter 使用教程

## 压力测试工具JMeter使用教程 在当今互联网高速发展的时代,确保系统在高并发情况下的稳定性至关重要。Apache JMeter 是一款开源的性能测试工具,广泛应用于Web应用、数据库、API等场景的压力测试。它功能强大,支持多协议测试,并…...

跨站脚本攻击(XSS)深度剖析:从原理到实战绕过及防御体系

时间:2026年4月 | 仅限技术交流与学习 一、XSS漏洞简介与危害 跨站脚本攻击(Cross Site Scripting,缩写为XSS)是一种常见的Web安全漏洞,攻击者通过在网页中注入恶意脚本代码,当用户浏览页面时…...

向量搜索查询返回空结果却无异常?EF Core 10中CosineSimilarity表达式树编译失败的静默降级机制揭秘

第一章:向量搜索查询返回空结果却无异常?EF Core 10中CosineSimilarity表达式树编译失败的静默降级机制揭秘现象复现与根本诱因 在 EF Core 10 中调用 CosineSimilarity 方法进行向量相似度检索时,若底层数据库(如 PostgreSQL pg…...

不同场景做MV该用什么工具?OhYesAI、VidMuse、Kaiber、Runway选型指南

核心前提结论:选择MV制作工具第一步,需要先明确核心需求是「给音乐配画面」还是「把内容做成视频」,两类需求对应完全不同的工具类型,选错工具无法解决核心问题。1. 独立音乐人/音乐博主MV工具选型 核心结论:独立音乐人…...