400 128 6709

行业新闻

让你吊打面试官的J*a内存结构以及对象的内容讲解

发布时间:2025-04-26点击次数:

对象的创建过程包括以下几个步骤:申请内存空间、赋予默认值、设置初始值。在这个过程中,可能会发生指令重排,导致对象处于半初始化状态。这也是为什么在dcl(双重检查锁定)单例模式中需要使用volatile关键字的原因,因为new操作可能会出现问题。

存储器的层次结构如图所示:

让你吊打面试官的Java内存结构以及对象的内容讲解

硬件层的数据一致性协议有很多种,其中Intel使用的是MESI协议。

现代CPU的数据一致性是通过缓存锁(如MESI等)和总线锁来实现的。读取缓存是以cache line为基本单位,目前是64字节。如果同一缓存行的两个不同数据被两个不同CPU锁定,会产生互相影响的伪共享问题。使用缓存行的对齐可以提高效率,如disruptor框架所利用的。

乱序问题(读):CPU为了提高效率,如果没有直接依赖关系,会在一条指令执行的过程中(读数据慢100倍)同时执行另一条指令。写操作也可以进行合并,放在WCBuffer(4个位置)中执行。

案例:

package com.mashibing.juc.c_029_WriteCombining;
public final class WriteCombining {
    private static final int ITERATIONS = Integer.MAX_VALUE;
    private static final int ITEMS = 1;
    // ...
}

为了保证特定情况下不发生乱序,JVM使用内存屏障来确保有序性。硬件层面上的实现不一定依赖硬件级别的内存屏障,还可以依赖硬件级别的lock指令。

硬件CPU内存屏障包括:

  • sfence:在sfence指令前的写操作必须在sfence指令后的写操作前完成。
  • lfence:在lfence指令前的读操作必须在lfence指令后的读操作前完成。
  • mfence:在mfence指令前的读写操作必须在mfence指令后的读写操作前完成。

JVM级别如何规范(JSR133):

  • LoadLoad屏障:对于语句Load1; LoadLoad; Load2,确保在Load2及后续读取操作访问数据前,Load1要读取的数据被读取完毕。
  • StoreStore屏障:对于语句Store1; StoreStore; Store2,确保在Store2及后续写入操作执行前,Store1的写入操作对其它处理器可见。
  • LoadStore屏障:对于语句Load1; LoadStore; Store2,确保在Store2及后续写入操作被刷出前,Load1要读取的数据被读取完毕。
  • StoreLoad屏障:对于语句Store1; StoreLoad; Load2,确保在Load2及后续所有读取操作执行前,Store1的写入对所有处理器可见。

volatile的实现细节:

  1. 字节码层面:ACC_VOLATILE
  2. JVM层面:Volatile内存区的读写都加屏障
    • StoreStoreBarrier
    • volatile 写操作
    • StoreLoadBarrier
    • LoadLoadBarrier
    • volatile 读操作
    • LoadStoreBarrier
  3. OS和硬件层面:使用lock指令实现(如在Windows上)或MESI协议。

synchronized的实现细节:

  1. 字节码层面:ACC_SYNCHRONIZED,monitorenter和monitorexit(两个)
  2. JVM层面:C++调用了操作系统提供的同步机制
  3. OS和硬件层面:在X86上使用lock cmpxchg指令

对象的创建过程:

  1. class loading

  2. class linking(verification, preparation, resolution)

  3. class initializing

  4. 申请对象内存

  5. 成员变量赋默认值

  6. 调用构造方法<init></init>

    成员变量顺序赋初始值

    执行构造方法语句

对象在内存的存储布局:

刺鸟创客 刺鸟创客

一款专业高效稳定的AI内容创作平台

刺鸟创客 110 查看详情 刺鸟创客

首先查看自己虚拟机的配置:j*a -XX:+PrintCommandLinesFlags -version

红色的参数就是内存布局

让你吊打面试官的Java内存结构以及对象的内容讲解

对象的内容(对象的内存布局也可以这么说):

