02内存结构篇(D3_对象的创建历程)

目录

一、学习前言

二、对象的创建:指针碰撞 & 空闲列表

三、对象的内存布局:三部分组成

1. 对象头

2. 实例数据

3. 对齐填充

四、对象的访问定位

1. 句柄访问

2. 直接指针访问

3. 两者访问方式比较


一、学习前言

运行时数据区了解了,那么我在想,应该再细分下吧,那就是该了解对象的创建历程了!为什么这

样的流程呢,因为我们知道内存分配后,自然就要知道创建对象后怎么存放的位置!

二、对象的创建:指针碰撞 & 空闲列表

Java中,创建对象通常(例外:复制、反序列化)仅仅是一个new关键字而已,

当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位

一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过,如果没有

那必须先执行相应的类加载过程

类加载检查通过后,接下来虚拟机将为新生对象分配内存

对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务实际上便等同于把一块

确定大小的内存块从Java堆中划分出来。

假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边空闲的内存被放在另一

边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪

动一段与对象大小相等的距,这种分配方式称为“指针碰撞”(Bump ThePointer)

如果Java堆中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,那就没有办法

简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候

从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为**“空闲

列表”(Free List)**选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的

垃圾收集器是否带有空间压缩整理(Compact)的能力决定。

因此,当使用Serial、ParNew等带压缩整理过程的收集器时,系统采用的分配算法是指针碰撞,既

简单又高效;而当使用CMS这种基于清除(Sweep)算法的收集器时,理论上就只能采用较为复

杂的空闲列表来分配内存。

三、对象的内存布局:三部分组成

其实,上一篇文章,W哥已经带大家对对象的内存布局有了一个较为清晰的认知,现在就让我们再

本篇文章再做一次了解吧!

在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:

对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)

1. 对象头

HotSpot虚拟机对象的对象头部分包括两类信息。

第一类是用于存储对象自身的运行时数据,,如哈希码(HashCode)、GC分代年龄、锁状态标

志、线程持有的锁、偏向线程ID、偏向时间戳等,官方称它为“Mark Word”。

对象头的另外一部分是类型指针,即对象指向它的类型元数据的指针,Java虚拟机通过这个指针来

确定该对象是哪个类的实例。

2. 实例数据

实例数据部分是对象真正存储的有效信息,即我们在程序代码里面所定义的各种类型的字段内容,

无论是从父类继承下来的,还是在子类中定义的字段都必须记录起来。这部分的存储顺序会受到虚

拟机分配策略参数(-XX:FieldsAllocationStyle参数)和字段在Java源码中定义顺序的影响。

HotSpot虚拟机默认的分配顺序为longs/doubles、ints、shorts/chars、bytes/booleans、

oops

从以上默认的分配策略中可以看到,相同宽度的字段总是被分配到一起存放,在满足这个前提条件

的情况下,在父类中定义的变量会出现在子类之前。

对象的第三部分是对齐填充,这并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作

用。

3. 对齐填充

由于HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说就是

任何对象的大小都必须是8字节的整数倍。

对象头部分已经被精心设计成正好是8字节的倍数(1倍或者2倍),因此,如果对象实例数据部分

没有对齐的话,就需要通过对齐填充来补全。

总的一句话来说,“数据项仅仅能存储在地址是数据项大小的整数倍的内存位置上(分别为偶地

址、被4整除的地址、被8整除的地址)”比如int类型占用4个字节,地址仅仅能在0,4,8等位置

上。

要讲好对齐填充,其实还是得去了解c++实现。

例1:

#include <stdio.h>
struct xx{
    char b;
    int a;
    int c;
    char d;
};   //总体结构用了16个字节

struct xx{
        char b; 
        char d;
        int a;          
        int c;                  
};	//总体结构占用12个字节

只说结论,过程可以将对应得字段地址打印出来。

会发现b之后填充3字节,d之后也会填充3字节,这儿就体现了对齐填充,平时代码,分类要做

好,对齐填充也要注意。

四、对象的访问定位

Java程序会通过栈上的reference数据来操作堆上的具体对象。

由于reference类型在《Java虚拟机规范》里面只规定了它是一个指向对象的引用,并没有定义这

个引用应该通过什么方式去定位、访问到堆中对象的具体位置,所以对象访问方式也是由虚拟机实

现而定的,主流的访问方式主要有使用句柄和直接指针两种:

1. 句柄访问

如果使用句柄访问的话,Java堆中将可能会划分出一块内存来作为句柄池,

reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地

址信息,其结构如图所示。

2. 直接指针访问

如果使用直接指针访问的话,Java堆中对象的内存布局就必须考虑如何放置访问类型数据的相关信

息,reference中存储的直接就是对象地址,如果只是访问对象本身的话,就不需要多一次间接访

问的开销,如图所示。

3. 两者访问方式比较

这两种对象访问方式各有优势,使用句柄来访问的最大好处就是reference中存储的是稳定句柄地

址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,

而reference本身不需要被修改。

使用直接指针来访问最大的好处就是速度更快,它节省了一次指针定位的时间开销,由于对象访问

在Java中非常频繁,因此这类开销积少成多也是一项极为可观的执行成本,主要虚拟机HotSpot而

言,它主要使用第二种方式进行对象访问,但从整个软件开发的范围来看,在各种语言、框架中使

用句柄来访问的情况也十分常见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956708.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统之kill命令的基本使用

Linux系统之kill命令的基本使用 一、kill命令介绍1. kill命令简介2. kill命令的使用场景3. kill命令使用注意事项 二、kill命令的使用帮助1. 查看kill命令帮助信息2. kill命令帮助解释 三、kill常用的信号1. 列出所有的信号2.kill常用的信号 四、kill命令的基本使用1. 运行一个…

【银河麒麟高级服务器操作系统】业务访问慢网卡丢包现象分析及处理过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;product.kylinos.cn 开发者专区&#xff1a;developer.kylinos.cn 文档中心&#xff1a;document.kylinos.cn 交流论坛&#xff1a;forum.kylinos.cn 服务器环境以及配置 【内核版本…

leetcode49-字母异位词分组

leetcode 49 思路 通过一个哈希表进行记录每个分组&#xff0c;遍历strs&#xff0c;然后对每个字符串item进行排序&#xff0c;比如&#xff1a;acb bac cab都会被排序为’abc’,然后以abc作为map的key&#xff0c;value就是存放所有匹配出来为key的值&#xff0c;最后把ma…

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认

OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;而OpenAI尚未承认这一漏洞。 本月&#xff0c;德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章&#xff0c;解释了如何通过向ChatGPT API发送单个HTTP请求…

WGAN - 瓦萨斯坦生成对抗网络

1. 背景与问题 生成对抗网络&#xff08;Generative Adversarial Networks, GANs&#xff09;是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它包括两个主要部分&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;…

Java工程结构:服务器规约(JVM 碰到 OOM 场景时输出 dump 信息、设置tomcat的 JVM 的内存参数、了解服务平均耗时)

文章目录 I 调用远程操作必须有超时设置。II 推荐了解每个服务大致的平均耗时JVM 的 Xms 和 Xmx 设置一样大小的内存容量让 JVM 碰到 OOM 场景时输出 dump 信息调大服务器所支持的最大文件句柄数(File Descriptor,简写为 fd)高并发服务器建议调小 TCP 协议的 time_wait 超时…

1.3.浅层神经网络

目录 1.3.浅层神经网络 1.3.1 浅层神经网络表示 1.3.2 单个样本的向量化表示 1.3.4 激活函数的选择 1.3.5 修改激活函数 1.3.5 练习​​​​​​​ 1.3.浅层神经网络 1.3.1 浅层神经网络表示 之前已经说过神经网络的结构了&#xff0c;在这不重复叙述。假设我们有如下…

24年总结 -- 共赴心中所向往的未来

一、前言 我又回来了&#xff0c;前阵子忙着期末考试的东西&#xff0c;也是快半个月没更新了&#xff0c;刚好前几天报名了博客之星的评选&#xff0c;也很幸运的入围了&#xff0c;也借此机会来回顾一下关于2024年的个人成长、创作经历等。 二、个人 本人是一个双非学校的软…

稳定的通信桥梁,CCLINKIE转ModbusTCP网关实现AGV运输的光速效应

三菱PLC与AGV机器人搬运车通过稳联技术协议转换网关建立通信 一、现场情况概述 - 三菱PLC&#xff1a;使用CC-Link IE协议进行通信。 - AGV机器人搬运车&#xff1a;使用Modbus TCP协议进行通信。 - 协议转换网关&#xff1a;使用稳联技术的协议转换网关将PLC和AGV连接&#xf…

kubuntu24.04配置vmware17.5.1

