ProgrammationDéveloppeur VB.NET

Qu'est-ce que la collecte des ordures (Garbage Collection) dans Visual Basic .NET, comment fonctionne la finalisation des objets, et sur quoi est-il important de faire attention lors de la gestion de la mémoire ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 :

  • Appeler le GC manuellement est généralement déconseillé, il vaut mieux faire confiance à l'environnement .NET.
  • Les classes peuvent implémenter la méthode 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.
  • Utilisez la construction Using pour appeler automatiquement la méthode Dispose.
  • Les finaliseurs ne s'exécutent pas immédiatement après la perte de référence, mais lorsque le GC le juge nécessaire.

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

Question piège

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

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


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 à Dispose soit mis en œuvre.


Histoire
Un développeur appelait manuellement GC.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.