JVM学习(四)--对象内存布局

目录

一、对象内存布局

1、对象的实例化

1.1、你有几种方式创建对象?

1.2、创建对象的步骤

1.2.1、从字节码角度看待对象创建过程

1.2.2、从执行步骤角度分析

2、对象的内存布局

2.1、对象头

2.2、实例数据

2.3、对齐填充

3、对象的访问定位

3.1、句柄访问

3.2、直接使用指针访问

HotSpot使用哪种方式呢?


一、对象内存布局

1、对象的实例化

1.1、你有几种方式创建对象?

  1、new ①最常见的方式 ②变形1:Xxx的静态方法 ③变形2:XxxBuilder/XxxFactory的静态方法

  2、Class的newInstance():反射的方式,可以调用空参、带参的构造器,权限必须是public

  3、Constructor的newInstance(Xxx):反射的方式,可以调用空参、带参的构造器,权限没有要求,实用性更广

  4、使用clone():不调用任何构造器,当前类需要实现Cloneable接口,实现clone(),默认浅拷贝

  5、使用反序列化:从文件中,数据库中,网络中获取一个对象的二进制流,反序列化为内存中的对象

  6、第三方库Objenesis,利用了asm字节码技术,动态生成Constructor对象

1.2、创建对象的步骤

1.2.1、从字节码角度看待对象创建过程

(1)、下面从最简单的0bject ref=new object(); 代码进行分析,利用javap-verbose -p 命令查看对象创建的字节码如下:

cmd命令执行class

在IDE编译器上面会被转换成如下

NEW :如果找不到class对象,则进行类加载。加载成功后,则在堆中分配内存,从0bject开始到本类路径上的所有属性值都要分配内存。分配完毕之后,进行零值初始化。在分配过程中,注意引用是占据存储空间的,它是一个变量,占用4个字节。这个指令完毕后,将指向实例对象的引用变量压入虚拟机栈顶。

DUP :在栈顶复制该引用变量,这时的栈顶有两个指向堆内实例对象的引用变量。如果<init>方法有参数,还需要把参数压人操作栈中。两个引用变量的目的不同,其中压至底下的引用用于赋值,或者保存到局部变量表,另一个栈顶的引用变量作为句柄调用相关方法

INVOKESPECIAL:调用对象实例方法,通过栈顶的dup引用变量调用<init>方法

补充:<clinit>是类初始化时执行的方法,而<init>是对象初始化时执行的方法。

面试题:

1、new对象流程?

2、对象创建方法,对象内存分配?

1.2.2、从执行步骤角度分析

1、判断对象对应的类是否加载、链接、初始化

    虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。(即判断类元信息是否存在)。

  • 如果没有,那么在双亲委派模式下,使用当前类加载器以classLoader+包名+类名为Key进行查找对应的.class 文件。
  • 如果没有找到文件,则抛出ClassNotFoundException 异常。。
  • 如果找到,则进行类加载,并生成对应的Class类对象。

2、为对象分配内存

    首先计算对象占用空间大小,接着在堆中划分一块内存给新对象。如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节大小。

    说明:选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

    ①指针碰撞

        如果内存规整,使用指针碰撞
    如果内存是规整的,那么虚拟机将采用的是指针碰撞法(BumpThe Pointer)来为对象分配内存。意思是所有用过的内存在一边,空闲的内存在另外一边,中间放着一个指针作为分界点的指示器,分配内存就仅仅是把指针向空闲那边挪动一段与对象大小相等的距离罢了。 如果垃圾收集器选择的是Serial、ParNew这种基于压缩算法的,虚拟机采用这种分配方式。 一般使用带有compact(整理)过程的收集器时,使用指针碰撞。

    ②空闲列表

        如果内存不规整,虚拟机需要维护一个列表,使用空闲列表分配

    如果内存不是规整的,已使用的内存和未使用的内存相互交错,那么虚拟机将采用的是空闲列表法来为对象分配内存。意思是虚拟机维护了一个列表,记录上哪些内存块是可用的再分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。这种分配方式称为“空闲列表(Free List)”。

3、处理并发安全问题

    在分配内存空间时,另外一个问题是及时保证new对象时候的线程安全性:创建对象是非常频繁的操作,虚拟机需要解决并发问题。 虚拟机采用了两种方式解决并发问题:

  • CAS(Compare And Swap )失败重试、区域加锁:保证指针更新操作的原子性;
  • TLAB 把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲区,(TLAB,Thread Local Allocation Buffer)虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定

