需要帮助减少我的VB.NET应用程序的Commit大小

时间:2009-10-15 15:51:15

标签: vb.net memory-management garbage-collection commit

我开发了一个应用程序,它可以查询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

几秒后,Memory Management类将内存使用量减少到:

工作集(记忆) - 700K
记忆(私人工作集) - 600K
提交规模 - 25,000K

我注意到的一件事是提交大小永远不会下降,事实上将在几天内继续增长(非常缓慢)。两天后,它的承诺大小达到了36,000K。

现在我非常肯定我正在处理所有允许使用dispose方法并将其他对象设置为=的对象。

如果我查看任务管理器,其他应用程序的提交大小的占用空间不大。

关于如何进一步修改我的应用程序的提交大小的任何想法?

编辑:

根据下面的建议,我在下面列出了CLR Profiler的一些信息:

CSIDir.exe的摘要
分配的字节数:15,097,943
重新定位的字节:3,680,460
最终堆字节数:1,612,611
最终确定的对象:16,194
关键对象最终确定:148
Gen 0 collection:19
Gen 1系列:17
Gen 2系列:16
诱导收藏:16
Gen 0堆字节:769,019
Gen 1 Heap字节:156,141
Gen 2 Heap字节:947,492
大对象堆字节:40,706
创建的句柄:4,664
被摧毁的手柄:4,386
处理幸存者:278
堆转储:1
评论:0

1 个答案:

答案 0 :(得分:1)

我建议您使用分析器工具来查看实际分配和销毁对象的方式。一个这样的VB.net分析器是来自MS的CLR profiler。 分析器的描述说:

  

CLR Profiler包括许多   非常有用的分配观点   配置文件,包括直方图   分配的类型,分配和呼叫   图表,显示GC的时间线   各代人和由此产生的   之后托管堆的状态   集合和显示的调用树   每个方法的分配和组装   负荷。