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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

2回答

11234閲覧

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

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2016/12/06 06:08

こんにちは。
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のどれを見ればよいか。

###該当のソースコード

C#

1 private string checkmemory(string method) { 2 long memory = GC.GetTotalMemory(false); 3 string log = method + "\t" + (memory / 100).ToString("#,###") + "KB " + 4 (memory / 100 / 1000).ToString("#,###") + "MB\r\n"; 5 6 //プロセスを取得 7 Process currentProcess = Process.GetCurrentProcess(); 8 9 // リフレッシュしてプロセスの各種情報を最新情報に更新する 10 currentProcess.Refresh(); 11 12 // 各種プロセス情報を出力する 13 log += "プロセスID:" + currentProcess.Id + "\r\n" + 14 "プロセス名:" + currentProcess.ProcessName + "\r\n" + 15 "基本優先度:" + currentProcess.BasePriority + "\r\n" + 16 "物理メモリ使用量:" + 17 (currentProcess.WorkingSet64 / 1000).ToString("#,###") + "KB " + 18 (currentProcess.WorkingSet64 / 1000 / 1000).ToString("#,###") + "MB\r\n" + 19 "仮想メモリ使用量:" + 20 (currentProcess.VirtualMemorySize64 / 1000).ToString("#,###") + "KB " + 21 (currentProcess.VirtualMemorySize64 / 1000 / 1000).ToString("#,###") + "MB\r\n"; 22 23 Result.Text = log + "\r\n" + Result.Text; 24 25 return method + "\t"+(memory / 100 / 1000).ToString("#,###") + "MB"; 26 }

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

C#

1 public static BitmapImage readImageFile(string fileName) { 2 BitmapImage bitmapimage = new BitmapImage(); 3 bitmapimage.BeginInit(); 4 try { 5 bitmapimage.StreamSource = new FileStream(fileName, FileMode.Open); 6 } 7 catch (Exception exception) { 8 string error = fileName + exception.Message; 9 } 10 finally { 11 bitmapimage.CacheOption = BitmapCacheOption.OnLoad; 12 bitmapimage.EndInit(); 13 bitmapimage.StreamSource.Close(); 14 bitmapimage.StreamSource.Dispose(); 15 } 16 return bitmapimage; 17 }

###補足情報(言語/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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

投稿2016/12/06 06:24

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2016/12/06 07:34

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

0

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

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

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

投稿2016/12/08 04:04

kekyo

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問