新しいオブジェクトが作成されるたびに、そのオブジェクトはヒープ上に作成されます。各オブジェクトに割り当てられたメモリには、1)型オブジェクトポインタ2)同期ブロックインデックスという2つの追加フィールドがあります。ヒープに割り当てられたオブジェクト
これらの2つのフィールドの使用方法はまったく同じです。誰でもこのことを明らかにすることはできますか?
新しいオブジェクトが作成されるたびに、そのオブジェクトはヒープ上に作成されます。各オブジェクトに割り当てられたメモリには、1)型オブジェクトポインタ2)同期ブロックインデックスという2つの追加フィールドがあります。ヒープに割り当てられたオブジェクト
これらの2つのフィールドの使用方法はまったく同じです。誰でもこのことを明らかにすることはできますか?
タイプオブジェクトポインタは、オブジェクトのタイプを表すために使用されます。
GetType
を呼び出す場合Type
オブジェクトを検索syncblockフィールドは、主にロックに使用されます。必要なときにのみ埋められ、ロックが常に競合しない場合、CLRは外部データを必要としない「シン」ロックを使用します。それ以外の場合は、プロセス全体のテーブルのエントリです。テーブルの内容についてはわかりませんが、オブジェクトのモニタで待機しているスレッドのリストのようなものだと思います。もちろん、情報の最も重要な点は、ロックが現在保持されているかどうか、スレッドによって何がカウントされているか(.NETロックの再入可能性のため)です。
GetHashCode()
を呼び出しても上書きされない場合は、syncblockも入力されます。これは、プロセス全体のテーブルを使用して基本的に安定した数値を割り当てます。
GetHashCodeとsyncblockについてもっと詳しく知りませんか?私はこのhttp://blogs.msdn.com/brada/archive/2003/09/30/50396.aspxを見つけたが、.NET 1.0/1.1のみと思われる。 – thecoop
@thecoop:私は何も持っていない私はそれがCLRでC#を介して言及されることを期待していますが、手に他の参照。 –
私は、syncblockは、COM相互運用機能のメタデータとAppDomainIDを格納するためにも使用されると考えています(@JonSkeetは "_process-wide_ table"のエントリです) – Sindhudweep
Typeオブジェクトは、同期のために使用さobj.GetTypeコール
シンクブロックによって返されたものです
参照:
シンクブロックインデックスは、監視クラスによってロックされ、ロックステートメントによっても使用されます。
シンクブロックインデックスのいくつかのビットは、もはや参照されなくなった場合にオブジェクトをガーベジとしてマークするためにGCによって使用されます(このオブジェクトのアドレスは時間とともに変化するため十分ではありません)。
すべてのオブジェクトが特定のタイプであると仮定すると、howelseはタイプをどこかに記録しないと、実行時間を知っているはずです...?その種のものを読んで心配しないで、自分のコードを心配してください。 –
@mPまさに - 値の種類の情報を記録しないのはなぜですか?あなたのツールの仕組みを知ることは常に価値があります。 – TarkaDaal