1

跑步时

java -javaagent:ObjectSizeFetcherAgent.jar PersistentTime

我明白了

24

这个什么时候ObjectSizeFetcherAgent

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

PersistentTime看起来如下

public class PersistentTime {

    List<String>    list    = new ArrayList<String>();

    public static void main(String[] args) {

        PersistentTime p = new PersistentTime();

        p.list.add("a");  // The number is the same with or without this
        p.list.add("b");  // The number is the same with or without this
        p.list.add("c");  // The number is the same with or without this

        System.out.println(ObjectSizeFetcher.getObjectSize(p));
    }
}

为什么向列表中添加元素没有影响?

4

2 回答 2

2

因为getObjectSize返回(特定于实现的近似值)对象的浅大小。这意味着它包括对 List 的引用的大小,但不包括列表本身占用的空间。

于 2012-06-28T21:42:47.723 回答
1

您的PersistentTime对象包含一个引用(对数组列表)。

24 字节对于包含单个引用的对象是典型的。

注意:引用的对象不包括在计算中。getObjectSize不是递归地收集组合的对象大小。这通常是不可能的:可能有无限的参考循环等;我认为没有容易获得的“深度”计算。

于 2012-06-28T21:47:48.667 回答