Java中为静态原语类型和静态引用类型分配了多少内存

Java中为静态原语类型和静态引用类型分配了多少内存,java,memory,Java,Memory,我有两个不同的类和静态变量。一个类具有静态引用类型变量,另一个类具有静态基元类型变量。当我使用Instrumentation.getObjectSize()方法计算每个静态变量的大小时,它返回相同的大小。但据我所知,类对象在其全局变量之外还有头部分和填充部分,所以与基元类型相比,这个引用类型在内存中应该总是很好的。请在下面找到我的代码: ObjectSizeFetcher.java import java.lang.instrument.Instrumentation; public clas

我有两个不同的类和静态变量。一个类具有静态引用类型变量,另一个类具有静态基元类型变量。当我使用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);
    }
}
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;
    }
}
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);

}
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
    }
}
DaysOfWeek1.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);
    }
}
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;
    }
}
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);

}
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
    }
}
DaysOfWeek2.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);
    }
}
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;
    }
}
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);

}
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
    }
}
Test.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);
    }
}
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;
    }
}
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);

}
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是如何为上述场景分配内存的吗

提前谢谢

问候,, Sarath

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


添加尽可能多的静态字段,我不希望
getObjectSize
发生变化。

那么在我的情况下,应该会出现以下结果。案例1:DaysOfWeek1.Friday头8个字节,int字段4个字节,填充4个字节,总共16个字节。案例2:DaysOfWeek2.Sunday是一个静态整数,所以它的大小应该是4字节。案例3:i它是局部整数变量,大小应为4字节。我在上述情况下是正确的吗?@sarathkumar:是的,它确实打印了16页。那么,有什么让人困惑呢?在最后两种情况下,它打印的值是错误的,对吗?@sarathkumar:试图回复一条被多次编辑的评论是非常令人沮丧的。不,任何时候传递
int
值时,它都会被装箱到
Integer
。因此,您正在查找一个
Integer
对象的大小,它的标题为8字节,int字段为4字节,填充为4字节,就像
DaysOfWeek1
。因为这是我第一次使用此窗口,所以当我按enter键时,添加了我的注释。很抱歉谢谢你的回答。
Sunday=(1)中的括号怎么了