Difference between revisions of "User:Daemonika Nightfire/Scripts/Memory Walkthrough"

From Second Life Wiki
Jump to navigation Jump to search
 
Line 2: Line 2:
Dieses Script beinhaltet Beispiele zum ueberpruefen von Script-Memory und den maximalen Verbrauch bestimter Funktionen.
Dieses Script beinhaltet Beispiele zum ueberpruefen von Script-Memory und den maximalen Verbrauch bestimter Funktionen.


<lsl>
<source lang="lsl2">
/*
/*
     Memory-walkthrough by Daemonika Nightfire (daemonika.nightfire)
     Memory-walkthrough by Daemonika Nightfire (daemonika.nightfire)
Line 55: Line 55:
     }
     }
}
}
</lsl>
</source>


==Script run-time error: Stack-Heap Collision==
==Script run-time error: Stack-Heap Collision==

Latest revision as of 09:06, 6 February 2015

Memory Walkthrough

Dieses Script beinhaltet Beispiele zum ueberpruefen von Script-Memory und den maximalen Verbrauch bestimter Funktionen.

/*
    Memory-walkthrough by Daemonika Nightfire (daemonika.nightfire)
    Used commands:
    
    integer llSetMemoryLimit(integer limit)     // legt das maximale Memorylimit fuer das Script fest
    integer llGetMemoryLimit()                  // gibt den Wert des Memorylimits zurueck
    integer llGetUsedMemory()                   // gibt den Wert des gesamten Memory-verbrauchst zurueck
    integer llGetFreeMemory()                   // gibt den Wert des freien Memorys zurueck
    
    llScriptProfiler(PROFILE_SCRIPT_MEMORY);    // startet Memory-ueberwachung
    llScriptProfiler(PROFILE_NONE);             // beendet Memory-ueberwachung
    integer llGetSPMaxMemory()                  // gibt den maximalen Memory-verbrauch des ScriptProfilers zurueck
*/

integer limit = 20000; // dient zum festlegen des maximalen Script-Memory-Limits

Test() // meine Funktion
{
    // einfache Hovertext-Anzeige
    llSetText("Limited Memory " + (string)llGetMemoryLimit() +
              "\nUsed Memory " + (string)llGetUsedMemory() +
              "\nFree Memory " + (string)llGetFreeMemory(),<1,1,1>,1);
}

default
{
    state_entry()
    {
        llSetMemoryLimit(limit);
        
        ///// Memory Profiler: testet den Speicherverbrauch saemtlicher Funktionen unterhalb dieses Befehls
        llScriptProfiler(PROFILE_SCRIPT_MEMORY); // startet Memory-ueberwachung
        
        Test(); // meine Funktion
        
        ///// Memory Profiler: beendet die ueberwachung des Speicherverbrauchs saemtlicher Funktionen oberhalb dieses Befehls
        llScriptProfiler(PROFILE_NONE); // beendet Memory-ueberwachung
        
        ///// gibt den maximalen Memory-verbrauch der getesteten Funktionen zurueck
        llSay(0,"This script used at most " + (string)llGetSPMaxMemory() + " bytes of memory during Test.");
        
        // Ausgabe sieht Folgendermassen aus:
        
        // Hovertext:
        // Limited Memory 20000
        // Used Memory 4972
        // Free Memory 15100
        
        // Chat:
        // [05:11] Object: This script used at most 4972 bytes of memory during Test.
    }
}

Script run-time error: Stack-Heap Collision

Sobald der Memory eines Scriptes ueberladen ist (auch Mono), erscheint eine Fehlermeldung wie folgende im Chat, wenn man Script Error im Debug Channel anzeigen laesst.

[10:33:51]  Object: Object [script:New Script] Script run-time error
[10:33:51]  Object: Stack-Heap Collision

Diese Fehlermeldung bedeutet im Grunde, dass das Script den Geist aufgegeben hat und man es nur noch mit einem Manuellen Reset wieder zum Leben erwecken kann. Das ist aber nur eine voruebergehende Loesung, denn auf kurz oder lang passiert das gleiche wieder. Bei diesem Fehler ist eine ueberarbeitung des Scriptes durch den Ersteller zwingend erforderlich. Sollte das Object in dem sich das Script befindet (no modify) sein, bleibt nur noch weg schmeissen. Ausfuehrliche Details ueber Script Speicher sind hier zu finden: LlGetFreeMemory, LSL_Script_Memory & User:Omei_Qunhua.