this is clr
DESCRIPTION
This is CLR. GC. GC の動作は単純明快!. ルート(オブジェクトを参照している変数)の存在しないオブジェクトを回収し、メモリを解放する。 それだけを知っていればよい。. GC は全く透過的だ!. GC の動作の詳細を知らなくても殆どにおいて問題ない。 GC はプログラム、或いはプログラマからは全く透過的だ。. だが、知識は役に立つ. パフォーマンス アンマネージリソースの確実な解放 アンマネージコードとの連携 ルートがないように見えるオブジェクトの維持 etc… 知識はトラブルシュートの役立つ. パフォーマンス. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/1.jpg)
![Page 2: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/2.jpg)
![Page 3: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/3.jpg)
ルート(オブジェクトを参照している変数)の存在しないオブジェクトを回収し、メモリを解放する。
それだけを知っていればよい。
![Page 4: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/4.jpg)
GCの動作の詳細を知らなくても殆どにおいて問題ない。 GCはプログラム、或いはプログラマからは全く透過的だ。
![Page 5: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/5.jpg)
パフォーマンス アンマネージリソースの確実な解放 アンマネージコードとの連携 ルートがないように見えるオブジェクトの維持 etc…
知識はトラブルシュートの役立つ
![Page 6: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/6.jpg)
Finalize を実装するかしないかで、そのクラスのオブジェクトの GCパフォーマンスは大きく変わる。
Finalize を実装しているクラスのオブジェクトは一度の GCでは決して回収されない。
![Page 7: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/7.jpg)
![Page 8: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/8.jpg)
![Page 9: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/9.jpg)
![Page 10: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/10.jpg)
![Page 11: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/11.jpg)
Finalize実装オブジェクトは最低でも 3回以上(ジェネレーション昇格も発生)の GC実行後にしか回収されない。
![Page 12: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/12.jpg)
アンマネージリソースを持つクラスは、アンマネージリソースを確実に解放するためにFinalizeを実装する。
加えて、任意のタイミングで解放できるようにDisposeパターンも使用する。
![Page 13: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/13.jpg)
Finalizeを実装したからといって確実に呼ばれるとは限らない。
Finalize呼び出し時に、 FinalizeメソッドをJit compileできないぐらいメモリが逼迫していたらどうなる?
![Page 14: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/14.jpg)
インスタンス化と同時に Finalizeメソッドを JIT COMPILE してしまう。
通常の Finalize実装クラスの後にCriticalFinalizerObjectの Finalizeを呼ぶ。
![Page 15: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/15.jpg)
GCの仕事は、使われなくなったオブジェクトを解放するだけではないという事も覚えておこう。
穴空きになったMange heapをコンパクションし、使用中のメモリを一ヶ所に集める。
![Page 16: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/16.jpg)
マネージコード内のオブジェクトのアドレスは不定
GCを備えていない実装系ではオブジェクトのアドレスが動くという想定はしていない。
![Page 17: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/17.jpg)
マネージコートとアンマネージコードを連携するにはアドレスを固定、或いは代替アドレスを使用する必要がある。
![Page 18: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/18.jpg)
AppDomain毎に一つ存在する GCHandle Tableを利用し、固定されたアドレスを得る。
![Page 19: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/19.jpg)
// オブジェクトを GCHandle Tableに登録する。 object objectA = new object(); GCHandle gh1 = GCHandle.Alloc(o,
GCHandleType.Normal); IntPtr p = (IntPtr)gh1 // p をアンマネージコードに渡す。 // p のアドレスは決して動かない。 ・・・ // アンマネージコードから p がコールバックされる。 GCHandle g = (GCHandle)p; object o2 = g.Target;
![Page 20: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/20.jpg)
![Page 21: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/21.jpg)
// オブジェクトを GCHandle Tableに登録する。 object objectA = new object(); GCHandle gh1 = GCHandle.Alloc(o,
GCHandleType.Pinned); // objectAのアドレスををアンマネージコードに渡す。 // objectA のアドレスは決して動かない。 ・・・ // アンマネージコードから objectAを直接触る。
![Page 22: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/22.jpg)
![Page 23: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/23.jpg)
void Func() { Form1 f = new Form1(); f.Show(); }
GCHandleのインスタンスを内部に持ち、自身を Targetとしている。
![Page 24: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/24.jpg)
![Page 25: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/25.jpg)
AppDomainなど知らなくても問題ない。殆どのアプリケーションはたった一つのAppDomainで動作する(ように見える)。
![Page 26: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/26.jpg)
![Page 27: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/27.jpg)
![Page 28: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/28.jpg)
assemblyは AppDomain単位で各々にロードされる。
Jit コンパイルされたネイティブイメージも各々の AppDomainが持つ。
![Page 29: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/29.jpg)
![Page 30: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/30.jpg)
ドメイン中立にある assemblyはプロセス内の全ての assemblyで共有する。
Jit コンパイルされたネイティブイメージも共有できる。
static データは各々の assemblyでコピーが必要。
しかし、各プロセスでそれぞれ Jit コンパイルする必要がある。
![Page 31: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/31.jpg)
![Page 32: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/32.jpg)
ngen.exeで予めネイティブイメージを作っておくと全てのプロセスでコードページを共有できる。
![Page 33: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/33.jpg)
![Page 34: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/34.jpg)
![Page 35: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/35.jpg)
.NET アプリケーションは「コンパイルタイム」の環境がそのまま「ランタイム」の環境となる。
![Page 36: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/36.jpg)
![Page 37: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/37.jpg)
side-by-sideで動作させるのは、最終手段である。基本はバージョンアップ後のライブラリで動作するのが望ましい。
![Page 38: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/38.jpg)
![Page 39: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/39.jpg)
![Page 40: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/40.jpg)
一つのプロセスには一つの CLRしかロードできない。
CLRのバージョンとmscorlibのバージョンは必ず同一でなければならない。
CLRのバージョンとmscorlib以外の .NET Framework Class Libarry のバージョンは必ずしも同一でなくてもよい。
![Page 41: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/41.jpg)
![Page 42: This is CLR](https://reader034.vdocuments.pub/reader034/viewer/2022051401/56813716550346895d9ea1c8/html5/thumbnails/42.jpg)