东莞网站排名优化价格郑州网站技术顾问

张小明 2026/1/10 11:25:29
东莞网站排名优化价格,郑州网站技术顾问,短视频培训学校,网站建设费计入哪个科目目录 一、虚拟机中对象的创建 1、类加载检查 2、分配内存 3、初始化零值 4、设置对象头 5、执行 方法6、引用指向对象 7、可达性判断 关键补充#xff1a;对象创建的字节码指令 二、对象的内存布局 1、对象头#xff08;Object Header#xff09; #xff08;1对象创建的字节码指令二、对象的内存布局1、对象头Object Header1Mark Word标记字2类型指针Klass Pointer3数组长度Array Length2、实例数据Instance Data1变量的存储规则2引用类型的存储3、对齐填充Padding1内存对齐的原因2对齐填充的计算示例4、不同对象的内存 布局示例1普通对象64 位压缩指针开启2数组对象64 位压缩指针开启3有继承的对象64 位压缩指针开启5、压缩指针的影响三、对象的访问定位1、两种核心访问方式的原理1句柄访问Handle Access1内存布局准备2访问流程、3优缺点2 直接指针访问Direct Pointer Access1内存布局准备2访问流程3优缺点2、为什么默认使用直接指针3、具体场景示例1 句柄访问的执行过程2直接指针访问的执行过程4、引用类型的本质5、小结一、虚拟机中对象的创建1、类加载检查当执行new指令时虚拟机首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用。检查该符号引用对应的类是否已经被加载、解析和初始化过。若没有则先执行类加载过程加载→验证→准备→解析→初始化。2、分配内存类加载检查通过后虚拟机为新生对象分配内存对象所需内存大小在类加载完成后即可确定。内存分配有两种核心方式具体选择取决于Java 堆是否规整而堆的规整性由垃圾收集器是否带有压缩整理功能决定。分配方式适用场景核心原理优缺点指针碰撞Bump the Pointer堆内存规整已用和空闲内存连续如 Serial、ParNew 收集器用一个指针作为分界点分配时将指针向空闲区移动对象大小的距离简单高效无内存碎片空闲列表Free List堆内存不规整如 CMS 收集器虚拟机维护一个列表记录可用的内存块分配时从列表中找到足够大的块划分给对象并更新列表处理内存碎片实现复杂对象创建是高频操作并发下可能出现同一内存被多个线程分配的问题虚拟机提供两种解决方案1CAS 失败重试兜底方案CAS是乐观锁的一种实现方式。乐观锁就是每次不加锁而是假设么有冲突而去完成某项操作如果因为冲突失败就重试直到成功为止采用 CAS 原子操作保证分配内存的原子性失败则重试直到成功。2TLABThread Local Allocation Buffer首选方案为每个线程预先分配一小块私有内存优先在 TLAB 内分配TLAB 用完后再用 CAS 分配公共区域。可通过-XX:UseTLAB开启默认开启。对象创建中的线程安全原因对象创建的核心步骤是内存分配比如从 Java 堆中划分一块内存给新对象这一步在并发场景下会产生竞态条件Race Condition具体表现为假设堆中有一个空闲内存指针free_ptr线程 A 和线程 B 同时执行new指令都想把free_ptr向空闲区移动对象大小的距离线程 A 读取了free_ptr的值比如地址 0x100线程 B 也读取了同一个free_ptr的值还是 0x100线程 A 先完成计算把free_ptr更新为 0x120假设对象占 32 字节线程 B 后完成计算也把free_ptr更新为 0x120。最终结果是两个线程分配了同一块内存导致对象数据互相覆盖引发内存泄漏、空指针异常甚至 JVM 崩溃 —— 这就是内存分配的线程不安全问题。除此之外对象创建的其他步骤如设置对象头、执行init方法也可能隐含线程安全问题但内存分配是核心风险点。会发生线程安全的环节及处理手段环节线程安全责任方核心保障手段类加载检查JVM类加载的双亲委派模型 缓存保证类只被加载一次内存分配JVMTLAB线程私有 CAS原子操作初始化零值 / 设置对象头JVM原子操作 内存屏障执行init方法程序员避免构造函数逸出、禁止在构造函数中操作共享变量对象引用赋值程序员避免发布未初始化的对象如用volatile修饰共享引用3、初始化零值内存分配完成后虚拟机将分配到的内存空间不包括对象头初始化为零值如 int0、booleanfalse、引用 null。这一步保证了对象的实例字段在不赋值时也能直接使用无需显式初始化。若使用 TLAB则零值初始化在 TLAB 分配时完成。4、设置对象头虚拟机对对象进行必要的设置存储在对象头中包含以下核心信息Mark Word存储对象的哈希码、GC 分代年龄、锁状态标志等。类型指针指向对象的类元数据Klass表明该对象是哪个类的实例。数组长度仅数组对象若对象是数组需额外存储数组长度。5、执行init方法上述步骤完成后从虚拟机视角看对象已创建完成但从 Java 程序视角看对象还未初始化需要执行init方法。init方法由构造函数类中()方法和实例变量的赋值操作合并而成。执行完毕后对象才会按照程序员的意愿完成初始化此时对象才算真正可用。6、引用指向对象将对象的内存地址赋值给引用变量这个变量可以是局部变量、成员变量或数组元素。7、可达性判断对象被引用后进入可达性分析的管理范畴成为 GC Roots 的可达对象避免被垃圾回收。关键补充对象创建的字节码指令new指令负责创建对象并分配内存返回对象引用但此时对象仅完成零值初始化。invokespecial指令调用init方法完成对象的显式初始化。二、对象的内存布局在 HotSpot 虚拟机中对象的内存布局是指对象在 Java 堆中占用的内存空间被划分的具体结构直接影响对象的访问、GC、锁机制等核心功能。整体上对象的内存布局可分为3 个核心部分数组对象额外多一个 “数组长度” 字段对象头Object Header存储对象的元数据和运行时状态是 HotSpot 最复杂的部分。实例数据Instance Data存储对象的实例变量包括继承自父类的变量是对象的核心数据区。对齐填充Padding仅作为内存对齐的占位符无实际业务意义。1、对象头Object Header对象头是 HotSpot 虚拟机的核心设计之一不同类型的对象普通对象、数组对象的对象头结构略有差异普通对象对象头 Mark Word标记字类型指针Klass Pointer数组对象对象头 Mark Word类型指针数组长度Array Length1Mark Word标记字Mark Word 是对象头中最关键的部分占用8 字节64 位虚拟机32 位虚拟机为 4 字节采用 “动态结构” 设计 —— 根据对象的运行时状态如无锁、偏向锁、轻量级锁、重量级锁、GC 标记等复用内存空间存储不同的信息。64 位虚拟机下 Mark Word 的结构默认压缩指针开启状态占用位数存储内容从高位到低位无锁状态6425 位哈希码 4 位分代年龄 1 位是否偏向锁0 2 位锁标志位01偏向锁状态6454 位线程 ID 2 位 Epoch 4 位分代年龄 1 位是否偏向锁1 2 位锁标志位01轻量级锁6462 位指向栈中锁记录的指针 2 位锁标志位00重量级锁6462 位指向监视器Monitor的指针 2 位锁标志位10GC 标记6462 位空无意义 2 位锁标志位11补充分代年龄用于 GC 的分代回收当年龄达到阈值默认 15对象会进入老年代。锁标志位是区分对象状态的核心标识不同值对应不同状态。偏向锁的 Epoch用于批量撤销偏向锁时的版本控制。2类型指针Klass Pointer类型指针是对象指向它的“类元数据Klass”的指针占用4 字节64 位虚拟机开启压缩指针时默认开启不开启则为 8 字节作用是让虚拟机知道该对象是哪个类的实例。压缩指针通过-XX:UseCompressedOopsOops Ordinary Object Pointers开启将 64 位指针压缩为 32 位节省内存JDK8 及以上默认开启。类元数据存储在方法区元空间中包含类的字段、方法、常量池等信息。3数组长度Array Length仅数组对象拥有占用4 字节64 位 / 32 位虚拟机均为 4 字节用于存储数组的元素个数。普通对象无需此字段因为其实例变量的数量和大小在类加载时已确定可通过类元数据获取。2、实例数据Instance Data实例数据是对象存储实际业务数据的区域包含本类声明的实例变量基本类型、引用类型从父类继承的实例变量若父类的变量未被私有化且未被覆盖。1变量的存储规则HotSpot 对实例变量的存储顺序有优化策略核心是 **“相同宽度的变量放在一起”**以减少内存碎片具体规则先存储宽度较大的变量如long、double占 8 字节再存储int4 字节、short2 字节、byte1 字节、boolean1 字节最后存储引用类型4 字节压缩指针下。父类的变量会排在子类变量的前面但如果父类有窄类型变量子类有宽类型变量虚拟机可能会重新排序以优化内存。示例实例数据的存储顺序class Parent { long pLong; // 8字节 int pInt; // 4字节 } class Child extends Parent { String cStr; // 4字节引用压缩指针 byte cByte; // 1字节 }存储顺序pLong8→pInt4→cStr4→cByte1总占用 17 字节。2引用类型的存储引用类型如String、Object在实例数据中仅存储指针4 字节压缩指针下指向堆中对应的对象而非实际数据。3、对齐填充Padding对齐填充是非必需的内存区域仅用于保证对象的总大小是8 字节的整数倍64 位虚拟机或 4 字节的整数倍32 位虚拟机这是 HotSpot 虚拟机的内存对齐要求。1内存对齐的原因硬件层面CPU 访问内存时以 **8 字节64 位 CPU** 为单位读取对齐的内存可减少 CPU 的访问次数提升效率。虚拟机层面保证对象地址的低 3 位为 0便于通过位运算快速计算对象大小和哈希码。2对齐填充的计算示例以 64 位虚拟机压缩指针开启为例计算一个普通对象的总大小class Demo { int num; // 4字节 boolean flag; // 1字节 }各部分大小对象头Mark Word8 类型指针4 12 字节实例数据num4 flag1 5 字节总大小暂为12 5 17 字节。由于 17 不是 8 的整数倍需要填充 1 字节最终对象总大小为 18不8 的整数倍是 2417 距离最近的 8 的倍数是 24因此填充 7 字节最终总大小为 24 字节。4、不同对象的内存 布局示例1普通对象64 位压缩指针开启以new Object()为例对象头Mark Word8 类型指针4 12 字节实例数据无Object 类无实例变量对齐填充4 字节12 不是 8 的整数倍填充 4 字节至 16 字节总大小16 字节。2数组对象64 位压缩指针开启以new int[10]为例对象头Mark Word8 类型指针4 数组长度4 16 字节实例数据10 个 int每个 4 字节共 40 字节对齐填充0 字节16 40 56是 8 的整数倍总大小56 字节。3有继承的对象64 位压缩指针开启以之前的Child类为例对象头Mark Word8 类型指针4 12 字节实例数据pLong8 pInt4 cStr4 cByte1 17 字节对齐填充1 字节12 17 29填充 3 字节至 32 字节32 是 8 的整数倍总大小32 字节。5、压缩指针的影响配置Mark Word类型指针数组长度内存对齐单位64 位开启压缩指针8 字节4 字节4 字节8 字节64 位关闭压缩指针8 字节8 字节8 字节8 字节32 位虚拟机4 字节4 字节4 字节4 字节可通过 JVM 参数-XX:-UseCompressedOops关闭压缩指针此时对象的内存占用会显著增加。三、对象的访问定位在 HotSpot 虚拟机中对象的访问定位是指Java 程序通过对象的引用reference 类型变量找到堆中实际对象的过程。这是连接栈存储引用和堆存储对象的核心环节其实现方式直接影响对象访问的效率。HotSpot 虚拟机支持两种主流的对象访问方式具体选择取决于虚拟机的实现配置其中句柄访问是经典设计直接指针访问是 HotSpot 的默认选择。1、两种核心访问方式的原理1句柄访问Handle Access1内存布局准备采用句柄访问时Java 堆会划分出一块专门的句柄池用于存储句柄每个句柄对应一个对象。句柄的结构包含两个指针对象实例数据指针指向堆中对象的实例数据区域对象头 实例数据类元数据指针指向方法区元空间中对象的类元数据Klass。栈中的引用存储的是句柄在句柄池中的地址而非对象的直接地址。2访问流程、栈中引用句柄地址 → 句柄池中的句柄 → ①对象实例数据堆/②类元数据方法区例当执行Object obj new Object();时堆中创建对象并在句柄池生成对应的句柄栈中的obj变量存储该句柄的地址比如 0x0010当访问obj.toString()时虚拟机先通过obj找到句柄0x0010再通过句柄的类元数据指针找到Object类的toString方法同时通过实例数据指针访问对象的实际数据。3优缺点优点缺点对象移动时引用无需更新GC 时对象在堆中被移动如压缩整理只需修改句柄中的对象实例数据指针栈中的引用始终指向句柄池的固定地址稳定性高。多一次指针跳转访问对象需要先找句柄再找对象增加了一次内存访问效率略低。句柄池统一管理对象的元数据和实例数据指针便于虚拟机进行内存管理。额外占用句柄池内存句柄池需要消耗堆内存增加了内存开销。2 直接指针访问Direct Pointer Access1内存布局准备直接指针访问是 HotSpot 虚拟机的默认实现无需额外的句柄池。栈中的引用存储的是堆中对象的直接内存地址对象的起始地址对象头的类型指针对象的实例数据区域中对象头的类型指针直接指向方法区的类元数据这也是对象头的核心作用之一。2访问流程栈中引用对象直接地址 → 堆中对象对象头实例数据 → 类元数据方法区例执行Object obj new Object();时堆中创建对象其起始地址为 0x1000栈中的obj变量直接存储 0x1000访问obj.toString()时虚拟机通过obj直接找到对象0x1000再通过对象头的类型指针找到Object类的toString方法。3优缺点优点缺点访问效率高只需一次指针跳转即可找到对象是目前最高效的访问方式适合高性能场景。对象移动时引用需更新GC 时对象被移动需要修改栈中所有指向该对象的引用地址虚拟机需通过记忆集等方式追踪引用实现相对复杂。无需句柄池节省了句柄池的内存开销提高了堆内存的利用率。2、为什么默认使用直接指针HotSpot 虚拟机优先选择直接指针访问核心原因是性能优先效率优势对象访问是 Java 程序中最高频的操作之一一次指针跳转的开销远小于句柄访问的两次跳转累计下来能显著提升程序性能内存优化省去句柄池的内存占用尤其在创建大量小对象时内存利用率更高与 GC 机制适配HotSpot 的主流垃圾收集器如 Serial、ParNew、G1都带有压缩整理功能虽然对象移动时需要更新引用但虚拟机通过卡表Card Table、** 记忆集Remembered Set** 等数据结构能高效完成引用更新抵消了直接指针访问的缺点。补充HotSpot 也支持句柄访问但仅在特定场景如早期的低内存设备或特殊的内存管理需求下使用日常开发中几乎不会接触到。3、具体场景示例代码public class AccessDemo { public static void main(String[] args) { User user new User(张三, 20); System.out.println(user.getName()); // 访问对象的实例变量 } } class User { private String name; private int age; public User(String name, int age) { this.name name; this.age age; } public String getName() { return name; } }1 句柄访问的执行过程栈中的user引用存储句柄池中的句柄地址如 0x0020虚拟机通过 0x0020 找到句柄句柄的实例数据指针指向堆中 User 对象的实际地址如 0x2000访问name时从 0x2000 的对象实例数据中找到name的引用指向 String 对象最终获取到 “张三”。2直接指针访问的执行过程栈中的user引用直接存储堆中 User 对象的地址0x2000虚拟机直接访问 0x2000 的对象从实例数据中找到name的引用最终获取到 “张三”。4、引用类型的本质Java 中的reference类型是一个指向对象的指针但它并非 C/C 中的原始指针而是由虚拟机封装的抽象引用虚拟机保证引用的安全性禁止直接操作内存地址如指针算术运算引用的具体存储内容句柄地址 / 直接对象地址由虚拟机决定对程序员透明不同的引用类型强引用、软引用、弱引用、虚引用仅影响 GC 时的处理逻辑不改变访问对象的方式。5、小结特性句柄访问直接指针访问HotSpot 默认栈中引用存储内容句柄池中的句柄地址堆中对象的直接地址访问次数两次指针跳转一次指针跳转GC 对象移动时的处理仅修改句柄的实例数据指针修改所有指向对象的引用地址内存开销额外占用句柄池内存无额外开销性能略低更高
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站文章内链嘉兴做网站的哪家好

