LlGetFreeMemory/fr

From Second Life Wiki
< LlGetFreeMemory
Revision as of 11:13, 20 March 2008 by Gally Young (talk | contribs) (Localized to french)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Description

Fonction: integer llGetFreeMemory( );

Renvoie un integer correspondant au nombre de bytes libres dans la pile


Spécifications

La mémoire LSL est divisée en 4 sections : Byte-code, Stack, Mémoire libre, Heap. La mémoire libre n’est pas un espace mémoire alloué, il s’agit juste d’un espace entre les zones Stack & Heap. La taille combinée des 4 sections est de 16384 bytes.

Les String, les list & les key sont stockés dans la zone Heap. Les pointeurs de la zone Heap (pour les string, les list & les key) ainsi que les integer, float, vector & les rotation sont tous stockés temporairement dans la zone stack lorsque le script s’exécute.

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

La zone Heap peut être fragmentée et certains blocs de mémoire peuvent devenir inutilisable. 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 de byte de la zone Heap peut augmenter mais jamais diminuer.

Exemples

L’appel à llGetFreeMemory pourrait ressembler à cela: <lsl> integer Ki = 1024; // 1024 == (1 << 10); float maxPerScript = 16 * Ki; llOwnerSay((string) ((maxPerScript - llGetFreeMemory())/Ki) + " KiB de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation"); llOwnerSay((string) ((maxPerScript - llGetFreeMemory())/Ki) + " KiB 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 Heap a grandit au fil du temps après avoir diminué lors de la réinitialisation.
0.508789 KiB de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisationreset
0.524414 KiB de mémoire ont été utilisés au moins une fois par ce script depuis sa réinitialisation

Réduire la zone heap, étonnamment, ne diminue pas la valeur renvoyée par llGetFreeMemory: <lsl> default {

   state_entry()
   {
       llSay(0,"llGetFreeMemory() renvoie : "+(string)llGetFreeMemory()+"byte(s)");
       //Renvoie la valeur de llGetFreeMemory() en bytes
       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,"List 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 le LSL passera en LSL2 (cf. Mono).

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

llGetFreeMemory ne compte pas les bytes libres, llGetFreeMemory décompte uniquement les bytes jamais utilisés.

Vous pouvez également consulter : les articles "Script run-time error" & "Stack-Heap Collision" dans LSL Errors
Vous pouvez également consulter : Talk:LlGetFreeMemory pour la discution 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.