Active Directory情報を照会し、メモリに保持されているデータテーブルに約15個のプロパティを格納するアプリケーションを開発しました。
取っておいた「コミット」メモリの量を減らす必要があります。
アプリケーションはシステムトレイでアクティブなままであり、ユーザーの写真とともに情報をすばやく検索できます。
私は、メモリ使用量をかなり低く抑えることができるクラスを持っています。10秒ごとにタイマーで実行され、以下にリストされています。
Public Class MemoryManagement
Private Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal process As IntPtr, ByVal minimumWorkingSetSize As Integer, ByVal maximumWorkingSetSize As Integer) As Integer
Public Shared Sub FlushMemory()
GC.Collect()
GC.WaitForPendingFinalizers()
If (Environment.OSVersion.Platform = PlatformID.Win32NT) Then
SetProcessWorkingSetSize(GetCurrentProcess().Handle, -1, -1)
End If
End Sub
End Class
アプリケーションがロードされると、タスクマネージャーは次のように表示されます。
ワーキングセット(メモリ)-30,000K
メモリ(プライベートワーキングセット)-13,000K
コミットサイズ-25,000K
数秒後、メモリ管理クラスはメモリ使用量を次のように減らします。
ワーキングセット(メモリ) -700K
メモリ(プライベートワーキングセット)
-600Kコミットサイズ-25,000K
私が気づいたことの1つは、コミットサイズが決して下がらず、実際には数日にわたって(非常にゆっくりと)成長し続けるということです。2日後、コミットサイズで最大36,000Kになりました。
これで、disposeメソッドを許可するすべてのオブジェクトを破棄し、他のオブジェクトを=nothingに設定することにかなり前向きになりました。
タスクマネージャーを見ると、他のアプリケーションにはコミットサイズのフットプリントがそれほど大きくありません。
アプリケーションが取っておいたコミットサイズをさらに調整する方法について何かアイデアはありますか?
編集:
以下の提案に従って、CLRプロファイラーからの情報の一部を以下に含めました。
CSIDir.exeの概要
割り当てられたバイト:15,097,943再配置された
バイト:3,680,460
最終ヒープバイト: 1,612,611最終化され
たオブジェクト:16,194最終化
された重要なオブジェクト:148
Gen 0コレクション:19
Gen 1コレクション:17
Gen 2コレクション:16
誘導コレクション: 16Gen0
ヒープバイト:769,019
Gen 1ヒープバイト:156,141
Gen 2ヒープバイト:947,492
ラージオブジェクトヒープバイト:40,706
作成されたハンドル:4,664
破壊されたハンドル:4,386
存続しているハンドル:278
ヒープダンプ:1
コメント:0