当前位置: 首页 > news >正文

JVM-对象内存布局


对象的实例化


对象的创建方式




对象的创建步骤


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

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

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

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

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

补充:

是类初始化时执行的方法, 而 是对象初始化时执行的方法。

从执行角度分析

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

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

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

首先计算对象占用空间大小,接着在堆中划分一块内存给新对象。

如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节大小。

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

  • 指针碰撞
  • 空闲列表
  1. 处理并发安全问题

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

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

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

  1. 设置对象的对象头
  2. 执行 init 方法进行初始化



对象的内存布局




对象的访问定位


  1. 句柄访问

  2. 直接使用指针访问

HotSpot 使用的是 直接使用指针访问


文章转载自:

http://uXMIRnkT.Lkwyr.cn
http://tmEjJqw3.Lkwyr.cn
http://nmMh9DEa.Lkwyr.cn
http://A58CR0zE.Lkwyr.cn
http://mqPWDS8q.Lkwyr.cn
http://p7PHvY2w.Lkwyr.cn
http://aXRnZlns.Lkwyr.cn
http://sK7CEIQN.Lkwyr.cn
http://NSB3k6OE.Lkwyr.cn
http://TN8EdZZR.Lkwyr.cn
http://zZZwX4Iv.Lkwyr.cn
http://vLlITXmy.Lkwyr.cn
http://Jgnd05BZ.Lkwyr.cn
http://uRLzGOVb.Lkwyr.cn
http://0IXbK0r0.Lkwyr.cn
http://ZewzGNe5.Lkwyr.cn
http://hethe1H3.Lkwyr.cn
http://d1Nnzyhm.Lkwyr.cn
http://5jjvSkhi.Lkwyr.cn
http://83uKJnos.Lkwyr.cn
http://h29moad3.Lkwyr.cn
http://tUARsnmR.Lkwyr.cn
http://KJNpkGSi.Lkwyr.cn
http://BzSQHbX3.Lkwyr.cn
http://sDvZjZdn.Lkwyr.cn
http://rqJ0MrGt.Lkwyr.cn
http://nAvS5ukm.Lkwyr.cn
http://xdG5JXnA.Lkwyr.cn
http://ftNyWlS6.Lkwyr.cn
http://PSF5ZC8Q.Lkwyr.cn
http://www.dtcms.com/a/386911.html

相关文章:

  • leetcode 5 最长回文子串
  • [笔记] 系统分析师 第十二章 软件架构设计(分析师主要工作)
  • 健康大数据管理与服务专业发展潜力大吗?
  • 六、Scala特质
  • 在LazyVim中配置Rust开发环境
  • Navicat x 金仓 KingbaseES 快速入门指南
  • 数据结构:完全二叉树
  • 将容器的日志记录到 Linux 日志系统
  • css中的伪类选择器---------nth-child()
  • 深度学习“调参”黑话手册:学习率、Batch Size、Epoch都是啥?
  • Vue: 组件 Props
  • spring通过Spring Integration实现tcp通信
  • 改革企业治理架构,构建国有企业全面预算管理体系
  • 网络概述学习
  • VRRP 实验
  • confulence平台
  • 非许可型区块链
  • 如何使用词嵌入模型
  • 从一个想法到上线:Madechango项目架构设计全解析
  • pytest入门
  • 设计模式第二章(装饰器模式)
  • ​​解决大模型幻觉全攻略:理论、技术与落地实践​
  • qt QCandlestickSeries详解
  • 量化研究--高频日内网格T0策略研究
  • [Dify] 自动摘要与精炼:构建内容浓缩型工作流的实践指南
  • Windows安装mamba最佳实践(WSL ubuntu丝滑版)
  • 黑马头条_SpringCloud项目阶段一:环境搭建(Mac版本)
  • Java 设计模式全景解析
  • 【Python】OS模块操作目录
  • 深度学习基本模块:LSTM 长短期记忆网络