読者です 読者をやめる 読者になる 読者になる

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

.netのメモリモデルにについて

Code Projectの以下の記事がかなりわかりやすかったのでメモ。

StackとHeap

.NETの世界には2種類のメモリコンテナがあります。一つがStackで一つがHeapです。

Stack領域につまれるものは、まずは組み込み型の値です。doubleでもintでもなんでもよいですが、まぁそういったものですね。
例えば、以下のコードの後には

{
    int i = 2;
    double d = 10.0;
}

こんな感じのスタックがつまれているはずです。

f:id:posaunehm:20120308013505p:image

そしてHeap領域には参照型のオブジェクト(つまりクラス)の実態がつまれます。スタックにはそこへの参照がつまれています。
つまり、こんなコードだと

{
   int i = 2;
   double d = 10.0;
   Class c = new Class();
}

こんな感じになっています。

f:id:posaunehm:20120308013504p:image

クラスに関してはあくまで参照(ポインタ)を持つのみなので、例えばこう書くと・・・

{
   int i = 2;
   double d = 10.0;
   Class c = new Class();
   int ii = i;
   double dd = d;
   Class cc =c;
}

こんな感じになります。

f:id:posaunehm:20120308013503p:image


んで、スコープ外に出るとスタックから外されていくわけですね。あー、だからFIFOのスタックでいいのか。そしてこのStackからHeap領域に伸びる線がなくなったObjectはガベージコレクタによって回収されるわけですね。

あー、だから参照の解消忘れのメモリリークというのは、この線が何時まで経っても残っちゃっているってことなんですね。

ボクシング、アンボクシング

そして、ボクシングとは本来Stack領域につまれるものがHeap領域に定義されちゃうことを指すわけです。アンボクシングは、それがもう一度スタック領域に戻ってくることを指すと。
例えば以下のコードだと、

   int a = 2;
   object b = 3;
   int c = (int)b;
}

まずObject型としてbの実体はHeap領域に作られますが、それがint型にキャストされた瞬間に、アンボクシングによりスタック領域に移ってきます。

f:id:posaunehm:20120308013501p:image