1 / 42

This is CLR

This is CLR. GC. GC の動作は単純明快!. ルート(オブジェクトを参照している変数)の存在しないオブジェクトを回収し、メモリを解放する。 それだけを知っていればよい。. GC は全く透過的だ!. GC の動作の詳細を知らなくても殆どにおいて問題ない。 GC はプログラム、或いはプログラマからは全く透過的だ。. だが、知識は役に立つ. パフォーマンス アンマネージリソースの確実な解放 アンマネージコードとの連携 ルートがないように見えるオブジェクトの維持 etc… 知識はトラブルシュートの役立つ. パフォーマンス.

Télécharger la présentation

This is CLR

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. This is CLR

  2. GC

  3. GCの動作は単純明快! • ルート(オブジェクトを参照している変数)の存在しないオブジェクトを回収し、メモリを解放する。 • それだけを知っていればよい。

  4. GCは全く透過的だ! • GCの動作の詳細を知らなくても殆どにおいて問題ない。GCはプログラム、或いはプログラマからは全く透過的だ。

  5. だが、知識は役に立つ • パフォーマンス • アンマネージリソースの確実な解放 • アンマネージコードとの連携 • ルートがないように見えるオブジェクトの維持 • etc… • 知識はトラブルシュートの役立つ

  6. パフォーマンス • Finalize を実装するかしないかで、そのクラスのオブジェクトのGCパフォーマンスは大きく変わる。 • Finalize を実装しているクラスのオブジェクトは一度のGCでは決して回収されない。

  7. パフォーマンスが悪い! • Finalize実装オブジェクトは最低でも3回以上(ジェネレーション昇格も発生)のGC実行後にしか回収されない。

  8. アンマネージリソースの確実な解放 • アンマネージリソースを持つクラスは、アンマネージリソースを確実に解放するためにFinalizeを実装する。 • 加えて、任意のタイミングで解放できるようにDisposeパターンも使用する。

  9. Finalizeを実装したら確実か? • Finalizeを実装したからといって確実に呼ばれるとは限らない。 • Finalize呼び出し時に、FinalizeメソッドをJit compileできないぐらいメモリが逼迫していたらどうなる?

  10. CriticalFinalizerObject • インスタンス化と同時にFinalizeメソッドを JIT COMPILE してしまう。 • 通常のFinalize実装クラスの後にCriticalFinalizerObjectのFinalizeを呼ぶ。

  11. アンマネージコードとの連携 • GCの仕事は、使われなくなったオブジェクトを解放するだけではないという事も覚えておこう。 • 穴空きになったMange heapをコンパクションし、使用中のメモリを一ヶ所に集める。

  12. オブジェクトは動く • マネージコード内のオブジェクトのアドレスは不定 • GCを備えていない実装系ではオブジェクトのアドレスが動くという想定はしていない。

  13. オブジェクトを固定する • マネージコートとアンマネージコードを連携するにはアドレスを固定、或いは代替アドレスを使用する必要がある。

  14. GCHandle • AppDomain毎に一つ存在するGCHandle Tableを利用し、固定されたアドレスを得る。

  15. GCHandleType.Normal • // オブジェクトを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;

  16. GCHandleType.Normal

  17. GCHandleType.Pinned • // オブジェクトをGCHandle Tableに登録する。 • object objectA = new object(); • GCHandle gh1 = GCHandle.Alloc(o, GCHandleType.Pinned); • // objectAのアドレスををアンマネージコードに渡す。 • // objectA のアドレスは決して動かない。 • ・・・ • // アンマネージコードからobjectAを直接触る。

  18. GCHandleType.Pinned

  19. 何故Formが消えない? • void Func() { • Form1 f = new Form1(); • f.Show(); • } • GCHandleのインスタンスを内部に持ち、自身をTargetとしている。

  20. AppDomainとassembly

  21. 殆どのプロセスはシングルAppDomain • AppDomainなど知らなくても問題ない。殆どのアプリケーションはたった一つのAppDomainで動作する(ように見える)。

  22. Single AppDomain

  23. Multi AppDomain

  24. Multi AppDomain • assemblyはAppDomain単位で各々にロードされる。 • Jit コンパイルされたネイティブイメージも各々のAppDomainが持つ。

  25. Domain Neutral

  26. Domain Neutral • ドメイン中立にあるassemblyはプロセス内の全てのassemblyで共有する。 • Jit コンパイルされたネイティブイメージも共有できる。 • static データは各々のassemblyでコピーが必要。 • しかし、各プロセスでそれぞれJit コンパイルする必要がある。

  27. Ngen状態

  28. Ngen 状態 • ngen.exeで予めネイティブイメージを作っておくと全てのプロセスでコードページを共有できる。

  29. side-by-side

  30. side-by-side

  31. side-by-side • .NET アプリケーションは「コンパイルタイム」の環境がそのまま「ランタイム」の環境となる。

  32. バージョンリダイレクト

  33. バージョンリダイレクト • side-by-sideで動作させるのは、最終手段である。基本はバージョンアップ後のライブラリで動作するのが望ましい。

  34. .NET Framework Unification

  35. .NET Framework Unification

  36. .NET Framework Unification • 一つのプロセスには一つのCLRしかロードできない。 • CLRのバージョンとmscorlibのバージョンは必ず同一でなければならない。 • CLRのバージョンとmscorlib以外の.NET Framework Class Libarry のバージョンは必ずしも同一でなくてもよい。

  37. .NET Framework UnificationDEMO

  38. ご静聴ありがとうございました。

More Related