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

JVM 底层探秘:对象创建的详细流程、内存分配机制解析以及线程安全保障策略

文章目录

  • 1. 类加载检查
  • 2. 内存分配
    • ① 指针碰撞
    • ② 空闲列表
    • ==线程安全问题==:
  • 3. 内存空间初始化
  • 4. 对象头设置
  • 5. 对象初始化

当Java虚拟机遇到一条 new指令时,会执行以下步骤来创建对象:
在这里插入图片描述

1. 类加载检查

首先检查new指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,必须先执行相应的类加载过程。

2. 内存分配

内存分配有两种方式:

① 指针碰撞

如果Java堆内存是规整的,所有被使用过的内存都被放在一 边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那 个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump The Pointer)。
在这里插入图片描述

② 空闲列表

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

内存是否规整取决于垃圾收集器是否带有压缩整理功能。例如,Serial和ParNew等带有Compact过程的收集器采用“指针碰撞”,而CMS这种基于Mark-Sweep算法的收集器通常采用“空闲列表”。

线程安全问题

除了分配方式外,由于对象创建在虚拟机中是一个非常频繁的行为,此时需要保证在并发环境下的线程安全:如果一个线程给对象 A 分配了内存空间,但指针还没来得及修改,此时就可能出现另外一个线程使用原来的指针来给对象 B 分配内存空间的情况。想要解决这个问题有两个方案:

  • 方式一:采用同步锁定,或采用 CAS 配上失败重试的方式来保证更新操作的原子性。

CAS操作的基本逻辑是:
(1)比较某个变量的当前值是否等于预期值。
(2)如果相等,则将该变量更新为新值。
(3)如果不相等,则返回当前值,调用方可以选择重

  • 方式二:每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local AllocationBuffer,TLAB),哪个线程要分配内存,就在哪个线程的本地缓冲区中分配,TLAB是线程私有的内存缓冲区,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定。

3. 内存空间初始化

分配内存后,虚拟机会将分配到的内存空间初始化为零值,如果使用了TLAB的话,这一项工作也可以提前至TLAB分配时顺便进行。

4. 对象头设置

设置对象头信息,包括对象的类元数据指针、哈希码、GC分代年龄等。

5. 对象初始化

在上面工作都完成之后,从虚拟机的视角来看,一个新的对象已经产生了。但是从Java程序的视角看来,对象创建才刚刚开始——构造函数,即Class文件中的<init>()方法还没有执行,new指令之后会接着执行<init>()方法,按照程序员的意愿对对象进行初始化。

在这里插入图片描述

相关文章:

JVM 底层探秘:对象创建的详细流程、内存分配机制解析以及线程安全保障策略

文章目录 1. 类加载检查2. 内存分配① 指针碰撞② 空闲列表线程安全问题&#xff1a; 3. 内存空间初始化4. 对象头设置5. 对象初始化 当Java虚拟机遇到一条 new指令时&#xff0c;会执行以下步骤来创建对象&#xff1a; 1. 类加载检查 首先检查new指令的参数是否能在常量池中…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter14-DOM

十四、DOM 文档对象模型&#xff08;DOM&#xff0c;Document Object Model&#xff09;是 HTML 和 XML 文档的编程接口。DOM 表示由多层节点构成的文档&#xff0c;通过它开发者可以添加、删除和修改页面的各个部分。脱胎于网景和微软早期的动态 HTML&#xff08;DHTML&#x…...

外汇掉期(FX Swap):全球企业管理外汇风险的关键工具(中英双语)

外汇掉期&#xff08;FX Swap&#xff09;&#xff1a;全球企业管理外汇风险的关键工具 引言 在全球化经济环境下&#xff0c;跨国公司、银行和金融机构经常面临外汇风险&#xff0c;因为它们的业务涉及多种货币。例如&#xff0c;一家中国公司可能需要欧元支付欧洲供应商&am…...

verilog程序设计及SystemVerilog验证

1.Verilog测试程序设计基础 1.1Testbench及其结构 在仿真的时候Testbench用来产生测试激励给待验证设计( Design Under Verification, DUV)&#xff0c;或者称为待测设计(Design UnderTest, DUT) 。 测试程序的一般结构&#xff1a; Testbench是一个测试平台&#xff0c;信号…...

Unity DeepSeek API 聊天接入教程(0基础教学)

Unity DeepSeek API 聊天接入教程(0基础教学) 1.DeepSeek 介绍 DeepSeek是杭州深度求索人工智能基础技术研究有限公司推出的一款大语言模型。2025年1月20日&#xff0c;DeepSeek-R1正式上线&#xff0c;和当前市面上的主流AI相比&#xff0c;它在仅有极少标注数据的情况下&am…...

力扣 乘积最大子数组

动态规划&#xff0c;注意负负得正&#xff0c;dp交换。 题目 注意这里的dp的乘积要求最大&#xff0c;而两个很大的负数相乘也是大的&#xff0c;因此在每遍历到一个数时要存一个最大值的dp与一个最小值的dp&#xff0c;然后遍历完后再去存ans的dp。由于存在负数&#xff0c;…...

