Configuration du gestionnaire de mémoire

De RAD Studio
Aller à : navigation, rechercher

Remonter à Gérer la mémoire - Index


Cette section décrit comment configurer le gestionnaire de mémoire sur Windows 32 bits et Windows 64 bits. Le gestionnaire de mémoire Posix/32 ne prend pas en charge cette fonctionnalité.

Remarque : Vous pouvez modifier certains paramètres de configuration du gestionnaire de mémoire lors de son utilisation. Tous les paramètres de configuration sont des paramètres globaux et ils affectent tous les threads utilisant le gestionnaire de mémoire. Sauf indication contraire, toutes les fonctions et procédures sont adaptées aux threads. Ces options de configuration ne s'appliquent qu'au gestionnaire de mémoire local. La définition de ces options dans une bibliothèque, quand la bibliothèque partage le gestionnaire de mémoire de l'application principale, n'aura aucun effet.

Pour définir l'alignement de bloc minimum du gestionnaire de mémoire

  1. Utilisez la fonction GetMinimumBlockAlignment pour récupérer l'alignement de bloc minimal en cours.
  2. Sélectionnez l'alignement de bloc de mémoire approprié à votre application. Les alignements de blocs disponibles sont 8 octets (System.mba8Byte) et 16 octets (System.mba16Byte).
  3. Pour changer l'alignement de bloc de mémoire, utilisez la procédure SetMinimumBlockAlignment.

Remarque : L'alignement de la mémoire allouée à travers le gestionnaire de mémoire est garantie sur au moins des frontières de 8 octets. L'alignement 16 octets est utile quand des blocs de mémoire sont manipulés avec des instructions SSE, mais il peut augmenter l'utilisation de la mémoire.

Pour signaler les pertes de mémoire à l'arrêt

  1. Définissez la variable globale System.ReportMemoryLeaksOnShutdown sur True.
  2. Quand le gestionnaire de mémoire s'arrête, il analyse le pool mémoire et signale toutes les pertes de mémoire non enregistrées dans un dialogue de message. Pour enregistrer et désenregistrer les pertes de mémoire prévues, utilisez les procédures RegisterExpectedMemoryLeak et UnregisterExpectedMemoryLeak.

Remarque :Le gestionnaire de mémoire peut signaler la mémoire ayant été allouée mais non libérée lors de son arrêt. De tels blocs de mémoire sont appelés pertes de mémoire et sont souvent la conséquence d'erreurs de programmation. La valeur par défaut de System.ReportMemoryLeaksOnShutdown est False. La classe d'une perte est déterminée en examinant le premier dword du bloc. Les classes signalées des pertes ne sont pas toujours exactes à 100%. Une perte est signalée comme perte de chaîne si elle apparaît sous forme d'un AnsiString. Si le gestionnaire de mémoire n'est pas capable d'estimer le type de la perte, elle sera signalée comme appartenant à la classe "inconnu".

Pour ne jamais suspendre lors d'un conflit de thread dans le gestionnaire de mémoire

  1. Définissez la variable globale System.NeverSleepOnMMThreadContention sur True.
  2. Quand un conflit de thread survient dans le gestionnaire de mémoire, une pause sera effectuée dans une boucle jusqu'à ce que le conflit soit résolu.

Remarque : Le gestionnaire de mémoire est une ressource partagée. Quand plusieurs threads de l'application tentent d'exécuter une opération du gestionnaire de mémoire en même temps, un ou plusieurs threads pourront attendre l'achèvement d'une opération en suspens d'un autre thread avant de poursuivre leur exécution. Cette situation est appelée conflit de thread. Quand un conflit de thread survient dans le gestionnaire de mémoire, le comportement par défaut consiste à renoncer au temps restant dans la tranche de temps du thread. Si la ressource n'est toujours pas disponible quand le thread entre sa nouvelle tranche de temps, le gestionnaire de mémoire appelle la procédure Sleep du système d'exploitation pour imposer une plus longue attente (environ 20 millisecondes) avant d'effectuer une nouvelle tentative. Ce comportement fonctionne correctement sur les machines à CPUs à cores uniques ou doubles, et également lorsque le rapport du nombre de threads en cours d'exécution sur le nombre de cores CPU est relativement élevé (supérieur à 2:1). Dans d'autres situations, vous pouvez obtenir de meilleures performances en entrant une boucle d'attente jusqu'à ce que la ressource devienne disponible. Si System.NeverSleepOnMMThreadContention est définie sur True, t, le gestionnaire de mémoire entrera une boucle d'attente au lieu de quitter le programmateur. La valeur par défaut de System.NeverSleepOnMMThreadContention est False.

Obtention du source du gestionnaire de mémoire

Le code source complet du gestionnaire de mémoire (FastMM) est disponible sur SourceForge :

Avec la version complète de FastMM, vous pouvez exécuter le gestionnaire de mémoire dans un mode "débogage" spécial qui est utile pour la détection de la corruption du tas et des pertes de mémoire. Fonctionnalités supplémentaires de la version complète de FastMM :

  • Double libération des objets / interfaces
  • Historique des fichiers et rapports

Pour de plus amples informations, reportez-vous aux commentaires du code source de FastMM (FastMM4.pas et FastMM4Options.inc).

Voir aussi