avril
2008
Un des sujets les plus fréquents en dotnet concerne la libération de la mémoire.
Je vous propose donc un petit point :
– Les objets « full managed » sont libérés directement par le Garbage Collector. Vous n’avez donc rien à faire sur ces objets.
– Les ressources natives : Elles doivent être explicitement libéré par le développeur. C’est généralement un des sources de fuites de mémoire. l’oubli de la libération des objets natifs.
Enfin il existe une troisième catégorie, moins connue mais beaucoup plus traite : Les objets implémentant IDisposable. En effet ces classes sont partiellement libéré par le GC. Mais si cette interface existe ce n’est pas pour rien. En effet l’appel de Dispose permet de libérer les ressources non managés. Pour libérer entièrement ces objets il faut donc un appel à Dispose et un passage du GC.
Certaine personnes utilise le Finaliseur pour appeler Dispose. Cette pratique pose un problème. En effet l’utilisation du destructeur est un opération lente et couteuse en terme de mémoire pour le GC.
La méthode la plus simple et surtout la plus « rentable » est d’utiliser la directive using. Dans le code cette directive permet d’appeler explicitement la méthode Dispose() quelle que soit la raison de sortie.
Ainsi le code suivant :
{
MonObjetDisposable obj = new MonObjetDisposable();
try
{
obj.DoSomething();
}
catch(....) {}
finaly
{
obj.Dispose();
}
}
et en tout point identique à ce code :
{
using(MonObjetDisposable obj = new MonObjetDisposable())
{
obj.DoSomething();
}
}
c’est déjà plus clair
Pour conclure sur les objets IDisposable : Penser toujours à les libérer ! Au passage la grande source d’objet IDisposable reste … les contrôles winform Attention donc aux listes dynamiques de composants qui ne sont jamais libéré
1 Commentaire + Ajouter un commentaire
Archives
- juillet 2012
- mars 2012
- février 2012
- novembre 2011
- octobre 2011
- mars 2011
- novembre 2010
- octobre 2010
- septembre 2010
- août 2010
- avril 2010
- février 2010
- janvier 2010
- novembre 2009
- octobre 2009
- septembre 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juin 2008
- mai 2008
- avril 2008
- février 2008
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
On retrouve exactement le même type de problème en Java. Un grand nombre de personne « oublie » de libérer les ressources natives (fichiers, sockets, …).
La seule différence étant que nous n’avons pas encore d’équivalent à la directive using et qu’on est obligé d’utiliser le finally
a++