2015年07月01日

WeakReference 弱い参照

WeakReference 弱い参照

メモリ管理は.NET Frameworkお任せであり、使い終わったらガベージコレクタが自動で回収してくれる。
インスタンスが使用中か否かは、そのインスタンスへの参照の有無による。これを強い参照という。
一方、弱い参照とは参照があってもインスタンスがガベージされるうるものをいいます。
インスタンスを生成してからそれを使うまでの間にガベージコレクタが実行されていなければ使えるし、実行されていればNullが返却される。

誤使用例
public class Data
{
    public List<int> List { get; set; }
    public Data(int length)
    {
        List = new List();
        for (int n = 0; n < length; n++) List.Add(n);
    }
}
class Tester
{  
    static void Main(string[] args)
    {
            // 非ジェネリックの弱い参照
            WeakReference wr = new WeakReference(new Data(5));
            // 参照先のインスタンスがガベージされてないかの確認
            if (wr.IsAlive)
            {
                int count2 = ((Data)wr.Target).List.Count;
            }
    }
}
ガベージコレクタの実行契機は.NETお任せです。つまり、上記コードでIsAliveで確認後でwr.Target前にGCが実行される可能性があります。その場合このコードはNullReferenceExceptionがスローされることになります。
これを回避するためには、以下のようにする必要があります。
    var temp = wr.Target;
    if(temp != null)
    {
        int count2 = ((Data)temp).List.Count;
    }

.NET4.5から、WeakReferenceにジェネリクスが追加になりました。
上記のような誤用を避けるためでしょうか、IsAliveプロパティは無くなり、値の取得方法も変わりました。
            List<WeakReference<Entity>> list = new List<WeakReference<Entity>>();

            for (int n = 0; n < 100; n++)
            {
                list.Add(new WeakReference<Entity>(new Entity { ID = n }));
            }

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            Entity entity = null;

             list.ForEach(ent =>
            {
                if (ent.TryGetTarget(out entity))
                {
                    var test = entity;
                }
             });


このWeakReferenceの使いどころとして最初に思いつくのが簡易なキャッシュ機能でしょう。
MSDNのサンプルもキャッシュの実装例を取り上げています。
が、これが使えたもんじゃない。寿命が短すぎるから。
ガベージ(ジェネレーション0のガベージ)が実行されると回収されてしまうのですが、この実行契機は予想外に多い。
メモリが枯渇してきているかに関わらず常に実行され続ける感じです。
パフォーマンスモニタにより、ガベージの実行を実際に観測することができます。
Perfmon.png
図が小さくてちょっと見ずらいですが、画面の中央上部に緑色の十字のアイコンボタンがあります。
これを押下するとモニターする対象を選択できます。
Perfmon2.png
計測したいプロセスを起動させておいて、左上のリストボックスで「.NET CLR Memory」から「#Gen 0 Collections」を選択。
左下のリストボックスで計測対象のプロセス名を選択し、左最下部の「追加」ボタンを押下すれば該当プロセスにおけるGCの実行回数が目視できます。

posted by RR at 00:41 | Comment(0) | 文法 | このブログの読者になる | 更新情報をチェックする

2015年07月14日

Reference Source BCL(Basic Class Library)のソースコード参照

BCL(Basic Class Library)(基本クラスライブラリ)のソースコードが以下で公開されてました。

http://referencesource.microsoft.com/

こんな感じのページです。
ReferenceSource.png

コード内では定義へリンクになっているのでサクサクと閲覧できます。

VisualStudioよりよっぽど爽快な操作性です。

MSDNのサンプルコードとは違った意味でとても参考になります。

posted by RR at 22:14 | Comment(0) | 規約・参考サイト | このブログの読者になる | 更新情報をチェックする

2015年07月25日

「Visual Studio 2015 Community」と「日本語言語パック」のインストールと適用方法詳細

Visual Studio 2015とインストール手順

インストーラーのダウンロード

ダウンロードサイトはこちら
https://www.visualstudio.com/downloads/download-visual-studio-vs

以下のようなページです。
visualStudio2015.png
左側の紫色の中央部にある「Communityを無料ダウンロード」というリンクボタンを押下すると、vs_community.exeという3MB弱の実行ファイルがダウンロードされます。

Visual Studio 2015 Communityのインストール

この実行ファイルを起動するとインストーラが起動して以下のような画面が表示されます。

installer2015.png

インストール先フォルダを選択して(デフォルト設定でOK)、インストール方法を選択し(カスタムでなければそのままでOK)右下の「Install」ボタンを押下するとインストールが始まります。
※旧版のVisualStudioと同居可能ですが、インストール中は実行できませんでした。


インストール中はこんな画面です。マシンスペックと通信速度に寄ります。試行した端末では一時間ちょっとかかりました。

installer2015_2.png

インストール完了したらCompletedと表示が変りますのでインストール終了です。
OSの再起動がかかります。


VisualStudio 2015 Communityを実行

早速VisualStuido2015Communityを起動するとこんな画面が表示されました。

installer2015_3.png
「Sign In」ボタンを押下するとMSアカウントとパスワードの入力が求められましたので、とりあえず入力すると、こんどは以下の画面

installer2015_4.png
よくわからんので「続行」ボタンの横にある「後で行う」を押下するとやっとVisualStudioが起動しました。

日本語用言語パックのダウンロードとインストール

メニュー等は全部英語でしたので、これを日本語化します。LangagePackが必要なので入手します。下図のように先ほどのダウンロードページから取得します。

installer2015_5.png
紫色のCommunity版の下にメニューがあって、メニュー最上部のVisualStudio2015を選ぶとメニューが展開します。そうすると中央下部の表示が変って、日本語パックのダウンロードリンクが出てきます。
一番下のVisual Studio 2015 Language Packというところです。
日本語を選択し、ダウンロードボタンを押下すると、vs_langpack.exeというインストーラが落ちてきますので、実行します。以下のような画面が表示されます。
installer2015_6.png
右下のインストールボタンを押下でインストールされます。直ぐに終わります。

日本語用言語パックの適用
VisualStudioを起動しても英語のままです。Menu⇒Tool⇒Optionで下のような設定画面が表示されます。
installer2015_7.png
ここでEnvironmentからInternational Settingsより言語を選択し再起動すると日本語で表示されます。

posted by RR at 13:33 | Comment(0) | 開発環境 | このブログの読者になる | 更新情報をチェックする