2009-10-15 55 views
0

我有一个我开发的应用程序,它查询Active Directory信息并将大约15个属性存储到保存在内存中的Datatable中。需要帮助减少我的VB.NET应用程序的提交大小

我需要减少它被搁置的“提交”内存量。

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

我有一个类,它可以保持内存使用率相当低。它运行在一个计时器每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

有一两件事我注意到的是,提交大小不降,并在事实上将继续增长(非常缓慢)几天。两天后,Commit大小就达到了36,000K。

现在我非常积极我将所有允许dispose方法的对象和设置其他对象设置为= Nothing。

如果我看一下任务管理器,其他应用程序的提交大小没有如此大的占用空间。

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

编辑:

每建议下面我提供了一些从下面CLR探查的信息的:

摘要CSIDir。exe文件
分配的字节:15097943个
搬迁字节:3680460个
最终堆字节:1612611个
对象完成:16194个
关键对象完成:148点
第0级的集合:19
创1集合:17
根2个系列:16
诱导收藏:16
Gen 0堆字节:769,019
Gen 1堆字节:156 ,141个
Gen 2的堆字节:947492个
大对象堆字节:40706个
把手创建:4664个
把手破坏:4386
把手存活:278个
堆转储:1篇
评论:0

+0

我能够通过删除我的一个定时器并更改应用程序中的某些代码来减少一些线程和内存。 CLR分析器帮助确定了我可能需要处理信息的区域。 我仍然curiuos如何让虚拟内存致力于减少大小。使用CLR事件探查器,它看起来应用程序在最大只会使用10MB,因此不太确定为什么提交的虚拟内存永远不会从25 MB变化。 – JoshF 2009-10-19 16:59:31

回答

1

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

CLR分析器包括多个 非常有用的分配 轮廓的视图,包括 分配类型,分配和呼叫 图表,时间线示出选区的直方图 各代以及由此产生的 收集后的托管堆状态,以及显示 每个方法分配和组装 集合的呼叫树。

+0

我已经使用CLR分析器的一些信息更新了我的原始文章。 它提供了大量的数据,我不太熟悉应用程序来解释它。 – JoshF 2009-10-15 18:33:33