void method()
{
Type obj = new Type() ;
}
はたぶん私は何かを誤解スタックから根を追跡し続けますが、関数が戻ると、スタックが巻き戻されたとき、「objの何とかルートセットから削除する必要があります。このメカニズムはどのように機能しますか?私は既にhereを検索してそれを検索しましたが、私の質問を明確にするものは何も見つかりませんでした。どのようにガベージコレクタは
void method()
{
Type obj = new Type() ;
}
はたぶん私は何かを誤解スタックから根を追跡し続けますが、関数が戻ると、スタックが巻き戻されたとき、「objの何とかルートセットから削除する必要があります。このメカニズムはどのように機能しますか?私は既にhereを検索してそれを検索しましたが、私の質問を明確にするものは何も見つかりませんでした。どのようにガベージコレクタは
メソッドを完全に高価すぎるように呼び出す「減算」はありません。ここでの主な役割は、ジャストインタイムコンパイラによって行われます。 MSILを機械コードに変換するだけでなく、メソッドがオブジェクトをどのように使用するかを記述するテーブルも生成します。このテーブルには、オブジェクトが格納されている場所と同様に、オブジェクトが使用されているコードの場所のアドレスが格納されます。
スタックがどのように抽象化されているかに注目してください。オブジェクト参照が格納されるもっと一般的な場所はプロセッサレジスタにあります。 GCはオブジェクトの使用状況を正しく追跡するためにどのレジスタが使用されているかを知る必要があります。 の場合、スタックフレームのオフセットはになります。
ガベージコレクタは、スタックを歩き、アクティブメソッドのスタックフレームを走査します。各メソッドに関連付けられたテーブルを使用して、オブジェクト参照を検索します。メソッドが完了したときに特別な作業をする必要がないという大きな利点により、スタックフレームは単に存在しなくなります。また、表はガベージコレクションを非常に効率的にするため、メソッドがまだ実行を終了していなくてもオブジェクトを収集できます。あなたのMain()メソッドのために多くのことを考慮すると、あなたは、そのメソッドで使用するオブジェクトがアプリケーションの存続期間にわたって漏れてしまうことは望みません。 fixed
ステートメントは非常に安くなりますが、テーブルにはオブジェクトが移動してはいけないというビットがあります。
の管理コードと非管理コードの区別があります。そのテーブルの詳細はthis answerです。
どこかに記載されていますか? –
私が知っているわけではありませんが、あなたはCLRソースコードを読まなければなりません。私はジェフリー・リヒターが自分の本に言及していると思う。 GitHubのCoreCLRは、このようなものを見る良い方法です。またはもちろん): –
@GreenTree [BOTR](https://github.com/dotnet/coreclr/blob/master/Documentation/botr/README.md)のほんの少し、[正確には] (https://github.com/dotnet/coreclr/blob/master/Documentation/botr/ryujit-overview.md#gc-info)。 [GCの章](https://github.com/dotnet/coreclr/blob/master/Documentation/botr/garbage-collection.md)にも興味があります。 –
この記事を参照してください。 http://www.c-sharpcorner.com/uploadfile/riteshratna/garbage-collection-memory-management-in-net/
アプリケーションルートによるマネージヒープのセクションを参照してください。ガベージコレクタは、どのオブジェクトを収集できるかを判断するために、このルートリストを利用できます。
あなたの質問に既に載っているコンテンツをサポートするリンク以外の外部サイトにリンクしないでください。外部リンクが消えて答えが無効になることがあります。 – Enigmativity
.NET GCは、マークアンドスイープコレクタです。オブジェクトがマークフェーズで見つからない場合、それは掃引されます:) 'obj'は、最初にルートセットの一部ではなく、スタッククロールフェーズから参照されました。あなたの質問が非常に広いので、おそらくあなたが理解していないものを正確に説明しようとしているので、詳細に入ることはできません。 –
@ LucasTrzesniewski、関数がスレッドで呼び出されるとき、コールスタックで作成された参照についてガベージコレクタに気付かなければなりません。関数が終了すると、ガベージコレクタはその参照をもうチェックしてはいけません。もしそうなら、実際にどのように実装されていますか? –