質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.52%

C#使用しているメモリサイズを把握したいです。

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 5,968

cancat

score 247

こんにちは。 
Windows10でC#のアプリケーションを開発しています。 
Visual Studio 2015 Communityを使っています。 

前提・実現したいこと

OutofMemoryを把握するため、使用しているメモリサイズを把握したいです。

試したこと

まず空っぽのWPFプロジェクトをつくり、ボタンでフォルダのimageを読み込むようにしました。
タスクマネージャーを起動しながら、自アプリを起動し、画像ファイルを読み込んでメモリの追加状況を確認しました。
画像ファイルはStackPanelに読み、スクロールしてメモリの状況を見ています。

発生している問題

それぞれの単位を統一できずにいます。

Visual StudioでDebugしてみると、
(1)タスクマネージャーで表示しているメモリ(約300枚,合計120MB)は1,000MBくらいになります。
Miscrosoft Visual Studio 2015+vshost32.exeの合計です。

(2)GC.GetTotalMemory(false)で取得したメモリは、仮に(/100/1000)で割ると120-140MBくらいです。
(3)Process.WorkingSet64で取得したメモリは、仮に(/1000/1000)で割ると1000MBくらいです。
(4)Process.VirtualMemorySize64で取得したメモリは、仮に(/1000/1000)で割ると1900MBくらいです。
コンパイルしてexeにすると、
(5)タスクマネージャーで表示しているメモリ(約300枚,合計120MB)は1,080MBくらいになります。
(6)GC.GetTotalMemory(false)で取得したメモリは、仮に(/100/1000)で割ると120-140MBくらいです。
(7)Process.WorkingSet64で取得したメモリは、仮に(/1000/1000)で割ると1178MBくらいです。
(8)Process.VirtualMemorySize64で取得したメモリは、仮に(/1000/1000)で割ると2265MBくらいです。

(1)と(3)はほぼ同じなのですが、5分ほどこの質問を書きながら放置していたら、
Miscrosoft Visual Studio 2015 82.2-90.5MB
vshost32.exe 73.3MB
に劇的に減りました。
(2),(3),(4)は変化なし。どれとも値がかけ離れています。
exeの場合も、放置すると2.7MBに劇的に減りました。

Q1,まずは単位があっているかどうか。
Q2, taskmanager、GC.GetTotalMemory、WorkingSet64、VirtualMemorySize64のどれを見ればよいか。

該当のソースコード

private string checkmemory(string method) {
            long memory = GC.GetTotalMemory(false);
            string log = method + "\t" + (memory / 100).ToString("#,###") + "KB " +
                                                            (memory / 100 / 1000).ToString("#,###") + "MB\r\n";

            //プロセスを取得
            Process currentProcess = Process.GetCurrentProcess();

            // リフレッシュしてプロセスの各種情報を最新情報に更新する
            currentProcess.Refresh();

            // 各種プロセス情報を出力する
            log += "プロセスID:" + currentProcess.Id + "\r\n" +
                                    "プロセス名:" + currentProcess.ProcessName + "\r\n" +
                                    "基本優先度:" + currentProcess.BasePriority + "\r\n" +
                                    "物理メモリ使用量:" +
                                    (currentProcess.WorkingSet64 / 1000).ToString("#,###") + "KB " +
                                    (currentProcess.WorkingSet64 / 1000 / 1000).ToString("#,###") + "MB\r\n" +
                                    "仮想メモリ使用量:" +
                                    (currentProcess.VirtualMemorySize64 / 1000).ToString("#,###") + "KB " +
                                    (currentProcess.VirtualMemorySize64 / 1000 / 1000).ToString("#,###") + "MB\r\n";

            Result.Text = log + "\r\n" + Result.Text;

            return method + "\t"+(memory / 100 / 1000).ToString("#,###") + "MB";
        }

イメージはボタンで次のように読み、StackPanelにChildren.Addしています。

public static BitmapImage readImageFile(string fileName) {
            BitmapImage bitmapimage = new BitmapImage();
            bitmapimage.BeginInit();
            try {
                bitmapimage.StreamSource = new FileStream(fileName, FileMode.Open);
            }
            catch (Exception exception) {
                string error = fileName + exception.Message;
            }
            finally {
                bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapimage.EndInit();
                bitmapimage.StreamSource.Close();
                bitmapimage.StreamSource.Dispose();
            }
            return bitmapimage;
        }

補足情報(言語/FW/ツール等のバージョンなど)

Microsoft Visual Studio Community 2015 
Version 14.0.25424.00 Update 3 
Microsoft .NET Framework 
Version 4.6.01038 

インストールしているバージョン:Community 

Visual C# 2015   00322-20000-00000-AA575 
Microsoft Visual C# 2015 

です。 
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

OutOfMemoryを事前に検知(あるサイズを確保したらOOM発生を判定)するのが目的で、
メモリ使用量を見るのはただ単に手段であるなら、
別の手段としてMemoryFailPointなんてものがあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/06 16:34

    ありがとうございます。
    おっしゃるとおり、メモリ使用量を見るのは単なる手段なので、さっそくMemoryFairPointしてみました。
    とはいえ、それだけでは足りず。
    まずは状況を正確に把握したいです。

    キャンセル

0

タスクマネージャの値とProcess.WorkingSet64の値が変わってしまう(WorkingSet64が変わらない)のが腑に落ちませんが、タスクマネージャの値はワーキングセットサイズなので、アイドル状態で減少するのは普通の挙動のように見えます。

OutofMemoryの発生の検出は、検出しても大抵何もできないため非常に難しいと思います。プログラマブルに計測することが目的ではないのなら、Process Explorerを使って監視するのが一番良いと思います。プログラマブルに計測する場合、OOMの状態が起きてから具体的に何をするのかによって違ってくると思います(が、何か確実なトラブルシューティングを自動化することが目的なら、やはり難しいのではないかと思います。アドバイスとしては、少なくとも別のプロセスから監視した方がいいでしょう)。

Process Explorerでの監視を行うのであれば、参考にどうぞ: メモリを使用する、とは

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる