JVM——对象的创建与内存布局

导航

  • 一、对象的创建过程
  • 二、对象的内存布局
    • 2.1 内存布局
    • 2.2 计算对象的内存大小
  • 三、对象的定位
    • 3.1 句柄池
    • 3.2 直接指针
  • 四、对象的分配过程

一、对象的创建过程

对象,又叫实例,是 OOP 的最常用角色。

如何创建一个对象?一般都是使用 new 关键字搭配对象的构造函数:

// 基类的创建
Object obj = new Object();
// 普通用户对象的创建
User user = new User("Tom", 29);
// 服务类对象的创建
Service svic = new ServiceImpl(user);

上述代码创建了三个对象:obj、user、svic。

这个过程大致可以分为以下几个步骤:

  1. 如果该对象的类还未使用过,需要加载类的信息,并完成连接、初始化等操作。参考《JVM——详解类加载过程》
  2. 申请对象,内存成员变量赋 default value,此步骤和类加载过程的 preparation 同理。
  3. 调用构造方法<init> : 成员变量顺序赋初始值,执行构造方法语句
  4. 最后将实例数据的指针返回,存储在位于栈中的引用数据中,即引用赋值。

二、对象的内存布局

2.1 内存布局

在JVM 中,对象的内存布局分为:

  1. 对象头(Header),Mark Word + Class Pointer。
  2. 实例数据(Instance Data),包含父类所有字段信息。
  3. 对齐填充(Padding),任何对象大小都必须是 8 字节的整数倍。

对象头包含两类数据:

  1. Mark Word :它是对象自身的运行时数据,在 Hotspot 虚拟机中,该数据长度是 8 字节(64位操作系统)。包括哈希码、GC分代年龄、锁状态标志、偏向线程ID、偏向时间戳等。
  2. Class Pointer :类型指针,–XX:+UseCompressedClassPointers 压缩类型指针,开启时该数据为 4字节,不开启为 8 字节。

2.2 计算对象的内存大小

Java 语言并不具备类似 C 语言中的 sizeOf 函数,可以直接获取对象的大小。但是,Java 提供了一个 agent 机制,可以通过这个机制来计算 Java 对象的内存大小。

Agent 机制简单的理解就是,一个 class 要加载到内存,JVM 可以提供一个 Agent 代理来截获这些 class 文件,以此来读出整个Object 大小。

三、对象的定位

对象的定位指的是,引用是如何找到具体的实例数据地址的?

目前有两种实现方式:句柄池、直接指针。

两种方式各有优劣,句柄池的方式更安全,而直接指针更快。HotSpot 虚拟机是采用直接指针的方式来实现对象定位的。

3.1 句柄池

在这里插入图片描述

3.2 直接指针

在这里插入图片描述

四、对象的分配过程

首先,new 一个对象的时候,先往栈上分配,如果能分配的下,就直接分配在栈上,然后栈一弹出对象就没了。如果栈上分配不下,特别大的话,直接分配到堆内存老年代。如果不大,首先会进行线程本地分配,如果能分配的下,就直接分配,如果分配不下,找 eden 区。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM垃圾收集器——G1

导航引言一、G1 介绍1.1 适用场景1.2 设计初衷1.3 关注焦点1.4 工作模式1.5 堆的逻辑结构1.6 主要收集目标1.7 停顿预测模型1.8 拷贝和压缩1.9 与 CMS 和 Parallel 收集器的比较1.10 固定停顿目标二、堆的逻辑分区2.1 region2.2 CSet2.3 RSet2.4 Card Table三、G1 的工作原理3.…

的mvc_简述PHP网站开发的MVC模式

为了提高开发时候的代码重用和开发速度&#xff0c;php使用了mvc的模式&#xff0c;主要是对代码的功能进行了分类&#xff0c;M&#xff1a;model主要是对数据库进行操作&#xff0c;v&#xff1a;view主要是前端html文件操作&#xff0c;c&#xff1a;controller主要是编写基…

