首页 > 系统相关 >java 内存布局

java 内存布局

时间:2024-02-05 18:44:26浏览次数:26  
标签:读取 java 字节 16 对象 布局 内存 对齐 指针

面试题:初始化创建的对象有多大?

答案: 16字节

Object a = new Object();  16字节
String[] b = new String[2](); 16字节 / 24字节

对象的内存布局

image
主体内容包括:

  • 对象头: MarkWord、指针、数字长度(数组对象才有)
  • 数据体: 对象的数据,初始化一般为 空
  • 数据对齐:要求对象大小,为8的倍数,而做的特殊设置

普通对象

  • 对象头:包括 :markWord + 指针
    • markword 为8个字节
    • classPointer 指针:指向对应的 class的指针,一般为 8个字节,如果开启“ -XX:+UseCompressedClassPointers”,则压缩为 4个字节。
  • 实际数据:成员变量 和 引用类型
  • 对齐 padding :(在内存读取数据的时候,是按块读取的,不是按字节读取的,读取数据应为8的倍数。如果对象为15 个字节,在读取的时候,读取16个字节。)

new Object() 的大小为 16.

  • MarkWord为 8个字节,指针(Class Pointer)压缩情况下为4个字节。实体数据内容为0个,padding 操作(对齐)。最后结果为16个。
  • MarkWord为 8个字节,指针(Class Pointer)不压缩情况下为4个字节。实体数据内容为0个,padding 操作(对齐)。最后结果为16个。

数组对象

  • 对象头:markword + classPointer 指针
  • 数组长度 :数组长度 为 4个字节
  • 数组数据
  • 对齐 padding

new int[];

  • MarkWord为 8个字节,指针(Class Pointer)压缩情况下为4个字节,数组长度为 4个字节。实体数据内容为0个,padding 操作(对齐)。最后结果为16个。
  • MarkWord为 8个字节,指针(Class Pointer)不压缩情况下为8个字节,数组长度为 4个字节。实体数据内容为0个,padding 操作(对齐)。最后结果为24个。

对象头都会包什么信息

第一个 锁的信息,代表对象有没有被锁定
第二个 GC 标记,对账被GC标记的分代年龄

java 引用对象的方法有几种

2种。

  • 句柄池法(间接指针):存在一个句柄池,记录所有对象的地址。引用对象时,从句柄池中找对象地址,并引用
  • 直接指针法:通过对象头的指针,找到对象地址。

JVM 是使用直接指针法~~ !!!!

为什么对象要对齐

  假设我们使用64位操作系统,也就是说,一次寻址(读取)64个二进制位,也就是 8字节的寻址空间。换句话说,系统一次读取8个字节的内容。

常识: 一个字节为8个二进制位。

简单举例:
image
  boolean、int、char想要获取,都是读取一次就行,读取前半部分就可以。但如果想读取long需要读取两次,才能得到结果。
  所以添加了对齐操作。
image
就是这么简单,从而提升性能的。

标签:读取,java,字节,16,对象,布局,内存,对齐,指针
From: https://www.cnblogs.com/zz-1q/p/18008602

相关文章

  • java lambda 求分组内最大值
    可以使用lambda表达式,比较方便,这里主要想说下思路问题,之前一个时受到数据库的影响,一个是对api理解程度不够的原因,实现方式见方式一;后来有种恍然大悟的感觉,改成了方式二的实现;方式一:先分组,组内过滤每一条数据Map<String,List<UserLog>>collect=list.stream().collect(Collec......
  • 内存与压缩
    内存压缩是一种提高计算机内存使用效率的技术。内存压缩通常是操作系统内存管理的一部分,它的主要目的是在物理内存不足时,通过压缩不常用的内存页面来释放空间,而不是将它们写入硬盘。这种压缩存储的概念允许系统在有限的物理内存中保持更多的数据。具体如下:内存压缩的工作原理:当......
  • 32-Java中字符串、json、map之间的互相转换
    Java中字符串、json、map之间的互相转换 1.map转String、jsonObject对象packagemap;importjava.util.HashMap;importjava.util.Objects;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;publicclassMapDemo3{publicstatic......
  • 打开java语言世界通往字节码世界的大门——ASM字节码操作类库
    一、ASM介绍1、ASM是什么ASM是一个通用的Java字节码操作和分析框架。它可以用于修改现有类或直接以二进制形式动态生成类。ASM提供了一些常见的字节码转换和分析算法,可以从中构建定制的复杂转换和代码分析工具。ASM提供了与其他Java字节码框架类似的功能,但侧重于性能。由于它的......
  • Java 将PDF转为PowerPoint (2行代码)
    通过编程实现PDF转PPT的功能,可以自动化转换过程,减少手动操作的工作量,并根据需要进行批量转换。将PDF文件转换为PPT文档后,可以利用PPT的丰富功能和动画效果,达到更好的演示效果。在Java中,我们可以使用第三方库Spire.PDFforJava来将PDF转换为PowerPoint文档。以下示例包含将PDF转......
  • 内存
    一、内存的物理机制为了能够对内存有一个整体把握,首先让我们来看一下内存的物理机制。内存实际上是一种名为内存IC的电子元件。虽然内存IC包括DRAM、SRAM、ROM”等多种形式,但从外部来看,其基本机制都是一样的。内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量......
  • .net CPU和内存爆高的分析与处理01
    一、问题现象从截图现象看,应用程序CPU和内存都上去了。并且还是导致程序崩溃了。这时我想到了在老师(一线码农)那里学到的分析办法,先抓取一个Dump。然后仔细分析。二、分析Dump通过Address-summary命令,查看内存确实偏高,并且都在托管堆中。2.1确认CPU是否真的存在跑高的的现......
  • docker中调试java代码
    以shiro550为例子在vulhub/shiro/CVE-2016-4437启动环境docker-composeup-d然后看一下当前容器启动的命令是java-jar/shirodemo-1.0-SNAPSHOT.jar将容器内的jar包复制出来dockercp容器id:/shirodemo-1.0-SNAPSHOT.jar.然后ijidea新建项目,并且解压jar包到项......
  • JAVA之BigDecimal详解
    一、BigDecimal概述Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float......
  • Java-08常用容器
    List接口:java.util.List<>。实现:java.util.ArrayList<>:变长数组java.util.LinkedList<>:双链表函数:add():在末尾添加一个元素clear():清空size():返回长度isEmpty():是否为空get(i):获取第i个元素set(i,val):将第i个元素设置为val栈类:java.util.Stack<>函......