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オブジェクトの浅いサイズ (実装固有の概算値) を返すためです。つまり、リストへの参照のサイズは含まれますが、リスト自体が占めるスペースは含まれません。

于 2012-06-28T21:42:47.723 に答える
1

オブジェクトは、(配列リストへの) 1 つの参照のみPersistentTime構成されます。

1 つの参照を含むオブジェクトの場合、24 バイトが一般的です。

注: 参照されたオブジェクトは計算に含まれません。getObjectSize結合されたオブジェクトのサイズを再帰的に収集していません。これは一般的には不可能です。無限の参照ループなどが存在する可能性があります。簡単に利用できる「深いサイズ」の計算はないと思います。

于 2012-06-28T21:47:48.667 に答える