4、初始化分配到的空间

    内存分配结束,虚拟机将分配到的内存空间都初始化为零值(不包括对象头)。这一步保证了对象的实例字段在Java代码中可以不用赋初始值就可以直接使用,程序能访问到这些字段的数据类型所对应的零值。

5、设置对象的对象头

    将对象的所属类(即类的元数据信息)、对象的Hashcode和对象的GC信息、锁信息等数据存储在对象的对象头中。这个过程的具体设置方式取决于JVM实现。

6、执行init方法进行初始化

    在Java程序的视角看来,初始化才正式开始。初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。

    因此一般来说(由字节码中是否跟随有invokespecial指令所决定),new指令之后会接着就是执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完全创建出来。

2、对象的内存布局

2.1、对象头

2.2、实例数据

2.3、对齐填充

3、对象的访问定位

3.1、句柄访问

3.2、直接使用指针访问

HotSpot使用哪种方式呢?



JVM学习(一)

JVM学习(三)--运行时数据区

再小的努力,乘以365都很明显!
每天⽤⼼记录⼀点点。内容也许不重要,但习惯很重要!
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!

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

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

相关文章

SQL每日一题(4)

前言&#xff1a;第四更 虽然已经全部做完了&#xff0c;这套卷子非常推荐&#xff01; 根据题目还原出来的原始表 employees表 idnameagestatus1张三28在岗2李四35在岗3王五42在岗4赵六NULL在岗5钱七58在岗6孙八24在岗7周九31离职8吴十-5在岗9郑十一45在岗10王十二52在岗 题…

如何做好一份技术文档?

文章目录 前言一、技术文档的核心原则二、技术文档的类型与场景三、技术文档的写作流程3.1 需求分析阶段&#xff08;文档生产的基础&#xff09;3.2 架构设计阶段&#xff08;文档的骨架搭建&#xff09;3.3 内容开发阶段&#xff08;血肉填充&#xff09;3.4 质量保障阶段&am…

怎么判断一个Android APP使用了KMM这个跨端框架

要判断一个 Android 应用是否使用了 KMM&#xff08;Kotlin Multiplatform Mobile&#xff09; 框架&#xff0c;可以通过以下方法逐步验证&#xff1a; 一、安装包结构分析 解压 APK 将 .apk 文件重命名为 .zip 并解压&#xff0c;检查以下特征&#xff1a; • kotlin/ 目录&a…

Axure系统原型设计列表版方案

列表页面是众多系统的核心组成部分&#xff0c;承担着数据呈现与基础交互的重要任务。一个优秀的列表版设计&#xff0c;能够极大提升用户获取信息的效率&#xff0c;优化操作体验。下面&#xff0c;我们将结合一系列精心设计的列表版方案图片&#xff0c;深入探讨如何打造出实…

HarmonyOS优化应用内存占用问题性能优化四

一、使用purgeable优化C内存 Purgeable Memory是HarmonyOS中native层常用的内存管理机制&#xff0c;可用于图像处理的Bitmap、流媒体应用的一次性数据、图片等。应用可以使用Purgeable Memory存放其内部的缓存数据&#xff0c;并由系统根据淘汰策略统一管理全部的purgeable内存…

第一课如何学习课程

读薄就这些东西 读厚细节&#xff1b;实现了还是很混沌&#xff08;内功心法&#xff09;-》有个项目&#xff1b;在听的过程中写博客&#xff1a;我学了什么&#xff0c;敲代码&#xff1b; 第二章 网络-》9.1kv存储 第三章 基础组件 &#xff08;API函数、最基础的底层架构…

Linux 系统不终止进程的情况下关闭长连接

使用 tcpkill 中断指定 TCP 连接 适用场景&#xff1a;需主动中断已知源IP或目标端口的连接&#xff0c;无需进程重启。 安装 dsniff 工具&#xff08;包含 tcpkill&#xff09;&#xff1a; yum -y install dsniff 捕获并杀死特定连接&#xff08;例如目标IP 192.168.1.10…

TCP原理解析

目录 TCP协议概述 1. 基础寻址段​​ ​​2. 序列控制段​​ ​​3. 控制信息段​​ ​​4. 流量控制段​​ ​​5. 校验与应急段​​ ​​6. 扩展功能段​​ ​​7. 数据承载段​​ TCP原理 确认应答与序列号(安全机制) 超时重传机制(安全机制) 连接管理机制&…

抛弃传统P2P技术,EasyRTC音视频基于WebRTC打造教育/会议/远程巡检等场景实时通信解决方案

