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,一经查实,立即删除!

相关文章

不安装cudnn可不可以_关于CUDA和cuDNN的安装

不得不说&#xff0c;安装显卡驱动和CUDA、cuDNN是深度学习工作者的必备技能。CUDA(Compute Unified Device Architecture)&#xff0c;是NVIDIA推出的运算平台。cuDNN 专门针对Deep Learning框架设计的一套GPU计算加速方案。虽然安装这不是学习的目的&#xff0c;但却是很多人…

常用自定义注解

导航一、方法计时器二、valid 参数校验的通用返回三、接口访问频次拦截&#xff08;幂等&#xff09;一、方法计时器 注解类&#xff1a;MethodTimer Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) public interface MethodTimer { }处理器&#xff08;需…

python 系统架构_Python之优化系统架构的方案

方案3&#xff1a; 改变系统架构在开始多进程之前&#xff0c;先简单说明一下python GIL, 之前自己对他也有些误解。因为python GIL的机制存在&#xff0c;同时运行的线程只有一个&#xff0c;但这个线程在不同时刻可以运行在不同的核上&#xff0c;这个调度是由操作系统完成的…

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;成为近期话题量十…

ios 图片逆时针旋转_iphone-IOS 竖直拍照被旋转,image-orientation 让图片自动旋转

本文目录结构IOS 垂直拍照的时候会遇到&#xff0c;PC 端读取的时候&#xff0c;逆时针旋转了 90 度的问题&#xff1b;安卓、PS 处理的&#xff0c;相册选择截图等不会出现这个问题&#xff1b;场景说明&#xff1a;这个图片在浏览器里&#xff0c;如果您单独打开的时候&#…

Spring Cloud Alibaba —— Sentinel 入门

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

websocket 获取连接id_websocket建立连接时能传递参数吗

展开全部您可以这样!在js传参的时候参数就和其他地址一样传就行 比如var wsUrl ws://localhost:8080/ScadaWebSocket/ScadaSocket/我的参数webSocketnew WebSocket(wsUrl);后台的类上面的注解这样写ServerEndpoint(value "/ScadaSocket/{param}")注意上面的花3231…

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 数据持久化一、什么是链路追踪 在大型系统的微服务…

使用vim的重不重要_VIM高级操作,经常用vim的应该多学习。多开发效率很有大帮助!...

Vim是号称“编辑器之神”的文本编辑软件&#xff0c;自从接触Vim以来&#xff0c;基本上都是用Vim来修改和编写代码和配置文件的。但是我一直只会用最基本的命令&#xff0c;虽然把HJKL的定位键已操纵地很熟练。但是Vim其他强大的地方却几乎没有触及过。学一样东西&#xff0c;…