文章目录

  • 1 场景
  • 2 内存布局图
  • 3 代码验证
    • 3.1 maven依赖
    • 3.2 代码示例
    • 3.3 输出内容
    • 3.4 分析
    • 3.5 补充
  • 4 问题解答
    • 4.1 new空对象占用多少字节
    • 4.2 Java对象在内存中的布局

1 场景

此文主要分析:

在java中new Object()占用多少字节?在内存中的布局是怎么的?

基于版本:jdk1.8

2 内存布局图

jdk8中,Java对象的内存布局如下图:

其中需注意:

(1)数组对象中才有数组长度这一块内存区

(2)所有的对象大小,必须是8字节整数倍。因此有个内存补齐Padding区,当Java对象的内存不够8字节的整数倍,此Padding区进行补齐。

3 代码验证

验证环境:
64位操作系统+JDK1.8

3.1 maven依赖

<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.14</version>
</dependency>

3.2 代码示例

import org.openjdk.jol.info.ClassLayout;public class ObjectContext {public static void main(String[] args) {Object o = new Object();ClassLayout layout = ClassLayout.parseInstance(o);System.out.println(layout.toPrintable());}
}

3.3 输出内容

java.lang.Object object internals:OFFSET  SIZE   TYPE DESCRIPTION                               VALUE0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

3.4 分析

输出日志中显示:Instance size: 16 bytes,即new Object()占用16个字节。
其中,输出
loss due to the next object alignment

Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
表示内存补齐Padding,占用4个字节

其中:

类型 字节
对象头MarkWord 8
类型指针 4
对象内容 0
内存补齐Padding 4

3.5 补充

启动jvm参数中,禁用指针压缩,加上如下参数:

-XX:-UseCompressedOops

再次执行刚出的java代码,输出日志如下:

java.lang.Object object internals:OFFSET  SIZE   TYPE DESCRIPTION                               VALUE0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4        (object header)                           00 1c 7f 1c (00000000 00011100 01111111 00011100) (478092288)12     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

虽然结果也是16个字节,但是根据:
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
内存补齐Padding,占用0个字节。
即占用分布如下:

类型 字节
对象头MarkWord 8
类型指针 8
对象内容 0
内存补齐Padding 0

4 问题解答

4.1 new空对象占用多少字节

new Object()占用多少内存字节?

当前操作系统基本都是64位,这里参照**《2 内存布局图》**,来分析64位操作系统中需要多少字节。

操作系统 对象类型 指针压缩 明细 总字节数
64位 普通对象 开启 MarkWord:8字节
类型指针:4字节
对象内容:0字节
内存补齐:4字节
16字节
64位 普通对象 关闭 MarkWord:8字节
类型指针:8字节
对象内容:0字节
内存补齐:0字节
16字节
64位 数组对象 开启 MarkWord:8字节
类型指针:4字节
数组长度:4字节
对象内容:0字节
内存补齐:0字节
16字节
64位 数组对象 关闭 MarkWord:8字节
类型指针:8字节
数组长度:4字节
对象内容:0字节
内存补齐:4字节
24字节

4.2 Java对象在内存中的布局

见**《2 内存布局图》**

Java对象内存布局相关推荐

  1. JOL(java object layout --java 对象内存布局)

    JOL(java object layout --java 对象内存布局) ⚠⚠⚠本文以java普通对象为切入点,分析java的对象内存布局,数组见文末 maven地址

  2. JOL(java object layout): java 对象内存布局

    我们天天都在使用java来new对象,但估计很少有人知道new出来的对象到底长的什么样子?对于普通的java程序员来说,可能从来没有考虑过java中对象的问题,不懂这些也可以写好代码.今天,给大家介绍 ...

  3. java对象内存布局中的基本类型字段排列顺序

    java对象内存布局: mark word(记录hashCode值和锁的标识等等) class对象指针 类字段 补齐位 如果是数组对象,2.3之间应该加上  数组长度 布局排列表: 32位jdk 普通 ...

  4. openjdk jol 工具打印 Java 对象内存布局

    1.maven 依赖 <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-cor ...

  5. java 对象内存布局_Java--对象内存布局

    在HotSpot虚拟机中,对象在内存中的存储布局可以分为3块区域:对象头部.实例数据.对齐填充. 一.对象头部Header的布局 Mark Word Class 指针 在32位系统下,上面两部分各占4 ...

  6. Java对象内存布局(JOL)

    前言 Java对象的内存布局主要由对象头(Object Header).实例数据(instance data).对齐填充(padding)三部分组成. 对象头:存储对象的基础信息(如锁状态.GC状态. ...

  7. Java对象内存布局和对象头

    Object obj = new Object(); //new 一个对象,占内存多少? 没有实例数据的话,就是16个字节 1.对象的内存布局 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划 ...

  8. java对象内存布局及大小

    查看虚拟机配置(以hotspot 64bit 虚拟机为例) java -XX:+PrintCommandLineFlags -version 输出结果如下图,表示当前虚拟机的配置信息.每个人的机器可能 ...

  9. java char占用多少字节_Java虚拟机:Java对象大小、对象内存布局及锁状态变化

    一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法.不过还好,在JDK1.5之后引入了Instrumentation类,这个 ...

最新文章

  1. liunx导出mysql慢查询日志查看_查看 MySQL 慢查询日志文件-问答-阿里云开发者社区-阿里云...
  2. linux c 编译错误 conflicting types for ‘xxx’
  3. 获奖公布 | Hello,SDK!数据采集黑客松大赛完美落幕!(含活动预告)
  4. 《数据库系统实训》实验报告——系统安装与数据库搭建
  5. 关闭linux终端,查看、关闭登录到linux的终端
  6. Ubuntu 安装中文
  7. java get post 注解,GET/POST接收或发送数据的问题
  8. 第五节:一个令人兴奋的ES6新特性:解构赋值
  9. Php数组面包屑导航,thinkphp实现面包屑导航(当前位置)例子分享
  10. Altair Inspire Extrude 2021.1.0 Build 6936 x64
  11. idea maven tomcat 热部署
  12. 图解通信原理与案例分析-14:“大哥大”与1G模拟蜂窝移动通信案例--频率调制与频分多址FDMA
  13. 解决latex伪代码标题序号问题
  14. 设计模式(一)--编程界的九阳神功
  15. 预制菜顶流信良记,小龙虾的生意经难念
  16. C++ 对文件的最常用基操之对 ASCII 文件(文本文件、字符文件)的操作
  17. Spark 3.x各模式部署 - Ubuntu
  18. 基于JAVA的类与对象做出的英雄打怪兽程序
  19. php ncr转utf8
  20. 狄利克雷损失函数实现(Dilichlet-evidential deep learning loss)

热门文章

  1. Benefits of SIMD Programming | SIMD的优势
  2. TensorFlow 是一个用于人工智能的开源神器
  3. 3GPP Releases
  4. 笔记:黑客是如何窃取网络传输过程中信息的?
  5. webapi 路由限制命名控件_什么是命名数据网络NDN?
  6. android studio安装Kotlin(零)
  7. rabbitmq的下载与安装windows-64
  8. Google Developers可以访问了?
  9. 原版win7集成usb3.0驱动_windows7的不老传说,十代U安装win7教程
  10. pythoncsv数据类型_python – 从CSV文件行中的值确定数据类型