CAP 原则与 BASE 理论

导航引言一、CAP 原则1.1 Consistency 一致性1.2 Available 可用性1.3 Partition tolerance 分区容错性1.4 CAP 的矛盾1.5 CAP 的组合场景二、BASE 理论2.1 基本可用2.2 软状态2.3 最终一致性2.3.1 因果一致性2.3.2 读自身所写2.3.3 会话一致性2.3.4 单调读一致性2.3.5 单调写一…

java 教室借用管理系统_[内附完整源码和文档] 基于JAVA语言的学生选课信息管理系统...

摘 要本系统运用Java面向对象的方法设计而成。近年来&#xff0c;学生选课系统越来越在高校学生群体中得到普及&#xff0c;其所承担的功能也变得越来越丰富&#xff0c;所起到的作用也变得越来越重要&#xff0c;在被学校学生重视的同时&#xff0c;也意味着它的功能要更加完善…

jMeter 模拟 web 高并发请求

导航一、jmeter 简介与下载二、接口压测设置三、实战演示一、jmeter 简介与下载 Apache JMeter是Apache组织开发的基于Java的压力测试工具。 最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。JMeter 可以用于对服务器、网络或对象模拟巨大的负载&#xff0c…

实施文档_建设工程监理全套资料范本,Word文档附百份案例表格,超实用

建设工程监理全套资料范本&#xff0c;Word文档附百份案例表格&#xff0c;超实用在日常工作中&#xff0c;监理人员不仅需要经常跑腿儿检查&#xff0c;同时还需要提交许许多多的资料存档&#xff0c;甚至可能需要熬夜码字。今天整理的监理资料范本&#xff0c;既能让监理人员…

微服务架构 —— 服务雪崩与容错方案

导航一、什么是服务雪崩二、雪崩效应的三个核心原因三、容错四、业界常见容错思路五、常见容错组件一、什么是服务雪崩 服务雪崩 指的是微服务架构中&#xff0c;微服务各节点之间由于网络通信异常或微服务自身故障等问题&#xff0c;导致请求堆积、任务堆积&#xff0c;消耗和…

手游方舟怎么输入代码_明日方舟再次登顶失败,为了不发十连奖励,鹰角实力控分?...

在明日方舟新版本活动“孤岛风云”正式上线后&#xff0c;关于干员的强度和游戏剧情的讨论也在最近多了起来。尤其是在一周年卫星干员山落地&#xff0c;并且人气干员塞雷娅背后的故事揭晓之后&#xff0c;明日方舟的热度也在玩家圈子中迅速的攀升&#xff0c;成为近期话题量十…

Spring Cloud Alibaba —— Sentinel 入门

导航一、什么是Sentinel1.1 Sentinel 的优点二、整合 Sentinel 演示三、Sentinel控制台与微服务通信的原理四、Sentinel 流控演示一、什么是Sentinel Sentinel 是阿里开源的用于提供微服务架构容错方案的组件。它以流量作为切入点&#xff0c;从流量控制、熔断降级、系统负载保…

Spring Cloud Alibaba —— Sentinel 详细使用

导航引言一、Sentinel的两个基本概念二、流控规则2.1 基本选项2.2 高级选项三、熔断(降级)规则四、热点规则五、授权规则&#xff08;了解&#xff09;六、系统规则&#xff08;了解&#xff09;七、自定义异常返回八、SentinelResource九、Sentinel 规则持久化&#xff08;待补…

扫地机器人单扫和双扫_小米扫拖机器人体验:再见了,拖把君

小米在2016年首次推出了扫地机器人&#xff0c;凭借产品力和性价比&#xff0c;可以说为中国家庭的智能清洁概念普及&#xff0c;立下一功。不过&#xff0c;近两年因为一直没有推出扫拖一体产品&#xff0c;急得民间高手都开始自己动手给米家扫地机改造拖地功能了&#xff0c;…