背景 个人主机的最后一次折腾吧。 丝滑上网前提&#xff1a;singbox实践https://blog.csdn.net/qq_43652666/article/details/145190110 vmware 博通官网下载vmware workstation pro 17.5.1版本&#xff0c;注意一个新注册的账号只能下载一个win版本的vmware和一个linux版本…

基于javaweb的SpringBoot景区旅游管理系统设计和实现(源码+文档+部署讲解)

个人名片 &#x1f525; 源码获取 | 毕设定制| 商务合作&#xff1a;《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片运行环境技术栈适用功能说明使用说明 运行环境 Java≥8、MySQL≥5.7 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台…

NavVis手持激光扫描帮助舍弗勒快速打造“数字孪生”工厂-沪敖3D

在全球拥有近100家工厂的舍弗勒&#xff0c;从2016年开启数字化运营进程&#xff0c;而当前制造、库存、劳动力和物流的数字化&#xff0c;已无法支持其进一步简化工作流程&#xff0c;亟需数字化物理制造环境&#xff0c;打造“数字孪生”工厂。 NavVis为其提供NavVis VLX 3…

「免填邀请码」赋能各类APP,提升转化率与用户体验

在当前移动互联网的高速发展下&#xff0c;用户获取和留存已成为各类APP成功的关键。传统的注册流程虽然能够有效识别用户来源并进行用户管理&#xff0c;但随着市场竞争的激烈&#xff0c;复杂的注册和绑定步骤往往会成为用户流失的瓶颈。免填邀请码技术&#xff0c;结合自研的…

【Linux 源码】内核态到用户态

文章目录 1. 由来2. 流程图3. 中断3.1 概念3.2 8259A芯片3.4 中断时的栈处理3.4.1 相同特权级3.4.2 不同特权级 3.5 中断流程3.6 定位中断程序3.7 中断流程步骤总结 4. 源码4.1 move_to_user_mode4.2 0号进程4.3 TSS和LDT在GDT表排布4.4 ldt中的0x17栈段 5. 总结 1. 由来 ​ 首…

SparkSQL数据模型综合实践

文章目录 1. 实战概述2. 实战步骤2.1 创建数据集2.2 创建数据模型对象2.2.1 创建常量2.2.2 创建加载数据方法2.2.3 创建过滤年龄方法2.2.4 创建平均薪水方法2.2.5 创建主方法2.2.6 查看完整代码 2.3 运行程序&#xff0c;查看结果 3. 实战小结 1. 实战概述 在本次实战中&#…

通过电光晶体的电光效应,实现白光干涉中的电光调制相移原理

通过电光晶体的电光效应&#xff0c;实现白光干涉中的电光调制相移原理&#xff0c;是一个基于物理光学和电光学原理的高级测量技术。以下是对这一原理的详细解释&#xff1a; 一、电光效应与电光晶体 电光效应是指某些材料&#xff08;主要是晶体&#xff09;在外加电场的作…

基于Python的多元医疗知识图谱构建与应用研究(上)

一、引言 1.1 研究背景与意义 在当今数智化时代,医疗数据呈爆发式增长,如何高效管理和利用这些数据,成为提升医疗服务质量的关键。传统医疗数据管理方式存在数据孤岛、信息整合困难等问题,难以满足现代医疗对精准诊断和个性化治疗的需求。知识图谱作为一种知识表示和管理…

logback日志自定义占位符

前言 在大型系统运维中&#xff0c;很大程度上是需要依赖日志的。在java大型web工程中&#xff0c;一般都会使用slf4jlogback这一个组合来实现日志的管理。 logback中很多现成的占位符可以可以直接使用&#xff0c;比如线程号【%t】、时间【%d】、日志等级【%p】&#xff0c;…

嵌入式知识点总结 C/C++ 专题提升(一)-关键字

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.C语言宏中"#“和"##"的用法 1.1.(#)字符串化操作符 1.2.(##)符号连接操作符 2.关键字volatile有什么含意?并举出三个不同的例子? 2.1.并行设备的硬件寄存…

嵌入式Linux驱动开发之platform

关键词&#xff1a;rk3399 嵌入式驱动 Linux platform 前言 前面的嵌入式Linux驱动都是描述从特定的SOC与特定设备之间的直接两两通信。而Linux不是为单一某一SOC结构而设计的操作系统&#xff0c;它可以运行在X86、ARM等多种架构多种SOC平台上&#xff0c;如果驱动程序按照S…