普通对象:

  1. 对象头markword(8字节)
  2. ClassPointer指针(-XX:+UseCompressedClassPointers为4字节,不开启为8字节)
  3. 实例数据引用类型(-XX:+UseCompressedOops为4字节,不开启为8字节,Oops = Ordinary Object Pointers)
  4. Padding对齐(8的倍数)

数组对象:

  1. 对象头markword(8字节)
  2. ClassPointer指针(-XX:+UseCompressedClassPointers为4字节,不开启为8字节)
  3. 数组长度(4字节)
  4. 数组数据
  5. 对齐(8的倍数)

首先一个class load到内存的时候有一个agent来截获或修改,需要自己实现它(premain方法),相当于代理。

实验:

  1. 新建项目ObjectSize(1.8)
  2. 创建文件ObjectSizeAgent
package com.mashibing.jvm.agent;
import j*a.lang.instrument.Instrumentation;
<p>public class ObjectSizeAgent {
private static Instrumentation inst;</p><pre class="brush:php;toolbar:false;">public static void premain(String agentArgs, Instrumentation _inst) {
    inst = _inst;
}

public static long sizeOf(Object o) {
    return inst.getObjectSize(o);
}

}

  1. 在src目录下创建META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: mashibing.com
Premain-Class: com.mashibing.jvm.agent.ObjectSizeAgent

注意Premain-Class这行必须是新的一行(回车 + 换行),确认IDEA不能有任何错误提示。

  1. 打包jar文件
  2. 在需要使用该AgentJar的项目中引入该Jar包(project structure - project settings - library 添加该jar包)
  3. 运行时需要该AgentJar的类,加入参数:
-j*aagent:C:\work\ijprojects\ObjectSize\out\artifacts\ObjectSize_jar\ObjectSize.jar
  1. 如何使用该类:
package com.mashibing.jvm.c3_jmm;</p><p>import com.mashibing.jvm.agent.ObjectSizeAgent;</p><p>public class T03_SizeOfAnObject {
public static void main(String[] args) {
System.out.println(ObjectSizeAgent.sizeOf(new Object()));
System.out.println(ObjectSizeAgent.sizeOf(new int[] {}));
System.out.println(ObjectSizeAgent.sizeOf(new P()));
}</p><pre class="brush:php;toolbar:false;">private static class P {
    // 8 _markword
    // 4 _oop指针
    int id;         // 4
    String name;    // 4
    int age;        // 4
    byte b1;        // 1
    byte b2;        // 1
    Object o;       // 4
    byte b3;        // 1
}

}

Object 16字节

Int 16字节

  • -XX:+UseCompressedClassPointers -XX:+UseCompressedOops 这两个是分开的
  • Oops = ordinary object pointers

Hotspot开启内存压缩的规则(64位机):

  1. 4G以下,直接砍掉高32位
  2. 4G - 32G,默认开启内存压缩ClassPointers Oops (ordinary object pointers)
  3. 32G,压缩无效,使用64位 内存并不是越大越好(^-^)

对象头具体包含什么:

具体看对象的状态

让你吊打面试官的Java内存结构以及对象的内容讲解让你吊打面试官的Java内存结构以及对象的内容讲解

当一个对象计算过identityHashCode之后,不能进入偏向锁状态。

以上就是让你吊打面试官的J*a内存结构以及对象的内容讲解的详细内容,更多请关注其它相关文章!


# windows  # 操作系统  # 处理器  # java  # 荔湾区优化网站价格排名  # 亦庄大型网站建设  # 婚纱摄影网站建设服务商  # 美妆平台营销推广方案  # 苏州建设国外网站  # 牛视SEO注册  # 池州网站推广技术  # SEO战略老师礼物  # 设计公司网站推广案例  # 大良官网网站建设  # 的是  # 默认值  # 提高效率  # 过程中  # 不开启  # 为大  # 教你  # 面试官  # 让你  # 为什么  # 同步机制  # bing  # c++  # ai 


相关栏目: 【 行业新闻62819 】 【 科技资讯67470


