原文 https://blog.youkuaiyun.com/iter_zc/article/details/41822719#
普通对象的结构如下,按64位机器的长度计算
-
对象头(_mark), 8个字节
-
Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节
-
数据区
4.Padding(内存对齐),按照8的倍数对齐
数组对象结构是
-
对象头(_mark), 8个字节
-
Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节
-
数组长度,4个字节
-
数据区
-
Padding(内存对齐),按照8的倍数对齐
清楚了对象在内存的基本布局后,咱们说两种计算Java对象大小的方法
-
通过java.lang.instrument.Instrumentation的getObjectSize(obj)直接获取对象的大小
-
通过sun.misc.Unsafe对象的objectFieldOffset(field)等方法结合反射来计算对象的大小
package sizeof;
import java.lang.instrument.Instrumentation;
public class ObjectShallowSize {
private static Instrumentation inst;
public static void premain(String agentArgs, Instrumentation instP){
inst = instP;
}
public static long sizeOf(Object obj){
return inst.getObjectSize(obj);
}