数组和链表-内存存储分析

1、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.atguigu</groupId><artifactId>data-structure-alg</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>demo01-array</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.17</version></dependency></dependencies></project>

2、ClassLayout.parseInstance(new Object()).toPrintable()

        //查看对象在内存中是如何保存的?Object o = new Object();//获取对象的布局转为可以输出的字符串 打印System.out.println(ClassLayout.parseInstance(o).toPrintable());
java.lang.Object object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4        (object header: class)    0x00000d5812   4        (object alignment gap)    
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

这段代码是用来打印Java对象的内部布局信息的。具体来说,它使用了ClassLayout类的parseInstance方法来解析一个Object实例的布局,并打印出相应的信息。

输出中的内容描述了对象的内存布局:

  • OFF 和 SZ 分别表示对象在内存中的偏移量和大小。
  • TYPE DESCRIPTION 提供了对象的类型描述。
  • VALUE 是与每个字段关联的值。

从输出中可以看到:

  • 对象头(object header)的 标记(mark)字段位于偏移量0,大小为8字节。synchronized加锁:必须通过对象加锁
  • 对象头的类(class)字段位于偏移量8,大小为4字节。类模板对象的引用,类模板存在方法区(元空间MetaSpace)中,对象可以通过该位置的地址获取到类模板对象
  • 对象头后面有一个4字节的空隙,可能是用于对齐。
  • 实例大小(Instance size)为16字节。
  • 内部空间损失(Space losses)为0字节,外部空间损失为4字节。

需要注意的是,输出的信息可能因JVM的实现和版本而有所不同。因此,如果你在不同的JVM或不同的Java版本上运行此代码,可能会得到不同的输出结果。

3、ClassLayout.parseInstance(new int[5]).toPrintable()

        //int类型数组的值占的内存:4*5=20byteint[] ints = new int[5];System.out.println(ClassLayout.parseInstance(ints).toPrintable());

 

