1

我有一个我开发的应用程序,它查询 Active Directory 信息并将大约 15 个属性存储到保存在内存中的 Datatable 中。

我需要减少它留出的“提交”内存量。

该应用程序在系统托盘中保持活动状态,并允许用户快速搜索信息和图片。

我有一门课,它能够将内存使用率保持在很低的水平。它每 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

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

现在我很肯定我正在处理所有允许处理方法的对象并将其他对象设置为 = 无。

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

关于如何进一步削减我的应用程序搁置的提交大小的任何想法?

编辑:

根据下面的建议,我在下面包含了一些来自 CLR Profiler 的信息:

CSIir.exe 的摘要
分配字节:15,097,943 重
定位字节:3,680,460
最终堆字节:1,612,611
最终确定的对象:16,194 最终确定的
关键对象:148
Gen 0 集合:19
Gen 1 集合:17
Gen 2 集合:16
诱导集合:16
Gen 0 Heap 字节: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 的一个这样的分析器是来自 MS的CLR 分析器。探查器的描述说:

CLR Profiler 包括许多非常有用的分配配置文件视图,包括已分配类型的直方图、分配和调用图、显示各代 GC 的时间线以及这些收集后托管堆的结果状态,以及一个调用显示每个方法分配和程序集负载的树。

于 2009-10-15T16:10:09.367 回答