ABP - 事件总线之分布式事件总线

ABP - 事件总线之分布式事件总线 1. 分布式事件总线的集成1.2 基于 RabbitMQ 的分布式事件总线 2. 分布式事件总线的使用2.1 发布2.2 订阅2.3 事务和异常处理 3. 自己扩展的分布式事件总线实现 事件总线可以实现代码逻辑的解耦&#xff0c;使代码模块之间功能职责更清晰。而分布…...

osgearth控件显示中文(八)

当前自己知道的方法大概有以下两种: (一)直接转成utf8 其实在前面的文章中已经有了。 osgEarth::Annotation::PlaceNode *pn = new osgEarth::Annotation::PlaceNode(GeoPoint(geoSRS, 110, 34), String2UTF8("中国"), style);std::wstring String2Wstring(con…...

基于opencv的 24色卡IQA评测算法源码-可完全替代Imatest

1.概要 利用24色卡可以很快的分析到曝光误差&#xff0c;白平衡误差&#xff0c;噪声&#xff0c;色差&#xff0c;饱和度&#xff0c;gamma值。IQA或tuning工程一般用Imatest来手动计算&#xff0c;不便于产测部署&#xff0c;现利用opencv实现了imatest的全部功能&#xff0c…...

webpack打包优化策略

1. 减少打包体积 减少打包文件的大小是为了提高加载速度&#xff0c;降低网络带宽消耗&#xff0c;提升用户体验。常见的减少打包体积的优化策略包括&#xff1a; 代码分割&#xff08;Code Splitting&#xff09;&#xff1a;将代码拆分成多个小文件&#xff0c;让浏览器按需…...

Kafka日志数据深度解析:从基础查看到高级操作全攻略

#作者&#xff1a;孙德新 文章目录 查看log日志文件(kafka-dump-log.sh)1、查看Log文件基本数据信息2、index文件健康性检查(--index-sanity-check)3、转储文件(--max-message-size)4、偏移量解码(--offsets-decoder)5、日志数据解析(--transaction-log-decoder)6、查询Log文件…...

DeepSeek-R1使用生存指南

文章目录 1.为什么普通人一定要使用DeepSeek2.DeepSeek的几种使用方式2.1网页端直接使用2.2手机端app使用2.3其他第三方平台 3.网页端按钮的说明4.正确的提问技巧4.1不要定义过程4.2明确受众4.3记忆时间有限4.4输出长度限制4.5如何清除上下文的记忆 5.几个避坑点5.1冗长提示词污…...

Code::Blocks 创建 C 项目 二

Code::Blocks 创建 C 项目 二 Code::Blocks 安装请看 Code::Blocks 安装 启动 Code Blocks 选择 Create a new project 弹出界面选择 Projects -> Console application -> Go 选择 C &#xff1a;表示创建的是 C 语言项目 点击 Next Project title&#xff1a;项目名 …...

pyqt写一个待办程序

ToDoApp 框架选择 一个简单的GUI程序&#xff0c;可以使用pyqt完成。pyqt是qt的python实现版本。 界面搭建 设计一个美观 简洁的界面 class ToDoApp(QWidget):def __init__(self):super().__init__()# 设置窗口属性self.setWindowTitle("Daily To Do List")self…...

总结前端常用数据结构 之 数组篇【JavaScript -包含常用数组方法】

【亲爱的读者&#xff0c;爱博主记得一键三连噢噢ooo~~ 啾咪】 创建数组&#xff1a; 以字面量的形式创建新数组&#xff1a;let arr1 [1, 2, 3];通过 Array 构造函数并传入一组元素&#xff08;4,5,6&#xff09;来创建一个新数组&#xff1a;let arr2 new Array(4, 5, 6);…...

利率掉期(Interest Rate Swap):运作原理、收益模式及市场角色解析(中英双语)

利率掉期&#xff08;Interest Rate Swap&#xff09;&#xff1a;运作原理、收益模式及市场角色解析 引言 利率掉期&#xff08;Interest Rate Swap, IRS&#xff09; 是金融市场中最常见的衍生品之一&#xff0c;它允许两方交换固定利率和浮动利率&#xff0c;以优化融资成…...

Mac 开发工具推荐

Homebrew 软件安装管理必备神器&#xff0c;相当于 Linux 上的 yum&#xff0c;安装了homebrew之后&#xff0c;以下软件都可以通过brew cask install 和 brew install进行直接安装 IntelliJ IDEA Java开发ide 相关插件&#xff1a; 1&#xff09;lombok 2&#xff09;Aliba…...

NCHAR_CS和CHAR_CS,导致UNION ALL 时,提示SQL 错误 [12704] [72000]: ORA-12704: 字符集不匹配

检查涉及的数据表和列的字符集设置 -- 查询表的字符集 SELECT parameter, value FROM nls_database_parameters WHERE parameter LIKE NLS_CHARACTERSET;-- 查询列的字符集&#xff08;对于特定表&#xff09; SELECT column_name, character_set_name FROM all_tab_columns W…...

使用 Python paramiko 自动备份设备配置实验

一、实验拓扑&#xff1a; 要求&#xff1a;交换机 SW1 做为 SSH 服务端&#xff0c;桥接本地虚拟虚拟网卡&#xff1b;本地主机通过 python paramiko 库功能登录到 SW1 上进行配置备份&#xff1b;AR1 做为测试 SW1 的 SSH 客户端 二、实验环境搭建&#xff1a; 1、SW1 配置…...

goland2022.3.3 安装过程

到csdn下载安装包 开始安装 安装完后&#xff0c;安装中文包...

第39篇:Vibe Coding时代:LangGraph 安全审查 Agent 实战,解决 AI 代码隐藏安全风险问题

第39篇:Vibe Coding时代:LangGraph 安全审查 Agent 实战,解决 AI 代码隐藏安全风险问题 一、问题场景:AI 生成的代码功能正确,但安全风险很高 AI 生成代码时,经常会为了简单直接写出危险实现。 例如: 1. 明文密码 2. 硬编码 token 3. SQL 拼接 4. 未校验文件路径 5. …...

ASUS Tinker Edge R开发板:边缘AI计算的硬件解析与实践

1. ASUS Tinker Edge R 开发板深度解析华硕Tinker Edge R是一款基于Rockchip RK3399Pro AI处理器的Pico-ITX规格单板计算机。这款开发板最初在2019年发布时配备了6GB内存&#xff0c;而近期新推出的3GB内存版本以更亲民的价格出现在市场上。作为一款面向AI加速工作负载设计的开…...

联邦学习如何重塑社交网络?一篇讲透原理、应用与未来

联邦学习如何重塑社交网络&#xff1f;一篇讲透原理、应用与未来 引言 在数据成为核心生产要素的时代&#xff0c;社交网络平台沉淀了海量的用户关系与行为数据&#xff0c;其价值挖掘与隐私保护之间的矛盾日益尖锐。联邦学习&#xff08;Federated Learning&#xff09;作为…...

多模态提示注入攻击检测技术与实践

1. 多模态提示注入攻击检测概述在人工智能安全领域&#xff0c;提示注入攻击&#xff08;Prompt Injection&#xff09;已成为大语言模型&#xff08;LLM&#xff09;和视觉语言模型&#xff08;VLM&#xff09;面临的新型威胁。这种攻击通过精心构造的输入提示&#xff0c;诱导…...

手把手教你过软著:真实开发才是“免死金牌”

最近&#xff0c;版权局对软件著作权登记的审查&#xff0c;真的变严了&#xff01; 不少朋友反馈&#xff0c;明明材料交齐了&#xff0c;结果还是等来一纸“补正通知”&#xff0c;甚至直接被驳回。原因无他&#xff0c;审查的重心已经从“材料全不全”转向了“软件真不真”…...

语音助手DNS查询技能开发:从API集成到智能家居运维实践

1. 项目概述&#xff1a;一个DNS查询技能的诞生最近在折腾智能音箱和家庭自动化&#xff0c;发现一个挺有意思的需求&#xff1a;能不能直接问家里的智能设备&#xff0c;某个网站的DNS解析情况&#xff1f;比如&#xff0c;想知道“我的博客域名解析生效了吗&#xff1f;”或者…...

基于MCP协议的农业大宗商品气候风险AI情报引擎解析

1. 项目概述&#xff1a;一个为AI智能体打造的农业大宗商品气候风险情报引擎如果你在从事大宗商品交易、农业保险或供应链管理&#xff0c;那你一定对“信息差”和“信息滞后”这两个词深有感触。今天要聊的这个项目&#xff0c;apifyforge/agricultural-commodity-climate-mcp…...

异步扩散模型在3D视频生成中的技术突破与应用

1. 3D视频生成技术全景解析 在数字内容创作领域&#xff0c;3D视频生成正经历着革命性的变革。传统三维动画制作需要经历建模、绑定、动画、渲染等复杂流程&#xff0c;而现代生成式技术正在颠覆这一工作流。我最近深度实践了多种3D生成方案&#xff0c;发现异步扩散模型展现出…...

别再踩坑了!PyTorch3D 0.7.4 保姆级安装指南(附CUDA 11.3/11.7、Python 3.8/3.9版本命令)

别再踩坑了&#xff01;PyTorch3D 0.7.4 保姆级安装指南&#xff08;附CUDA 11.3/11.7、Python 3.8/3.9版本命令&#xff09; 第一次尝试安装PyTorch3D时&#xff0c;我花了整整两天时间在各种报错中挣扎。明明按照官方文档操作&#xff0c;却总是卡在依赖冲突上。后来才发现&a…...

WarcraftHelper:魔兽争霸3现代兼容性完整解决方案

WarcraftHelper&#xff1a;魔兽争霸3现代兼容性完整解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏魔兽争霸3在现代电脑上运…...