5

重複の可能性:
Java で、オブジェクトのサイズを決定する最良の方法は何ですか?

クラス内にインスタンス変数とインスタンスメソッドを作成する場合、このクラスの各オブジェクトに割り当てられた合計メモリを確認する方法は次のとおりです。たとえば、以下に示すように、変数の(a,b)サイズとメソッド領域のサイズ(表示)の一部であると思います。それは本当ですか?クラス内に書かれたメインメソッド領域はどうでしょうか。

例えば:

class A {  
    int a;
    float b;
    void display()
    {  
       ---
    }

    public static void main(String a[])
    { 
        A obj=new A();
    }
}
4

2 に答える 2

8

簡単に言えば、それが問題であることがわかっていない限り、知る必要はありません。

より長い答えは、オブジェクトのヘッダーの約 16 バイト、各フィールドに 4 バイト (合計を 8 バイト境界に丸める)、つまり 24 バイトを使用することです。

参照などのローカル変数はスタックに割り当てられ、通常はカウントされません。

通常サイズを気にしない理由は、1 MB はあなたの時間の約 2 秒の価値があるからです (メモリの小売価格と最低賃金を比較すると)。保存できるメモリの値 (この場合)

[4 GB モジュールの価格は 18 ポンドで、最低賃金は 8.50 ポンドなので、1 GB は約 0.5 時間の価値があります。1 MB は約 2 秒に相当します。]

別の言い方をすれば、単純な変更で 1 MB のメモリを節約できない場合は、時間を無駄にしている可能性があります。

同じことがモバイル デバイスにも当てはまりますが、程度は低くなります (メモリのコストが高くなり、数千のデバイスに展開された場合、数百バイトを節約するための総コストが重要になる可能性があります)。

longこの結果、代わりに、intまたはdouble代わりに(両方とも余分な文字が 1 つある)書くのにかかる時間は、float使用する余分なメモリよりも数千倍の価値がある可能性があります。ただし、ほとんどの場合、float の代わりに double を使用し、int の代わりに long を使用することをお勧めします.


オブジェクトが使用するスペースの量 (またはオブジェクトの作成に使用されるメモリの量) を測定する最も簡単な方法は、TLAB をオフ-XX:-UseTLABにして、オブジェクトが作成される前後のメモリ量を Runtime.totalMemory - freeMemory で測定することです。

ただし、データ構造が YourKit (VisualVM は無料) のようなプロファイラーに表示されるまで待ってから、問題と見なすことを好みます。

于 2012-05-05T07:55:51.780 に答える
1

java.lang.instrumentation パッケージを使用できます: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/instrument/Instrumentation.html

このクラスをコンパイルして JAR に入れます。

import java.lang.instrument.Instrumentation;

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

以下を に追加しますMANIFEST.MF

Premain-Class: ObjectSizeFetcher

使用getObjectSize():

public class C {
    private int x;
    private int y;

    public static void main(String [] args) {
        System.out.println(ObjectSizeFetcher.getObjectSize(new C()));
    }
}

を使用してファイルを呼び出しますjava -javaagent:ObjectSizeFetcherAgent.jar C

于 2012-05-05T07:58:35.317 に答える