La collecte des ordures (Garbage Collection, GC) dans Visual Basic .NET est un processus automatique de gestion de la mémoire qui libère les objets non utilisés, empêchant ainsi les fuites de mémoire. Lors de la création d'objets, de la mémoire est allouée sur le tas géré, et lorsque l'objet n'a plus de références, le ramasse-miettes libère les ressources occupées au fil du temps.
Caractéristiques :
Finalize pour nettoyer les ressources non gérées, mais il est plus sûr d'utiliser l'interface IDisposable et la méthode Dispose.Using pour appeler automatiquement la méthode Dispose.Exemple de code utilisant Dispose :
Public Class FileManager Implements IDisposable Private disposed As Boolean = False ' ... ressource non gérée Public Sub Dispose() Implements IDisposable.Dispose If Not disposed Then ' Nettoyage des ressources disposed = True End If GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose() MyBase.Finalize() End Sub End Class
Peut-on être sûr que le finaliseur d'un objet sera appelé à la fin du programme ?
Réponse incorrecte : Oui, le finaliseur est appelé automatiquement lorsque l'objet n'est plus nécessaire.
Réponse correcte : Non, l'appel du finaliseur n'est pas garanti à la fin du processus. Les finaliseurs ne seront appelés que si le GC a le temps de les traiter. Pour un nettoyage fiable des ressources, utilisez toujours Dispose.
Exemple :
' Utilisation de la construction Using pour garantir la libération de la ressource Using mgr As New FileManager() ' Traiter la ressource End Using
Histoire
Dans un projet de traitement de fichiers, les fichiers temporaires n'étaient pas supprimés, car ils dépendaient uniquement du finaliseur. Avec un grand volume de fichiers, cela provoquait un débordement du système de fichiers, jusqu'à ce qu'un appel explicite àDisposesoit mis en œuvre.
Histoire
Un développeur appelait manuellementGC.Collect()après chaque opération — cela a considérablement ralenti les performances de l'application, car des collectes de déchets fréquentes consommaient beaucoup de CPU.
Histoire
Dans de grandes applications web, l'un des services a mal implémenté le modèle Dispose et n'a pas appeléGC.SuppressFinalize(). Cela a entraîné un nettoyage double des objets, provoquant des plantages inattendus et des fuites de ressources.