一、方案背景 随着网络通信发展&#xff0c;实时音视频需求激增。传统服务器中转方式延迟高、资源消耗大&#xff0c;WebP2P技术由此兴起。EasyRTC作为高性能实时通信平台&#xff0c;集成WebP2P技术&#xff0c;实现低延迟、高效率音视频通信&#xff0c;广泛应用于教育、医疗…

2025年度消费新潜力白皮书470+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p42178 过去一年&#xff0c;消费市场在政策驱动与技术迭代中呈现结构性变革。社零总额达487,895亿元&#xff0c;实物商品网零额占比27%&#xff0c;线上渠道成为增长引擎。本报告从食品饮料、美妆护肤、家电数码、服饰户外四大核心领…

“智”造巨轮启新程:数字安全的战略布局

数据就像空气&#xff0c;无处不在&#xff1b;安全就像呼吸&#xff0c;刻不容缓! 在智能化不断创新的沃土上&#xff0c;某大型智能家电企业这艘智造巨轮正乘风破浪&#xff0c;驶向数字化的深蓝大海。作为全球家电制造的领航者&#xff0c;深知&#xff1a;在这个数字时代&a…

React组件(二):常见属性和函数

文章目录 一、defaultProps 和 prop-types使用 defaultProps 设置组件的默认值使用prop-types进行props数据类型的校验代码举例 二、事件绑定原生js做事件绑定使用 React 提供的方法&#xff0c;做事件绑定 三、生命周期函数&#xff1a;shouldComponentUpdate()四、在js代码中…

redis 进行缓存实战-18

使用 Redis 进行缓存 Redis 通常被认为只是一个数据存储&#xff0c;但它的速度和内存中特性使其成为缓存的绝佳选择。缓存是一种技术&#xff0c;通过将经常访问的数据存储在快速的临时存储位置来提高应用程序性能。通过使用 Redis 作为缓存&#xff0c;您可以显著减少主数据…

【Nginx学习笔记】:Fastapi服务部署单机Nginx配置说明

服务部署单机Nginx配置说明 服务.conf配置文件&#xff1a; upstream asr_backend {server 127.0.0.1:8010; }server {listen 80;server_name your_domain.com;location / {proxy_pass http://localhost:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remot…

Qt网络编程

前言 Qt为了支持跨平台&#xff0c;对系统网络编程的API&#xff08;socket API&#xff09;也进行了重新分装。 实际Qt中进行网络编程也不一定使用Qt封装的网络API&#xff0c;也有可能使用的是系统原生API或者其他第三方框架的API。 若要使用Qt中的网络编程的API&#xff…

矩阵短剧系统:如何用1个后台管理100+小程序?技术解析与实战应用

引言&#xff1a;短剧行业的效率革命 2025年&#xff0c;短剧市场规模已突破千亿&#xff0c;但传统多平台运营模式面临重复开发成本高、用户数据分散、内容同步效率低等痛点。行业亟需一种既能降本增效又能聚合流量的解决方案——“矩阵短剧系统”。通过“1个后台管理100小程…

嵌入式STM32学习——ESP8266 01S的基础介绍

简介 ESP8266 系列模组是深圳市安信可科技有限公司开发的一系列基于乐鑫ESP8266EX的低功耗UART-WiFi芯片模组&#xff0c;可以方便地进行二次开发&#xff0c;接入云端服务&#xff0c;实现手机3/4G全球随时随地的控制&#xff0c;加速产品原型设计。 模块核心处理器 ESP8266 在…

form-create-designer中$inject参数的数据结构及各项属性说明

FcDesigner 是一款基于Vue的开源低代码可视化表单设计器工具&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。并广泛应用于在政务系统、OA系统、ERP系统、电商系统、流程管理等领域。 …

Jasypt概述及整合SpringBoot实现敏感数据加密

前言 在实际开发中&#xff0c;Spring Boot应用的配置文件中经常包含数据库密码、API密钥等敏感信息。如果这些信息以明文形式存储&#xff0c;会带来严重的安全隐患。本文将详细介绍如何使用Jasypt&#xff08;Java Simplified Encryption&#xff09;对Spring Boot配置文件中…

Better Faster Large Language Models via Multi-token Prediction 原理

目录 模型结构&#xff1a; Memory-efficient implementation&#xff1a; 实验&#xff1a; 1. 在大规模模型上效果显著&#xff1a; 2. 在不同类型任务上的效果&#xff1a; 为什么MLP对效果有提升的几点猜测&#xff1a; 1. 并非所有token对生成质量的影响相同 2. 关…