5

言語としてC#を使用した.NETFrameworkを使い始めたところです。私はJavaでのGCの概念をある程度理解しており、今日.NETで同じ概念を再検討しました。

C#では、値の型がスタックに配置されます(Javaの場合と同じように、ローカル変数がスタックに配置されます)。しかし、C#ではstruct、値型にも含まれています。したがって、structsもスタックに配置されます。最悪のシナリオでは、多くのメソッド呼び出しがあり、スタックに多くのメソッドが大量に存在し、各メソッドには多くのローカル値タイプがあり、structそれ自体に多くのローカル値タイプがある多くのsは、ガベージコレクターに影響を与えます。スタック?私が研究したこと(そして部分的に私が教えられたこと)から、私はそれがそうしないことを理解しています。主な理由は、スタックコンテンツの操作には多くのオーバーヘッドが伴うためです。さらに、GCはスタックを参照して参照を検索するだけであり、それ以上のことはありません。

同じトピックに関連する別の質問を追加するだけです。GCへの呼び出しを強制する(System.gc()Javaの場合のように、C#に相当するものについてはわかりません)が、GCルーチンがその場で呼び出されることを保証しません。では、そのような呼び出しをどこにかける必要がありますか?GCを実行する必要があると予想される場所、または呼び出しがすぐにGCをトリガーする保証がないため、ランダムな場所ですか?それとも、ランタイム環境に任せて、気にしないでください。

注:そこから概念をリンクしようとしているため、Javaタグを追加しました。2つの別々のランタイム環境でのGCの内部機能は間違いなく異なることを理解していますが、基本的な概念は同じだと思います。

4

5 に答える 5

2

スタックはガベージコレクターの支援を必要としません。スタックフレーム(スタック内の現在の実行の範囲)から移動すると、新しいスタックフレームを作成するときに、コンテンツを含むフレーム全体が解放(および上書き)されるためです。

function foo(int a, int b) {
  int i;
  doStuff();
}

スタックフレームを作成します(大まかな視覚化)

---- Frame Start ----
(value for parameter a)
(value for parameter b)
(other items needed for tracking execution)
(extra stack frame space
  (value for stack allocated i)
)
---- End of Frame ----

関数に入るときは、フレームが割り当てられるときにスタック割り当て変数が割り当てられます。フレームを出るときは、フレーム全体が破棄され、フレーム割り当て変数のメモリの割り当てが解除されます。

Javaは通常、オブジェクト全体ではなく、オブジェクト参照とスタックローカルプリミティブをスタックに割り当てることに注意してください。最近のいくつかの最適化では、フレーム外では到達できないオブジェクトのスタック内割り当てが許可されています。信頼できるものとは見なされないほどの条件があります。

とはいえ、スタックフレーム内の参照は通常、通常はガベージコレクションされるヒープを指します。

于 2012-07-26T14:32:48.820 に答える
2

ガベージコレクトは、Javaスタック上のオブジェクトに影響を与えません

GCは、jvmのヒープ内のオブジェクトにのみ影響します。Java GCプロセスは多層であり、非常に複雑になる可能性があるため、読む価値があります。http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.htmlのようなサイトをチェックして、その動作をよく理解してください。

システムのGCを強制する限り、それは悪い考えです。jvmは、GCを実行する必要があるときにあなたがより良い考えを持っているでしょう。大きなオブジェクトを割り当てようとしている場合、jvmは、GCを実行するように指示しなくても、スペースが確実に存在するようにします。

編集 私の悪い、あなたはJavaよりもC#に関心があります。メモリ管理の同じ原則が適用され、スタックは影響を受けず、GCを明示的に実行しないなどです。C#はJavaと同様の方法で動作するように設計されています。 http://msdn.microsoft.com/en-us/library/ms973837.aspx

于 2012-07-26T14:34:51.183 に答える
1

いいえ。AFAIKGCはスタックに影響しません。HEAPメモリにのみ影響します。スタックフレームはメソッド呼び出し時に作成され、メソッド終了時に削除されます。

編集

このMSDNの記事では、GCが.NETFrameworkでどのように機能するかについて説明しています。

于 2012-07-26T14:31:30.240 に答える
1

これを.NETで読むと、マネージヒープでのみ機能します。

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

MSDNは情報の宝庫のようです。これは、CLRのGCに関する親トピックです。

http://msdn.microsoft.com/en-us/library/0xy59wtx

于 2012-07-26T14:32:28.500 に答える
1

.NETガベージコレクションについては、MSDNのガベージコレクションで詳しく説明されています。ガベージコレクタは、マネージヒープ内のメモリのみを追跡します。

于 2012-07-26T14:35:41.083 に答える