在Java中为静态基元类型和静态引用类型分配了多少内存

时间:2017-06-08 08:44:13

标签: java memory

我有两个不同的静态变量类。一个类具有静态引用类型变量,另一个类具有静态基元类型变量。当我使用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如何为上述场景分配内存吗?

提前致谢。

此致 萨拉

1 个答案:

答案 0 :(得分:0)

getObjectSize()旨在给出指定类型的对象大小的近似值。它们不受静态字段的影响,因为静态字段基于per 类型而不是per 对象

添加任意数量的静态字段,我不希望getObjectSize更改。