相关推荐: 自动驾驶汽车避障、路径规划和控制技术详解  软通动力天枢元宇宙研究院签约落户江宁高新区  人工智能框架生态峰会即将召开,聚焦AI大模型技术与科学智能探索!  字节、网易相继入局,AI之后大厂又找到下一个风口?  自研4D激光雷达L1 + GPT大语言模型 宇树Unitree Go2四足机器人有啥黑科技?  “黑科技”亮相大湾区轨交论坛 智慧交通迈向“强AI”  生成式人工智能如何改变云安全的游戏规则  工业机器人及非标自动化设备集成服务提供商  智能机器人与话剧的完美结合:宇树四足机器人B1助力《骆驼祥子》重现经典  有 ARM 和 X86 两个版本,香橙派游戏掌机细节曝光  全国体育人工智能大会举办,专家聚焦体育人工智能领域人才培养  Xbox游戏工作室负责人:VR/AR领域的用户规模还不足够  放弃自动驾驶,也是一种和解  特斯拉 Optimus 人形机器人入驻北美门店,帮助提升汽车销量  引领AI变革,九章云极DataCanvas公司重磅发布AIFS+DataPilot  AMD在ChinaJoy展示全新的锐龙AI笔记本,开创了人工智能领域的新时代!  测试框架-安全和自动驾驶  借力AI!PCB全球巨头,有爆发潜质吗?  生成式人工智能进入产业应用!但再“聪明”仍是工具,最终目的是服务于人  猿辅导发布最新SaaS业务进展公告:Motiff UI设计工具推出三项新的AI功能  泗洪:畅通城市“血管” ,管下机器人来帮忙  田渊栋新作:打开1层Transformer黑盒,注意力机制没那么神秘  人形机器人概念集体爆发,能买吗?  微软在德国举办MR研讨会,向女性分享元宇宙潜力  “苏南 vs 苏北” AI 分胜负,娱乐性比较工具 EitherChoice 上线  SnapFusion技术大幅提升AI图像生成速度  眼球反射解锁3D世界,黑镜成真!马里兰华人新作炸翻科幻迷  无需标注数据,「3D理解」进入多模态预训练时代!ULIP系列全面开源,刷新SOTA  脑虎科技:奔跑在“脑机接口”最前沿 跨界融合取得阶段性成果  全媒封面丨⑤商汤科技:原创AI算法“发电厂”  微软Xbox称VR和AR还需要时间 先玩大的  行业首发「超级智绘」AI故事集,TCL实业推进AI技术应用  一公司推出喷火机器狗,可喷出 9 米长火焰  先进技术在防止全球数据丢失方面的作用  物联网“僵尸网络DDos攻击”增长惊人,威胁全球电信网络  B站内测 AI 搜索功能,输入“?”即可体验  亚马逊确认今年不举办re:MARS人工智能大会  人工智能产业协同创新中心:全产业链资源在这里汇聚  【|直播|预告】人工智能高峰论坛将于7月2日13:30准时开播!  中科院自研新一代 AI 大模型“紫东太初 2.0”问世  马斯克称人类是半机器人,记忆外包给了电脑  谷歌推出 AI 反洗钱工具,可将金融机构内部风险预警准确率提高2至4倍  生成式AI引路产业加速来袭,微美全息探索“AIGC+虚拟人”融合应用  焊接协作机器人或将成为26届埃森展最大看点  英特尔张宇:边缘计算在整个AI生态系统中扮演重要角色  长宁这家企业在世界人工智能大会上荣获“蓝鼎奖”  海柔创新携手SAP,以机器人技术助力全球客户升级数智化竞争力  海南科技职业大学第25届中国机器人及人工智能大赛海南赛区荣获一等奖等114项  从GOXR到PartyOn,XRSPACE致力打造多元共赢的元宇宙世界  AI+音乐如何“生成”动听旋律?一起揭秘世界人工智能大会开场曲 

400 128 6709
E-mail

contact@tlftec.cn

扫一扫,添加微信

©  云南淘乐房科技有限公司 版权所有  滇ICP备2025071560号  

云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司 云南淘乐房科技有限公司