3

ヒープとガベージコレクターの仕組みを理解しています。ガベージコレクションは世代ごとに発生し、メモリ割り当ては順次発生し、ガベージコレクション中にデータをシフトして継続ブロックを形成することで圧縮された空き/未使用スペースなどがあります。

割り当てられたメモリ チャンクのヘッダーはありますか?それらはどのくらいの大きさですか (.NET CLR の場合は 8 ~ 16 バイトだと聞きました)、バイト、ワード、またはクワッド ワード アラインメントが存在する場合は? x86 および x64 プロセッサ アーキテクチャの JIT (Java) および CLR (.NET Framework または Mono) の実装に関する情報に興味があります。

4

3 に答える 3

5

ヘッダーのサイズは2ワードだと思います。1つは型参照用で、もう1つは同期ブロックとその他のフラグ用です。パディングは(私が思うに)合計サイズを整数の単語に切り上げるのにちょうど十分です。

たとえば、ここに示すように、「int」のみを含む参照型は、x86で12バイトを使用します。

using System;

public class Foo
{
    int x;

    public Foo(int x)
    {
        this.x = x;
    }
}

public class Test
{
    static void Main(string[] args)
    {
        int length = int.Parse(args[0]);

        Foo x = new Foo(0);
        Foo[] array = new Foo[length];
        // Make sure that JITting the string constructor doesn't
        // change things
        long start = GC.GetTotalMemory(true);
        for (int i=0; i < length; i++)
        {
            array[i] = new Foo(i);
        }
        long end = GC.GetTotalMemory(true);

        GC.KeepAlive(array);
        GC.KeepAlive(x);

        decimal totalDecimal = end-start;
        Console.WriteLine(totalDecimal / length);
    }
}

興味深い点の1つ-何らかの理由で、System.Objectのインスタンスは、他の方法で予測した8バイトではなく12バイト(x86上)を使用します。最小サイズが12バイトであるかのようですが、実際のデータの最初の4バイトは解放されます:)

報告されたサイズが正確に整数ではない理由はわかりませんが、マネージドヒープのページごとに必要な少しの余分なメモリなどと関係があるのではないかと思います。結果が12を少し超える場合もあれば、12を少し下回る場合もあります。これは、指定された長さに依存しているようです。(この回答の以前のバージョンには、最初のコマンドライン引数を解析するが無視するというバグがありました。これを修正しました。)とにかく、このわずかな不正確さはサイズとは関係がないと思います。メモリ内の個々のオブジェクトの。

于 2009-02-06T17:02:00.933 に答える
1

この質問に対する完全な答えは、実際にはかなり複雑です。オブジェクトの割り当てに関連するオーバーヘッドは、特定の仮想マシンの実装の詳細だけでなく、たとえばオブジェクトが存在する世代 (つまり、特定のオブジェクトに関連するオーバーヘッドは、オブジェクトの存続期間中に変化する可能性があります)。

特定のオブジェクトのオーバーヘッドを見積もるために使用できる単純なユーティリティはほとんどありませんが、確実なものはありません (たとえば、http://java.sun.com/docs/books/performance/1st_edition/html/JPRAMFootprint.fm. html )。

Java には、オーバーヘッドを含むオブジェクト サイズを提供するインターフェイスもあります。 http://download-llnw.oracle.com/javase/6/docs/platform/jvmti/jvmti.html#GetObjectSizeを参照してください。

于 2010-08-25T08:21:28.650 に答える