2009-10-15 38 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