[I object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4        (object header: class)    0x000065f812   4        (array length)            516  20    int [I.<elements>             N/A36   4        (object alignment gap)    
Instance size: 40 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

4、 ClassLayout.parseInstance(new long[5]).toPrintable()

        //long类型数组的值占的内存:8*5=40bytelong[] longs = new long[5];System.out.println(ClassLayout.parseInstance(longs).toPrintable());
[J object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4        (object header: class)    0x0000116012   4        (array length)            516  40   long [J.<elements>             N/A
Instance size: 56 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

 5、ClassLayout.parseInstance(new LinkedList<>()).toPrintable()

        LinkedList<Integer> list = new LinkedList<>();Collections.addAll(list, 1, 2, 3, 4, 5);System.out.println(ClassLayout.parseInstance(list).toPrintable());
java.util.LinkedList object internals:
OFF  SZ                        TYPE DESCRIPTION               VALUE0   8                             (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4                             (object header: class)    0x001ef21812   4                         int AbstractList.modCount     516   4                         int LinkedList.size           520   4   java.util.LinkedList.Node LinkedList.first          (object)24   4   java.util.LinkedList.Node LinkedList.last           (object)28   4                             (object alignment gap)    
Instance size: 32 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

 6、object alignment gap

  1. 在Java中,对象的内存布局和对齐与C/C++中的情况略有不同,但"gap"的概念仍然存在。
  2. 在Java中,"gap"通常指的是在对象的内存布局中,为了满足对齐规则而产生的未使用的空间。这与C/C++中的情况类似,但Java的内存模型和垃圾回收机制与C/C++有所不同,因此对象的内存布局和对齐方式也有所不同。
  3. 在Java中,对象的内存布局通常包括对象头、实例数据和对齐填充。对象头包含对象的元数据信息,实例数据包含对象的字段值,对齐填充是为了满足JVM的对齐规则而产生的未使用的空间。
  4. 需要注意的是,Java中的对象对齐规则和填充方式可能会因JVM的实现和版本而有所不同。因此,在不同的JVM或不同的Java版本上,同一个对象的内存布局和对齐方式可能会有所不同。

 7、对象头的作用

在Java中,对象头(Object Header)是Java对象在内存中的元数据部分,它记录了对象的元信息,如类的元信息、哈希码、GC标记等。对象头的作用主要有以下几个方面:

  1. 记录类的元信息:对象头中存储了对象的类信息,包括类的元数据、类加载器信息等。这些信息用于确定对象的类型和行为。
  2. 存储哈希码:对象头中存储了对象的哈希码,用于支持Java的哈希表实现。哈希码是对象在哈希表中的索引,用于快速查找和比较对象。
  3. GC标记:对象头中存储了GC标记信息,用于垃圾回收器跟踪和管理对象。当垃圾回收器需要回收内存时,会通过GC标记来判断哪些对象需要被回收。

需要注意的是,Java中的对象头是JVM内部管理的,对于Java程序来说是透明的。程序员不需要直接操作对象头,只需要关注对象的实例数据即可。

 

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

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

相关文章

动态规划——斐波那契数列模型:1137.第N个泰波那契数

文章目录 题目描述算法原理1.状态表示(最重要的&#xff09;什么是状态表示&#xff1f;状态表示怎么来的呢&#xff1f;本题的状态表示 2.状态转移方程(最难的&#xff09;本题的状态转移方程 3.初始化(后三步完成剩下百分之一的细节问题&#xff09;本题的初始化 4.填表顺序本…

C语言实现快速傅立叶(FFT)(一)

1. FFT理论相关知识 FFT&#xff08;快速傅里叶变换&#xff09;其本质就是DFT&#xff0c;只不过可以快速的计算出DFT结果&#xff0c;所以首先应该理解DFT&#xff0c;DFT(Discrete Fourier Transform) 离散傅里叶变换的缩写&#xff0c;FFT(Fast Fourier Transform)快速傅里…

【算法与数据结构】376、LeetCode摆动序列

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题难点在于要考虑到不同序列的情况&#xff0c;具体来说要考虑一下几种特殊情况&#xff1a; 1、上…

4.qml 3D-Light、DirectionalLight、PointLight、SpotLight、AxisHelper类深入学习

今天我们学习灯光类 首先来学习Light类&#xff0c;它是所有灯光的虚基类&#xff0c;该类是无法创建的&#xff0c;主要是为子类提供很多公共属性。 常用属性如下所示&#xff1a; ambientColor : color&#xff0c;该属性定义在被该光照亮之前应用于材质的环境颜色。默认值…

oracle 锁表解决办法

相关表介绍 V$LOCKED_OBJECT&#xff08;记录锁信息的表&#xff09;v$session&#xff08;记录会话信息的表&#xff09;v$sql&#xff08;记录 sql 执行的表&#xff09;dba_objects&#xff08;用来管理对象&#xff0c;表、库等等&#xff09; 查询锁表的 SID select b.…

Cockpit upload文件上传漏洞(CVE-2023-1313)

0x01 产品简介 Cockpit 是一个自托管、灵活且用户友好的无头内容平台,用于创建自定义数字体验。 0x02 漏洞概述 Cockpit assetsmanager/upload接口处存在文件上传漏洞,攻击者可通过该漏洞在服务器端任意上传代码,写入后门,获取服务器权限,进而控制整个web服务器。 0x0…

Web开发伴侣 Prepros 7.17 Crack

您友好的 Web 开发伙伴&#xff0c;Prepros 编译您的文件、转译您的 JavaScript、重新加载您的浏览器并 使开发变得非常容易测试您的网站&#xff0c;以便您可以专注于制作 他们完美。 编译一切 Prepros 可以编译 Sass、Less、Stylus、Pug/Jade、Haml、Slim、CoffeeScript 和 …

翻译: 为什么需要微调大模型 Why Fine-tuning LLM

虽然RAG提供了一种方式来给大型语言模型提供额外的信息&#xff0c;但还有另一种叫做微调&#xff08;fine-tuning&#xff09;的技术&#xff0c;也是给它更多信息的一种方式。特别是&#xff0c;如果你有的上下文比大型语言模型的输入长度或上下文窗口长度更大&#xff0c;那…

如何使用ArcGIS Pro拼接影像

为了方便数据的存储和传输&#xff0c;我们在网上获取到的影像一般都是分块的&#xff0c;正式使用之前需要对这些影像进行拼接&#xff0c;这里为大家介绍一下ArcGIS Pro中拼接影像的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的…

ArcGIS Pro SDK文件选择对话框

文件保存对话框 // 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;//设置文件的保存路径SaveItemDialog saveLayerFileDialog new SaveItemDialog(){Title "Save Layer File",OverwritePrompt true,//获取或设置当同名文件已存在时是否出现…

PPT插件-好用的插件-PPT 素材该怎么积累-大珩助手

PPT 素材该怎么积累&#xff1f; 使用大珩助手中的素材库功能&#xff0c;将Word中的&#xff0c;或系统中的文本文件、图片、其他word文档、pdf&#xff0c;所有见到的好素材&#xff0c;一键收纳。 步骤&#xff1a;选中文件&#xff0c;按住鼠标左键拖到素材库界面中&…

微服务架构之争:Quarkus VS Spring Boot

在容器时代&#xff08;“Docker时代”&#xff09;&#xff0c;无论如何&#xff0c;Java仍然活着。Java在性能方面一直很有名&#xff0c;主要是因为代码和真实机器之间的抽象层&#xff0c;多平台的成本&#xff08;一次编写&#xff0c;随处运行——还记得吗&#xff1f;&a…

虚拟电厂 能源物联新方向

今年有多热&#xff1f;据上海市气象局官微消息&#xff0c;5月29日13时09分&#xff0c;徐家汇站气温达36.1℃&#xff0c;打破了百年来的当地5月份气温*高纪录。不仅如此&#xff0c;北京、四川、江西、湖南、广东、广西等地也频频发布高温预警。 伴随着居民用电急剧攀升&am…

Gitee:远程仓库步骤

第一步&#xff1a;新建仓库 第二步&#xff1a;初始化本地仓库&#xff0c;git init 创建分支 git branch 新分支名 第三步&#xff1a;git add . &#xff1a;添加到暂存区 第四步&#xff1a;git config –global user.email关联邮箱&#xff0c;user.name用户名 第…

WX小程序案例(一):弹幕列表

WXML内容 <!--pages/formCase/formCase.wxml--> <!-- <text>pages/formCase/formCase.wxml</text> --> <view class"bk bkimg"><!-- <image src"/static/imgs/ceeb653ely1g9na2k0k6ug206o06oaa8.gif" mode"scal…

使用opencv的Canny算子实现图像边缘检测

1 边缘检测介绍 图像边缘检测技术是图像处理和计算机视觉等领域最基本的问题&#xff0c;也是经典的技术难题之一。如何快速、精确地提取图像边缘信息&#xff0c;一直是国内外的研究热点&#xff0c;同时边缘的检测也是图像处理中的一个难题。早期的经典算法包括边缘算子方法…

【论文阅读】Uncertainty-aware Self-training for Text Classification with Few Label

论文下载 GitHub bib: INPROCEEDINGS{mukherjee-awadallah-2020-ust,title "Uncertainty-aware Self-training for Few-shot Text Classification",author "Subhabrata Mukherjee and Ahmed Hassan Awadallah",booktitle "NeurIPS",yea…

关于嵌入式开发的一些信息汇总:C标准、芯片架构、编译器、MISRA-C

关于嵌入式开发的一些信息汇总&#xff1a;C标准、芯片架构、编译器、MISRA-C 关于C标准芯片架构是什么&#xff1f;架构对芯片有什么作用&#xff1f;arm架构X86架构mips架构小结 编译器LLVM是什么&#xff1f;前端在干什么&#xff1f;后端在干什么&#xff1f; MISRA C的诞生…

​LeetCode解法汇总1631. 最小体力消耗路径

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 你准备参…

【Linux】使用官方脚本自动安装 Docker(Ubuntu 22.04)

前言 Docker是一种开源平台&#xff0c;用于开发、交付和运行应用程序。它利用了容器化技术&#xff0c;使开发人员能够将应用程序及其依赖项打包到一个称为Docker容器的可移植容器中。这些容器可以在任何运行Docker的机器上快速、一致地运行&#xff0c;无论是开发环境、测试…