JVM——10.对象的内存布局

2023-09-19 00:23:28

这篇文章,我们来了解一下对象在内存中的布局是什么样的。

解释:前面有一篇文章我们讲了JVM中类的结构,那里讲的是一个java类,被编译成二进制字节码后,它的结构是什么样的,或者说按照jvm的标准,一个.class文件中类的结构是什么样的。而这里我们要讲的是根据类在堆中创建出来的对象,它在堆中是如何布局,即它在堆中的结构是怎样的。一个是微观的,类层次的,一个是宏观的,对象层次的。这个对象的更底层源码,肯定也是按照java类的结构布局的。

对象的内存布局:一个对象的内容可以分为三大部分,对象头、示例数据、对象填充

对象头(Header

包含两部分

  • 运行时元数据
    • 哈希值( HashCode )
    • GC分代年龄
    • 锁状态标志
    • 线程持有的锁
    • 偏向线程ID
    • 偏向时间戳
  • 类型指针:指向类元数据的InstanceClass,确定该对象所属的类型

说明:如果是数组,还需记录数组的长度

实例数据(Instance Data)
说明:它是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段) 规则:

  • 相同宽度的字段总被分配在一起
  • 父类中定义的变量会出现在子类之前
  • 如果CompactFields参数为true(默认为true),子类的窄变量可能插入到父类变量的空隙

对齐填充(Padding)
不是必须的,也没特别含义,仅仅起到占位符作用

图示小结

更多推荐

c: Sorting Algorithms

SortAlgorithm.h/*****************************************************************//***\fileSortAlgorithm.h*\brief业务操作方法*VSCODEc11https://github.com/hustcc/JS-So

各种数据库分页查询SQL

一、DB2:DB2分页查询SELECT*FROM(Select字段1,字段2,字段3,rownumber()over(ORDERBY排序用的列名ASC)ASrnfrom表名)ASa1WHEREa1.rnBETWEEN10AND20以上表示提取第10到20的纪录select*from(selectrownumber()o

图解 LeetCode 算法汇总——双指针

双指针算法是一种比较常用于搜索链表或数组相关的问题,很多算法的基本的解题思路就是使用暴力搜索法。而双指针是对暴力搜索的一种优化,通过双指针可以减少数据的遍历次数。通常双指针是有两个指针,叫做light左指针和right右指针,或者叫做快指针和慢指针。作为左右指针的话,一般是在数组的或者链表的头尾两侧,从两遍往中间收缩,

【分布式计算】七、同步 synchronization 重难点

两个协议:1、NTP(NetworkTimeProtocal)–>广泛使用机器周期向时间服务器获取准确时间2、没有协议名称−>->−>没有广泛使用时间服务器周期扫描所有机器,计算时间平均值;导致时间服务器负载大,不广泛使用逻辑时钟(logicalclock)是一种次序时间,而非准确物理时钟(anorderingtime

方案:AI赋能,森林防火可视化智能监管与风险预警系统解决方案

一、方案背景森林火灾是世界八大自然灾害之一,具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点,严重危及人民生命财产和森林资源安全,甚至引发生态灾难。有效预防和及时控制森林火灾是保护国家生态建设成果、推进生态文明建设的重要措施。监管痛点:1)现有的森林防火监测系统落后,以人工地面巡护、瞭望塔高点巡查为主

JVM执行流程

一、Java为什么是一种跨平台的语言?通常,我们编写的java源代码会被JDK的编译器编译成字节码文件,再由JVM将字节码文件翻译成计算机读的懂得机器码进行执行;因为不同平台使用的JVM不一样,所以不同的JVM会把相同的字节码文件翻译成不同操作系统认识的机器码,这样就实现了跨平台;二、Java代码的执行流程解释执行为主

LabVIEW在运行时调整表控件列宽

LabVIEW在运行时调整表控件列宽如何在LabIEW中运行时调整表控件的列宽大小?在VI运行时,有两种不同的方法可以更改表中列的宽度。首先,可以使用鼠标手动更改它们;其次,可以从框图中以编程方式更改它们。手动更改列宽只有在启用列标题时,才能使用鼠标更改表的列宽。默认情况下,在LabVIEW中,列标题是禁用的。请按照以

观测云接入 NewRelic .NET 探针

背景部分客户系统采用的是.NET4.5部署研发的、基于IIS进行发布的Web项目,需要接入到观测云进行链路信息展示,ddtrace和otel对于低版本.NET支持力度有限。环境信息IIS4.0.NETcore4.0、4.5、4.6WindowServer2012R2域名配置准备一个域名www.datakit.com,需

ubuntu+.net6+docker 应用部署教程

先期工作1、本地首先安装DockerDesktop2、本地装linuxinwindows3、生成镜像后期工作1、云服务器部署生成镜像方法1、生成Dockerfile配置文件开发工具visualstudio2022如果项目已经存在,可以选中项目,右键点击->选择添加Docker支持。继续选linux项目支持docker后

基于深度学习网络的烟雾检测算法matlab仿真

目录1.算法运行效果图预览2.算法运行软件版本3.部分核心程序4.算法理论概述5.算法完整程序工程1.算法运行效果图预览2.算法运行软件版本matlab2022a3.部分核心程序.......................................................................

Tomcat常见报错以及手动实现Tomcat

一.Tomcat的简单启动1.安装Tomcat2.Tomcat启动1.双击bin目录下的startup.bat文件2.输入http://localhost:8080/,显示如下界面代表安装成功,默认在8080端口3.注意,不要关闭黑窗口,关闭了,tomcat服务就停止了.3.曾经的启动失败案例3.1Tomcat停止时报

热文推荐