Java对象内存布局
文章目录
- 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对象内存布局相关推荐
- JOL(java object layout --java 对象内存布局)
JOL(java object layout --java 对象内存布局) ⚠⚠⚠本文以java普通对象为切入点,分析java的对象内存布局,数组见文末 maven地址
- JOL(java object layout): java 对象内存布局
我们天天都在使用java来new对象,但估计很少有人知道new出来的对象到底长的什么样子?对于普通的java程序员来说,可能从来没有考虑过java中对象的问题,不懂这些也可以写好代码.今天,给大家介绍 ...
- java对象内存布局中的基本类型字段排列顺序
java对象内存布局: mark word(记录hashCode值和锁的标识等等) class对象指针 类字段 补齐位 如果是数组对象,2.3之间应该加上 数组长度 布局排列表: 32位jdk 普通 ...
- openjdk jol 工具打印 Java 对象内存布局
1.maven 依赖 <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-cor ...
- java 对象内存布局_Java--对象内存布局
在HotSpot虚拟机中,对象在内存中的存储布局可以分为3块区域:对象头部.实例数据.对齐填充. 一.对象头部Header的布局 Mark Word Class 指针 在32位系统下,上面两部分各占4 ...
- Java对象内存布局(JOL)
前言 Java对象的内存布局主要由对象头(Object Header).实例数据(instance data).对齐填充(padding)三部分组成. 对象头:存储对象的基础信息(如锁状态.GC状态. ...
- Java对象内存布局和对象头
Object obj = new Object(); //new 一个对象,占内存多少? 没有实例数据的话,就是16个字节 1.对象的内存布局 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划 ...
- java对象内存布局及大小
查看虚拟机配置(以hotspot 64bit 虚拟机为例) java -XX:+PrintCommandLineFlags -version 输出结果如下图,表示当前虚拟机的配置信息.每个人的机器可能 ...
- java char占用多少字节_Java虚拟机:Java对象大小、对象内存布局及锁状态变化
一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法.不过还好,在JDK1.5之后引入了Instrumentation类,这个 ...
最新文章
- liunx导出mysql慢查询日志查看_查看 MySQL 慢查询日志文件-问答-阿里云开发者社区-阿里云...
- linux c 编译错误 conflicting types for ‘xxx’
- 获奖公布 | Hello,SDK!数据采集黑客松大赛完美落幕!(含活动预告)
- 《数据库系统实训》实验报告——系统安装与数据库搭建
- 关闭linux终端,查看、关闭登录到linux的终端
- Ubuntu 安装中文
- java get post 注解,GET/POST接收或发送数据的问题
- 第五节:一个令人兴奋的ES6新特性:解构赋值
- Php数组面包屑导航,thinkphp实现面包屑导航(当前位置)例子分享
- Altair Inspire Extrude 2021.1.0 Build 6936 x64
- idea maven tomcat 热部署
- 图解通信原理与案例分析-14:“大哥大”与1G模拟蜂窝移动通信案例--频率调制与频分多址FDMA
- 解决latex伪代码标题序号问题
- 设计模式(一)--编程界的九阳神功
- 预制菜顶流信良记,小龙虾的生意经难念
- C++ 对文件的最常用基操之对 ASCII 文件(文本文件、字符文件)的操作
- Spark 3.x各模式部署 - Ubuntu
- 基于JAVA的类与对象做出的英雄打怪兽程序
- php ncr转utf8
- 狄利克雷损失函数实现(Dilichlet-evidential deep learning loss)
热门文章
- Benefits of SIMD Programming | SIMD的优势
- TensorFlow 是一个用于人工智能的开源神器
- 3GPP Releases
- 笔记:黑客是如何窃取网络传输过程中信息的?
- webapi 路由限制命名控件_什么是命名数据网络NDN?
- android studio安装Kotlin(零)
- rabbitmq的下载与安装windows-64
- Google Developers可以访问了?
- 原版win7集成usb3.0驱动_windows7的不老传说,十代U安装win7教程
- pythoncsv数据类型_python – 从CSV文件行中的值确定数据类型