怎么确定Java对象的大小

Python021

怎么确定Java对象的大小,第1张

普通对象的结构如下,按64位机器的长度计算1. 对象头(_mark), 8个字节2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节3. 数据区4.Padding(内存对齐),按照8的倍数对齐数组对象结构是1. 对象头(_mark), 8个字节2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节3. 数组长度,4个字节4. 数据区5. Padding(内存对齐),按照8的倍数对齐清楚了对象在内存的基本布局后,咱们说两种计算Java对象大小的方法1. 通过java.lang.instrument.Instrumentation的getObjectSize(obj)直接获取对象的大小2. 通过sun.misc.Unsafe对象的objectFieldOffset(field)等方法结合反射来计算对象的大小java.lang.instrument.Instrumentation.getObjectSize()的方式先讲讲java.lang.instrument.Instrumentation.getObjectSize()的方式,这种方法得到的是Shallow Size,即遇到引用时,只计算引用的长度,不计算所引用的对象的实际大小。如果要计算所引用对象的实际大小,可以通过递归的方式去计算。java.lang.instrument.Instrumentation的实例必须通过指定javaagent的方式才能获得,具体的步骤如下:1. 定义一个类,提供一个premain方法: public static void premain(String agentArgs, Instrumentation instP)2. 创建META-INF/MANIFEST.MF文件,内容是指定PreMain的类是哪个: Premain-Class: sizeof.ObjectShallowSize3. 把这个类打成jar,然后用java -javaagent XXXX.jar XXX.main的方式执行有兴趣可以看下博主的:http://blog.csdn.net/iter_zc/article/details/41822719

Object o=new Object():

在java中空对象占八个字节,对象的引用占四个字节。所以上面那条语句所占的空间是4byte+8byte=12byte.java中的内存是以8的倍数来分配的,所以分配的内存是16byte.

举个例子:

Class O{

int i

byte j

String s

}

其所占内存的大小是空对象(8)+int(4)+byte(1)+String引用(4)=17byte,因要是8的整数倍,所以其占大小为24byte.

当然,如果类里有其他对象的话,也要把其他对象的空间算进去。