こんにちは。
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
です。
よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/06 07:34