记一次对java对象在内存中的分析

java 对象 占内存大小 计算方式 及 常用类型的占用

HotSpot的对齐方式为8字节对齐 ----计算公式:(对象头 + 实例数据 + padding) % 8等于0且0 <= padding < 8

Hotspot 机 中 普通对象
32位 对象头 占 8个字节 引用类型 占 4字节
64位 对象头 占 16个字节 引用类型 占 8字节

64位中
空对象数组 对象头 占 24 增加一个长度 增加 一个引用类型的长度 64位中是 8
空的基本数据类型数组 对象头 占 24 增加一个长度 增加一个基本数据类型自身的 长度

64位 压缩后

普通对象 对象头 占 12个字节 引用类型 占 4字节

数组对象压缩后 对象头 占 16
增加一个长度 增加一个基本数据类型自身的 长度
----因为 java 的跨平台性,所以基本类型的数据在32位和64位上占内存大小是一样的

1Bytes = 8bit cpu一次能处理的数据位数----32位和64位----4字节和8字节

对象头的内存布局

对象自身的运行数据 占一次cpu 指向对象实例的指针 占 一次cpu
数组比较特殊,因为要把数据长度存到头部,所以又要占 一次cpu

以上可以看出 普通对象的对象头 有两部分 而 数组对象有三部分
可以推算出
32 位 普通对象 的对象头 是 8 数组 的对象头是 12
64 位 普通对象 的对象头 是 16 数组 的对象头是 24

时间: 2024-10-11 07:42:47

记一次对java对象在内存中的分析的相关文章

Java对象在内存中的存储

Java对象在内存中的存储分3块区域 1.对象头(Header) 2.实例数据(Instance Data) 3.对齐填充(Padding) 一.对象头 哈希码.GC分代年龄.锁状态标志.线程持有的锁.偏向线程ID.偏向时间戳 类型指针 二.实例数据 各种类型的字段(父类继承下来的.子类自身定义的) 相同宽度的字段会被分配到一起 三.对齐填充 没有特别含义,仅仅起着占位符的作用(8字节的整数倍)

Java对象在内存中的状态

可达的/可触及的 Java对象呗创建后,如果被一个或者多个变量引用,那就是可达的,即从根节点可以触及到这个对象. 其实就是从根节点扫描,只要这个对象在引用链中,那就是可触及的. 可恢复的 Java对象不再被任何变量引用就进入了可恢复状态. 在回收该对象之前,该对象的finalize()方法进行资源整理,如果在finalize()方法中重新让变量引用该对象,则该对象再次变为可达状态,否则该对象进入不可达状态. 不可达的: Java对象不被任何变量引用,且系统在调用对象的finalize()方法后依

运行时Java对象在内存中的存储

建立对象是为了使用对象,Java程序需要通过栈上的reference数据来操作堆上的具体对象.对象的访问方式,取决于虚拟机的具体实现.目前主要有句柄和直接指针两种. 句柄访问: 在Java堆中划分一块内存作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息. 句柄访问的优势在于reference中存储的是稳定的句柄地址,对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要修改. 直接指针访问: 直接指针访问方式的最大

java对象的内存布局(一):计算java对象占用的内存空间以及java object layout工具的使用

最近在学习java对象内存布局方面的一些知识,主要是想知道一个java对象到底占用多少内存空间,以及java对象在内存中到底是什么样子的.c/c++中的sizeof运算符能够方便地告诉我们一个变量占用的内存空间,但是在java中却没有直接提供这种机制.如果想获取java对象占用的内存大小,可以利用java的Instrumentation机制.java.lang.instrument.Instrumentation这个接口提供了getObjectSize(Object objectToSize),

Java对象的内存布局以及对象的访问定位

先来看看Java对象在内存中的布局 一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储对象自身的运行时数据,包括哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时 间戳等 类型指针 即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.但是并不是所有类型虚拟机实现都必须在对象数据上保留类型指针,如果对象是一

Java对象的内存布局

Java对象的内存布局:对象头(Header),实例数据(Instance Data),对齐填充(Padding):另外:不同的环境结果可能有差异,我所在的环境是HotSpot虚拟机,64位Windows. 对象头 对象头在32位系统上占用8bytes,64位系统上占用16bytes. System.out.println("sizeOf(new Object()) = " + sizeOf(new Object())); sizeOf(new Object()) = 16 实例数据

java对象占用内存大小计算方式

案例一: User public class User { } UserSizeTest public class UserSizeTest { static final Runtime runTime=Runtime.getRuntime(); public static void main(String[] args) { final int count = 100000; User[] us=new User[count]; long heap1 = 0; for (int i = -1;

Java对象分配内存时的内存图

摘自高琪老师的JAVA教程. Java对象分配内存时的内存图

new Java对象占用内存分析

最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35