LlGetFreeMemory/fr

From Second Life Wiki
Jump to navigation Jump to search

Description

Fonction: integer llGetFreeMemory( );

Renvoie un integer correspondant au nombre d'octets libres dans la pile


Spécifications

La mémoire d'un script LSL est divisée en 4 sections : code exécutable (byte-code), pile (stack), mémoire libre, tas (heap). La mémoire libre n’est pas un espace mémoire alloué, il s’agit juste d’un espace entre les zones de la pile et du tas. La taille combinée des 4 sections est de 16384 octets.

Les chaînes de caractères, les listes et les clés sont stockés dans la zone du tas. Les pointeurs de la zone du tas (pour les chaînes de caractères, les listes et les clés) ainsi que les entiers, nombres en virgule flottante, vecteurs et les rotations sont tous stockés temporairement dans la zone de la pile lorsque le script s’exécute.

Durant l’exécution du script, la taille de la zone de la pile évolue en fonction de la complexité du code exécuté. Contrairement à la zone de la pile dont la taille peut diminuer, la taille de la zone du tas ne diminue pas. Quand il n’y a plus de mémoire de disponible et que les zones de la pile et du tas se rencontrent, le script génère une erreur “Stack-Heap Collision“ qui fait planter le script.

La zone de tas peut être fragmentée et certains blocs de mémoire peuvent devenir inutilisables. Il n’existe aucune fonction de défragmentation, mais il existe des techniques d’écriture de scripts qui peuvent aider à réduire cette fragmentation.

Avertissements

  • Le nombre d'octets de la zone du tas peut augmenter mais jamais diminuer.

Exemples

L’appel à llGetFreeMemory pourrait ressembler à cela : <lsl> integer ko = 1024; // 1024 == (1 << 10); float maxParScript = 16 * ko;

llOwnerSay((string) ((maxParScript - llGetFreeMemory()) / ko) +

                     " ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation");

llOwnerSay((string) ((maxParScript - llGetFreeMemory()) / ko) +

                    " ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation");

</lsl>

Le chat montre que la zone de tas a grandit au fil du temps après avoir diminué lors de la réinitialisation.
0.508789 ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation
0.524414 ko de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation

Réduire la zone de tas, étonnamment, n'augmente pas la valeur renvoyée par llGetFreeMemory: <lsl> default {

   state_entry()
   {
       llSay(0, "llGetFreeMemory() renvoie : " + (string) llGetFreeMemory() + " octet(s)");
       // Renvoie la valeur de llGetFreeMemory() en octets
       if (TRUE)
       {
           list TEST1;
           TEST1= [1,5334, "Bla, bla, bla", <345,3.78,34>, <0,0,0,1>, "TEST"];
           TEST1 = TEST1 + TEST1 + llGetFreeMemory();
           integer i;
           for (i = 0; i < llGetListLength(TEST1); i++)
           {
               llSay(0,"objet n°" + (string) i + " dans la liste : " + llList2String(TEST1, i));
           }
           TEST1 = [];
       }
       llSay(0, "Liste effacée !");
       llSay(0, "à présent llGetFreeMemory() renvoie : " + (string) llGetFreeMemory());
   }

} // http://wiki.secondlife.com/wiki/User:TxMasterG_Ping/llGetFreeMemory </lsl>

Notes

Cette fonction ne renvoie pas la mémoire libre contrairement à ce que son nom pourrait laisser supposer. Certaines personnes souhaiteraient que cette fonction évolue ou soit remplacée par une fonction plus utile quand la machive virtuelle LSL passera en Mono.

Nous pouvons imaginer la fonction llGetFreeMemory comme un modèle UNIX classique composé de tâches/processus fonctionnant en parallèle. Dans ce modèle, la tâche du script est toujours de 16 384 octets (16 ko). Mise à part le code, la zone de pile grandit du bas vers le haut, alors que la zone de tas grandit du haut vers le bas. llGetFreeMemory() renvoie alors "la valeur historiquement la plus basse de la zone de tas diminuée de la limite de la zone de pile".

llGetFreeMemory() ne compte pas les octets libres, llGetFreeMemory() décompte uniquement les octets jamais utilisés.

Vous pouvez également consulter : les articles "Script run-time error" & "Stack-Heap Collision" dans Erreurs LSL
Vous pouvez également consulter : Talk:LlGetFreeMemory pour la discussion d’une théorie selon laquelle llGetFreeMemory pourrait renvoyer des nombres négatifs.

Vous cherchez encore des informations ? Peut-être cette page du LSLwiki pourra vous renseigner.