Spring Cloud —— Gateway 服务网关

导航一、什么是服务网关二、业界常见网关组件三、Spring Cloud Gateway四、Gateway 快速入门4.1 创建 gateway 服务4.2 添加 gateway 依赖和 nacos 依赖4.3 配置路由信息4.4 测试路由转发五、Gateway 执行流程六、Gateway 断言6.1 内置路由断言工厂6.2 自定义路由断言工厂七、G…

图形显卡_选核芯显卡还是独立显卡?这才是决定笔记本电脑性能的关键

买笔记本电脑的时候&#xff0c;选核芯显卡还是独立显卡是很多朋友纠结的问题。核芯显卡是建立在和处理器同一内核芯片上的图形处理单元&#xff0c;而独立显卡拥有单独的图形核心和独立的显存。那么具体哪个更好呢&#xff1f;这里就来介绍一下。两者各自的特点核芯显卡和传统…

Spring Cloud —— 链路追踪技术

导航一、什么是链路追踪二、Spring Cloud Sleuth2.1 相关概念三、Sleuth 入门案例四、Zipkin 的集成4.1 Zipkin 介绍4.2 Zipkin 服务端安装4.3 Zipkin 客户端安装五、Zipkin 数据持久化5.1 MySQL 数据持久化5.2 Elasticsearch 数据持久化一、什么是链路追踪 在大型系统的微服务…

bool类型数组转换成一个整数_「PHP」常用的数组键值操作函数,面试重点

数组键值操作函数1、array_values ( array $array ) : array返回数组中所有的值的数组$a[name>jikeshiguangji,age>26];print_r(array_values($a));运行结果&#xff1a;$aarray("name">"jikeshiguangji","age">"26");pri…

Spring Cloud —— 消息队列与 RocketMQ

导航一、什么是 MQ二、常见的 MQ 产品三、RocketMQ 概念与架构设计3.1 基本概念1、消息模型&#xff08;Message Model&#xff09;2、生产者与消费者&#xff08;Producer & Consumer&#xff09;3、主题&#xff08;Topic&#xff09;4、代理服务器与名称服务&#xff08…

惠普打印机只打印一半_惠普打印机如何安装 惠普打印机加墨方法【介绍】

对于多数上班族和学生党来说&#xff0c;平时办公和学习不仅仅离不开 电脑 &#xff0c;与此同时还需要 打印机 起到辅助作用。目前市场上的打印机品牌较多&#xff0c;惠普就是其中知名度较高的一个牌子&#xff0c;拥有大批的消费群体。但是有些人在将打印机买回来之后&#…

Spring Cloud —— RocketMQ 的消息类型

导航引言一、普通消息1.1 可靠同步发送1.2 可靠异步发送1.3 单向发送二、顺序消息三、事务消息3.1 什么是事务消息3.2 事务消息示例1、编写本地事务逻辑2、发送半事务消息3、注册本地事务监听器4、测试引言 本文承接《Spring Cloud —— 消息队列与 RocketMQ》 RocketMQ 提供…

城市运行一网统管_全国率先!“一屏观天下、一网管全城”,临港城市运行“一网统管”平台启动建设...

景区里是否出现了大客流&#xff1f;渣土车是否有违规&#xff1f;工地上有没有安全隐患&#xff1f;……8月12日&#xff0c;临港新片区城市运行“一网统管”平台正式启动建设&#xff0c;临港新片区城市运行“一网统管”中长期规划也正式发布&#xff0c;通过构建具有临港新片…

Spring Cloud Alibaba —— Nacos Config 配置中心

导航引言一、什么是配置中心二、常见的配置中心组件三、Nacos Config 入门四、Nacos Config 动态配置4.1 硬编码方式&#xff08;默认支持动态生效&#xff09;4.2 属性注入五、配置共享5.1 相同微服务不同环境间共享5.2 不同微服务配置共享六、Nacos Config 的几个概念总结引言…