了解JVM中的对象开销

时间:2012-06-13 09:48:00

标签: java memory object jvm overhead

我正在研究java,我记得在某个地方读过java对象,在JVM中有一些开销,这是由虚拟机用于管理的原因。所以我的问题是,有人能告诉我是否以及如何在HotSpot JVM中获取对象的总大小,以及它可能带来的任何开销?

3 个答案:

答案 0 :(得分:9)

您不能直接获得开销。开销量取决于实现,并且可能因许多因素而异(例如,精确的JVM版本,以及您是使用32位还是64位JVM)。

然而,假设在像HotSpot这样的典型现代JVM实现中,每个对象的开销<8>在16到16字节之间,这是相当安全的。数组的开销通常比其他对象大4个字节(包含整数数组长度)。

另见:

答案 1 :(得分:1)

我发现this article相当翔实,虽然我对表中提到的一些值有些怀疑

答案 2 :(得分:0)

以下是对象标头,对象开销,数组标头和对象引用的代码段。希望它对某人(如果不是OP的话)有所帮助,因为这是一个相当老的问题。

    private static int OBJ_HEADER;
    private static int ARR_HEADER;
    private static int INT_FIELDS = 12;
    private static int OBJ_REF;
    private static int OBJ_OVERHEAD;
    private static boolean IS_64_BIT_JVM;

     static {
    String arch = System.getProperty("sun.arch.data.model");

    IS_64_BIT_JVM = (arch == null) || arch.contains("32");
    OBJ_HEADER = IS_64_BIT_JVM ? 16 : 8;
    ARR_HEADER = IS_64_BIT_JVM ? 24 : 12;
    OBJ_REF = IS_64_BIT_JVM ? 8 : 4;
    OBJ_OVERHEAD = OBJ_HEADER + INT_FIELDS + OBJ_REF + ARR_HEADER;
       }

我应该说我只知道解决方案,但是我还没有弄清楚为什么这种方法有效。这就是为什么人们应该在代码中留下注释的原因……哦,好了,当我弄清楚它的时候,我将分享其背后的逻辑。