我有两个不同的静态变量类。一个类具有静态引用类型变量,另一个类具有静态基元类型变量。当我使用Instrumentation.getObjectSize()方法计算每个静态变量的大小时,它返回相同的大小。但是根据我的理解,类对象在其全局变量之外还有标题部分和填充部分,因此与基本类型相比,此引用类型在内存中总是应该很好。请在下面找到我的代码:
ObjectSizeFetcher.java
import java.lang.instrument.Instrumentation;
public class ObjectSizeFetcher {
private static Instrumentation instrumentation;
public static void premain(String args, Instrumentation inst) {
instrumentation = inst;
}
public static long getObjectSize(Object o) {
return instrumentation.getObjectSize(o);
}
}
DaysOfWeek1.java
public class DaysOfWeek1 {
public static final DaysOfWeek1 Sunday = new DaysOfWeek1(1);
public static final DaysOfWeek1 Monday = new DaysOfWeek1(2);
public static final DaysOfWeek1 Tuesday = new DaysOfWeek1(4);
public static final DaysOfWeek1 Wednesday = new DaysOfWeek1(8);
public static final DaysOfWeek1 Thursday = new DaysOfWeek1(16);
public static final DaysOfWeek1 Friday = new DaysOfWeek1(32);
public static final DaysOfWeek1 Saturday = new DaysOfWeek1(64);
private int intValue;
private DaysOfWeek(int value) {
intValue = value;
}
}
DaysOfWeek2.java
public final class DaysOfWeek2 {
public static final int Sunday = (1);
public static final int Monday = (2);
public static final int Tuesday = (4);
public static final int Wednesday = (8);
public static final int Thursday = (16);
public static final int Friday = (32);
public static final int Saturday = (64);
}
Test.java
public class Test {
public static void main(String[] args) throws Exception {
int i=10;
long value = ObjectSizeFetcher.getObjectSize(DaysOfWeek1.Friday);
System.out.println(value);// provide 16 bytes
long value1 = ObjectSizeFetcher.getObjectSize(DaysOfWeek2.Sunday);
System.out.println(value1);// provide 16 bytes
long value2 = ObjectSizeFetcher.getObjectSize(i);
System.out.println(value2);// provide 16 bytes
}
}
有人能解释一下JVM如何为上述场景分配内存吗?
提前致谢。
此致 萨拉
答案 0 :(得分:0)
getObjectSize()
旨在给出指定类型的对象大小的近似值。它们不受静态字段的影响,因为静态字段基于per 类型而不是per 对象。
添加任意数量的静态字段,我不希望getObjectSize
更改。