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