1

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

4

1 に答える 1

1

プロファイラー ツールを使用して、オブジェクトが実際にどのように割り当てられ、破棄されるかを確認することをお勧めします。VB.net 用のそのようなプロファイラーの 1 つは、MSのCLR プロファイラーです。プロファイラーの説明には次のように書かれています。

CLR プロファイラーには、割り当てられた型のヒストグラム、割り当てと呼び出しのグラフ、さまざまな世代の GC を示すタイム ライン、およびそれらのコレクション後のマネージド ヒープの結果の状態を含む、割り当てプロファイルの非常に便利なビューが多数含まれています。メソッドごとの割り当てとアセンブリの読み込みを示すツリー。

于 2009-10-15T16:10:09.367 に答える