さまざまなデータ構造が占有するメモリを特定するコードをいくつか書きました。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;
}
}
}