.NETメモリ管理—CLRの作業

3016 ワード

http://www.cnblogs.com/liulun/p/3145351.htmlを見ました  いいですね.関連技術を補習します.の
本文: .NET CLRによるメモリ管理
CLRがあれば、ほとんど心配する必要はありません.netプログラムのメモリ管理は、メモリの割り当てとクリーンアップの回収を担当しています.
.netは2つのタイプのデータに分けられます:値のタイプと参照のタイプ、CLRもそれぞれ2つのタイプに対してメモリの上の処理をしました
≪メモリー割当て|Memory Assignment|Eas≫-値のタイプ:
まずWindowsは仮想アドレッシングシステムを使用してメモリを管理し、「仮想アドレッシングシステムはプログラムが実際に利用可能なメモリアドレスをハードウェアメモリの実際のアドレスにマッピングし、CLRのメモリ管理の割り当て、すなわちこの仮想アドレッシングシステム上で、仮想メモリ空間と呼ばれる.
仮想メモリに値タイプのデータを格納する領域があります.スタック領域と呼ばれます.
コード:
int a=1;
if(a==1){
 int b=2;
}

CLRが上記の値タイプ変数aとbを処理する場合、メモリのスタック領域にアドレスが割り当てられ、まずメモリアドレスを記録するスタックポインタに新しい値タイプフィールドがあることを通知し、スタックポインタはそれに伴って変化し、4を減少させる.値タイプ変数には4バイトの空間が必要であるからである.もちろんbはaの後の領域では,この場合メモリを解放するとまずbを処理してaを処理し,メモリ割り当ての場合とは正反対である.a bが同時に宣言した場合、解放された順序はメモリに格納されたデータから先に削除され、直ちに後進先出される.(注:スタックポインタは常に次の空きストレージ領域を指し、プログラムが実行されると、ポインタはスタックメモリのメモリブロックの末尾を指します.スタックの充填は上から下へ、つまり上位メモリアドレスから下位メモリアドレスへ充填されます.データが増加するにつれて、スタックポインタは調整されます).
メモリ割当て-参照タイプ:
仮想メモリには、管理スタックと呼ばれる参照タイプのデータを格納する領域もあります.
管理スタックに保存されているのは、長時間使用可能なデータです.厳密には、彼の性能はスタックの高さがありません(スタックはプログラムが自動的にメモリを割り当て、スタック領域はプログラマnewが出てきて、スタックにメモリを割り当てるように伝えます).
次のコードがあります.
Student stu;
stu=new Student();

stuは参照タイプの変数であり、プログラムが第1行のコードを実行した後、CLRはまずスタックに4バイトの空間を変数stuに割り当て、第2行のコードを実行した後、CLRはスタックにメモリを割り当ててStudentオブジェクトのデータを保存する.同時にスタックに割り当てられたメモリが存在するアドレスを変数stu,すなわち参照タイプStrdentのデータをスタックに割り当て,データのアドレスをスタックに保存している.
メモリクリーンアップ-ゴミ回収
CLRがスタック上のデータがスタックに参照されなくなったことを発見すると、CLRのゴミ回収器は自動的に彼らを整理することができ、もちろん手動で整理することもでき、GC.Collect()を呼び出すことができ、一般的にビッグデータのデータ回収を処理する時だけ呼び出すことができ、すぐにメモリを解放し、前に述べたプログラムのメモリはいつも上から下へ充填されている.つまり、メモリの一部が使用されなくなったことや、メモリの使用が不連続であることは、プログラムリソースと時間の無駄になるに違いありません.ゴミ回収器は、まだ使用されているデータをスタックの先端に移動し、再び連続し、オブジェクトのアドレスを変更して、連続したメモリの空きスペースを空けます.パフォーマンスを提供します.しかし、ビッグデータを処理する際の原理はやや異なり、ビッグデータは通常のスタックに格納されるのではなく、単独でスタック上にビッグデータを格納するための領域(ビッグオブジェクトスタック>85000バイト)があり、このようなデータの移動は性能を消費し、ゴミ回収器は性能を提供するため、このようなデータを移動しないという利点がある.    
ごみ回収器は、一度回収した場合に参照されないすべてのデータを消去することを保証しないことを説明する必要があります.
   これが.netの管理リソースのメモリクリーンアップの原理であり、それ以外にも、プログラムには管理されていないリソースが存在します. ファイルハンドル、ネットワーク接続、OleDBDataReader、StreamWriter、、、、、、一部の非管理リソースは、ファイル処理やデータベース接続のClose()メソッドなどの回収方法を提供していますが、表示されていない類似の方法もあります.この場合、このメモリの一部を回収するには、クラスでSystem.IDisposableインタフェースを実現することができます(クリック:IDisposableインタフェースを正しく実装).またはusing文を使用する
 
完了---