2009-10-15 4 views
0

J'ai une application que j'ai développée qui interroge les informations Active Directory et stocke environ 15 propriétés dans un Datatable qui est conservé en mémoire.Besoin d'aide pour réduire la taille Commit de mon application VB.NET

Je dois diminuer la quantité de mémoire "Commit" mise de côté.

L'application reste active dans la zone de notification et permet une recherche rapide d'informations ainsi que des images pour les utilisateurs.

J'ai une classe qui permet de réduire l'utilisation de la mémoire. Il fonctionne sur une minuterie toutes les 10 secondes et ci-dessous:

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 

Après l'application charge le Gestionnaire des tâches affiche les informations suivantes:

Set de travail (mémoire) - 30,000K
mémoire (Set de travail privé) - 13,000K
Commit Taille - 25,000K

et après quelques secondes la classe de gestion de la mémoire réduira l'utilisation de la mémoire:

Wor roi Set (mémoire) - 700K
mémoire (Set de travail privé) - 600K
Commit Taille - 25,000K

Une chose que j'ai remarqué est que le ne va jamais engager Taille vers le bas et en fait va continuer à croître (très lentement) sur quelques jours. Après deux jours, il s'est élevé à 36 000K pour la taille Commit.

Maintenant, je suis assez positif, je dispose de tous les objets qui permettent à une méthode de disposer et de mettre d'autres objets à = rien.

Si je regarde le Gestionnaire des tâches, les autres applications n'ont pas un encombrement aussi important pour la taille de validation.

Des idées sur la façon de réduire davantage la taille de validation que ma demande met de côté?

Edit:

par la suggestion ci-dessous j'ai inclus quelques-unes des informations du CLR Profiler ci-dessous:

Résumé pour CSIDir.exe
octets Allouées: 15,097,943
octets relocalisés: 3,680,460
final Heap octets: 1,612,611
objets finalisés: 16,194
objets critiques finalisés: 148
Gen 0 collections: 19
Gen 1 collections: 17
Gen 2 collections: 16
Collections induites: 16
Gen 0 Octets de tas: 769,019
Gen 1 Octets de tas: 156 , 141
Gen 2 Heap octets: 947,492
Large Object Heap octets: 40,706
handles: 4.664
Poignées détruits: 4386
Poignées survivant: 278
Tas Décharges: 1
Commentaires: 0

+0

J'ai réussi à réduire un peu le nombre de threads et de mémoire en supprimant l'un de mes timers et en modifiant du code dans l'application. Le profileur CLR m'a beaucoup aidé à déterminer la zone où je devrais travailler sur l'élimination des informations. Je suis toujours curiuos comment faire pour que la mémoire virtuelle s'engage à réduire en taille. En utilisant le profileur CLR, il semble que l'application à max n'utilisera peut-être que 10 Mo, donc je ne sais pas vraiment pourquoi la mémoire virtuelle validée ne change jamais de 25 Mo. – JoshF

Répondre

1

Je vous suggère d'utiliser des outils de profilage pour voir comment vos objets sont réellement alloués et détruits. Un tel profiler pour VB.net est CLR profiler de MS. La description du profileur dit:

Le profileur CLR comprend un certain nombre de très vues utiles du profil allocation , y compris un histogramme de types attribués, allocation et appel graphiques, une ligne de temps montrant GCS de différentes générations et l'état résultant du tas géré après ces collections , et un arbre d'appel montrant allocations par méthode et l'ensemble charges.

+0

J'ai mis à jour mon message original avec des informations du profileur CLR. Il fournit une quantité importante de données et je ne suis pas assez familier avec l'application pour bien l'interpréter. – JoshF

Questions connexes