LlGetFreeMemory/fr
LSL Portail Francophone | LSL Portail Anglophone | Fonctions | Évènements | Types | Operateurs | Constantes | Contrôle d'exécution | Bibliothèque | Tutoriels |
Description
Fonction: integer llGetFreeMemory( );225 | N° de fonction |
0.0 | Delais |
10.0 | Energie |
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, ne diminue 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 le LSL passera en LSL2 (cf. 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.