让我来详细讲解一下Java中new Object()到底占用几个字节。
Java中new Object()的内存分配
在Java中,每当使用new关键字创建一个新的对象时,JVM就会在堆(Heap)中为该对象分配内存空间。对于一个标准的Object对象,它占用的空间大小可以通过Java虚拟机规范中的定义进行推算。
根据Java虚拟机规范,每个对象的大小受到以下几个因素的影响:
1.对象头(Object Header)的大小
2.对象中包含的实例变量(Instance Variables)的大小
3.对象内存对齐(Object Alignment)的大小
其中,对象内存对齐最终会将对象的大小调整为8的倍数(因为在Java虚拟机中,对象内存都按照8字节对齐)。而对象头的大小则受到所在虚拟机的影响,例如在32位虚拟机中对象头大小为8字节(4字节哈希值+4字节类型指针);在64位虚拟机中对象头大小为16字节(8字节哈希值+4字节类型指针+4字节补充位)。
综上所述,当我们创建一个标准的Object对象时,它的具体大小根据所在虚拟机的位数而定。但大致上,它所占用的大小应该为:8字节(对象头)+对齐后的4字节 = 12字节。
示例1
public class ObjectSizeDemo {
public static void main(String[] args) {
Object obj = new Object();
System.out.println("Object对象占用:" + memorySizeOf(obj) + " bytes");
}
public static long memorySizeOf(Object obj) {
return InstrumentationAgent.getObjectSize(obj);
}
}
class InstrumentationAgent {
private static Instrumentation instrumentation;
public static void premain(String agentArgs, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object obj) {
return instrumentation.getObjectSize(obj);
}
}
上述示例中,我们通过使用Java Agent实现了内存大小的测量,该实现方式利用了Java提供的Instrumentation接口,该接口的getObjectSize方法可以获取一个对象的内存大小。
示例中的main方法中,我们创建了一个Object对象,并使用自定义的memorySizeOf方法获取该对象的占用空间。根据Java虚拟机的内存分配规则,该Object对象所占用的空间应该为12字节(8字节对象头+4字节对齐),因此输出结果为Object对象占用:12 bytes。
示例2
public class ObjectArraySizeDemo {
public static void main(String[] args) {
Object[] objArray = new Object[3];
objArray[0] = new Object();
System.out.println("Object数组占用:" + memorySizeOf(objArray) + " bytes");
}
public static long memorySizeOf(Object obj) {
return InstrumentationAgent.getObjectSize(obj);
}
}
class InstrumentationAgent {
private static Instrumentation instrumentation;
public static void premain(String agentArgs, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object obj) {
return instrumentation.getObjectSize(obj);
}
}
上述示例中,我们在main方法中创建了一个长度为3的Object数组,并将其第一个元素设为新构建的Object对象。同样地,我们利用Java Agent的方式获取该Object数组所占用的空间。
根据Java虚拟机的内存分配规则,该Object数组的占用空间由数组对象头和3个Object对象共同组成。因此,其占用空间应该为:
8字节数组对象头+34字节(数组中有3个指向Object对象的指针)+3(8字节对象头+4字节对齐)=44字节
因此,输出结果为Object数组占用:44 bytes。
总结
通过以上两个示例,我们可以看到在Java虚拟机中,使用new Object()所创建的对象占用的空间大小是由对象头的大小、实例变量的大小、对象内存对齐三个因素共同影响的。具体方式可以通过Java Agent相关的API来获取。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:面试官:Java中new Object()到底占用几个字节 - Python技术站