1
private button btnNew=new button();
btnNew.addclickhandler(this);
private DataGrid grid;
private void onClick(event click) {grid=new DataGrid();}

こんにちは、私はこのサンプルのようなコードを書きます。ユーザーが btnNew をクリックするたびに、ヒープとスタック メモリで何が起こっているかを知りたいです。たとえば、ヒープ メモリの新しいブロックはこのグリッドに割り当てられますか?または古いブロックを削除して、この新しいブロックに置き換えますか?または、古いブロックがヒープ メモリに残り、新しいブロックがそれに割り当てられます。

このコード ブロックは、数回のクリックで巨大なメモリを割り当てますか? ** DataGrid は、このタイプの新しいステートメントの使用法とメモリ割り当てについて知りたい任意のコンポーネントに置き換えることができます ** 英語が下手で申し訳ありません!

.

4

4 に答える 4

4

ヒープとスタックメモリに関して何が起こっていますか?

ボタンは参照型でグローバルに宣言されているため、スタックではなくヒープに割り当てられます。

ヒープ メモリ内の新しいブロックがこのボタンに割り当てられていますか?

はい、メモリが利用可能な場合、それ以外の場合は未到達の参照が削除され、これが割り当てられます

このコード ブロックは、1 回のクリックで大量のメモリを割り当てますか?

いいえ、しかし、1000 個のボタンを追加すると、そうなります

メモリの内部構造をよりよく理解するために、Jon Skeet によるこのクールな記事「Memory in .NET - what going where」を参照してください。

乾杯

于 2010-07-16T04:56:54.207 に答える
2

これは大きなトピックです。これは、「ブラウザに www.amazon.com と入力した場合、次に何が起こるか?」と尋ねることに似ています。その質問に完全に答えるには、インターネット全体のアーキテクチャを説明する必要があります。あなたの質問に完全に答えるには、最新のオペレーティング システムのメモリ モデル全体を理解する必要があります。

まず、メモリとガベージ コレクションの基礎について読むことから始めてください。

http://msdn.microsoft.com/en-us/library/ee787088.aspx

そして、わからないことは具体的に質問してください。

于 2010-07-16T15:56:33.313 に答える
0

new ステートメントを使用すると、ヒープにメモリが割り当てられます。通常、新しいメモリが割り当てられます。btnNew ポインターがボタン オブジェクトに関連付けられた唯一のポインターである場合、ガベージ コレクターのターゲットになる必要があります。したがって、メモリは再び解放されます。複数回クリックしても同じことが起こりますが、ガベージ コレクターはリアルタイムで動作しないことに注意してください。そのため、大きなオブジェクトを割り当てる高頻度のループでは、「新規」が c# で問題になる可能性があります。

于 2010-07-16T04:54:42.427 に答える
0

ボタンがクラス (参照型) の場合、ヒープに割り当てられます。(値の型は、現在の CLR 実装のスタックに割り当てられます。ただし、値の型が別の参照型に含まれているか、クロージャーにキャプチャされている場合は、ヒープ上にあります)。

ガベージ コレクタには、ジェネレーション 0、1、および 2 に対応するさまざまなサイズのメモリ セグメントが事前に割り当てられています。オブジェクトを新しく作成すると、そのオブジェクトはジェネレーション 0 に割り当てられます。ポインタを移動するだけなので、この割り当ては非常に高速です。デルタ = オブジェクトのサイズ。CLR は、ctor を実行する前の前提条件として、オブジェクトの値をデフォルト値にクリアします。

定期的にすべてのスレッドが一時停止され、ガベージ コレクターが実行されます。「ルート」をトラバースすることにより、到達可能なオブジェクトのグラフを作成します。到達不能なオブジェクトはすべて破棄されます。世代セグメントは、断片化を避けるために移動/圧縮されます。Gen 0 は 1 よりも頻繁に収集されます (Gen-0 オブジェクトは短命のオブジェクトである可能性が高いため)。コレクションの後、アプリ スレッドが再開されます。

詳細については、ガベージ コレクタとジェネレーションについて説明しているドキュメントを参照してください。これが1 つです。

于 2010-07-16T04:56:12.150 に答える