利用CardSpace和Windows Communication Foundation开发软件+服务 在软件开发领域,软件与服务的结合正成为一种趋势。Windows Communication Foundation(WCF)和Windows CardSpace这两项技术为实现软件+服务的开发提供了强大的支持。下面将详细介绍这两项技术以及如何使用它们…

张小明 2026/1/9 20:59:50 网站建设

广东网站建设公司xywdl北京app开发哪家好

作为一名既懂 AI 创作又懂开发的技术人,我常被同行问起:“为什么你生成的 AI 绘图 / 图生视频提示词又快又准,尤其是古代场景这类高要求的题材,细节和一致性总能把控到位?” 其实核心不在于我手动撰写的能力多强&#…

张小明 2026/1/4 10:31:58 网站建设

高州网站开发公司营销策略的概念

m4s-converter:构建B站缓存视频的离线播放技术方案 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 🔍 问题诊断:缓存视频播放的技术障碍 缓…

张小明 2026/1/2 15:18:33 网站建设

顺的品牌网站设计价位高站网站建设

小红的密码修改 时间限制:1秒 空间限制:256M 网页链接 牛客tracker 牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每…

张小明 2026/1/8 18:32:15 网站建设

如何用phpstorm做网站网站数据库出问题

LangFlow中的并发控制:避免GPU过载的有效策略 在如今大语言模型(LLM)被广泛应用于智能客服、代码生成和知识问答的背景下,如何快速构建可复用、易调试的AI工作流,已经成为开发者面临的核心挑战。LangChain 提供了强大…

张小明 2026/1/3 16:12:13 网站建设

网站色彩的搭配原则有哪些c 能用来做网站吗

目录10.1 函数模板的引入10.2 调用模板函数10.2.1 显式实例化10.2.2 隐式实例化10.3 模板函数应用实例10.4 C concept(C20)10.4.1 一个错误10.4.2 创建10.4.3 使用10.4.4 实例10.5 可变参数模板10.5.1 实现10.5.2 编译器运行可变参数模板10.5.3 可变模板…

张小明 2026/1/4 2:05:58 网站建设