0

さまざまなデータ構造が占有するメモリを特定するコードをいくつか書きました。classmexer API を使用してディープ/シャロー メモリを取得しました。内部クラス ノードを使用して実装されたカスタム スタックの整数で呼び出しを試みました。オンubuntu lucid)

空のスタックの場合、浅いメモリと深いメモリの両方が 16 バイトです。4 つの整数のスタックの場合、深いメモリは 176 バイトです。以下のように手でメモリを計算したため、この図は混乱しました。

4 つの整数のスタック:

object overhead = 16 bytes
reference to Node inst variable = 8
primitive type int variable = 4
padding = 4
total = 32

Each entry in stack has
Node = 40 bytes(inner class)
Integer field = 24 
total = 64

したがって、32+64N である必要があります。

N = 4 の場合、これは 288 になります。

では、classmexer がメモリ使用量を 176 と表示するのはなぜですか?

もう1つ..自分のシステムでどのように判断するのですかmachine word size.lang.Systemクラスを調べましたが、そのためのAPIが見つかりませんでした

ここに私のコードがあります

public class MemoryUsage {
    private static void linkedListMemUsage(){
        StackOfIntegers si1 = new StackOfIntegers();

        long deepmem = MemoryUtil.deepMemoryUsageOf(si1);
        long shallowmem = MemoryUtil.memoryUsageOf(si1);

        System.out.println("\nfor an empty stack of integers");
        System.out.println("*******************************");
        System.out.println(si1.getClass().getSimpleName()+" took deep:"+deepmem+" bytes");
        System.out.println(si1.getClass().getSimpleName()+" took shallow:"+shallowmem+" bytes");

        StackOfIntegers si2 = new StackOfIntegers();
        si2.push(new Integer(100));
        si2.push(new Integer(200));
        si2.push(new Integer(300));
        si2.push(new Integer(400));

        deepmem = MemoryUtil.deepMemoryUsageOf(si2);
        shallowmem = MemoryUtil.memoryUsageOf(si2);

        System.out.println("\nfor a stack of 4 integers");
        System.out.println("*************************");
        System.out.println(si1.getClass().getSimpleName()+" took deep:"+deepmem+" bytes");
        System.out.println(si1.getClass().getSimpleName()+" took shallow:"+shallowmem+" bytes");


    }
    public static void main(String[] args) {
        linkedListMemUsage();
    }
    class StackOfIntegers{
        private int N;
        private Node first;

        public void push(Integer item){
        Node old = first;
        first = new Node();
        first.item = item;
        first.next = old;
        N++;
        }
        private class Node{
            Integer item;
            Node next;
        }
    }
}
4

0 に答える 0