NEWS
Timer Objekte bei Script-Neustart
-
Hallo JS Experten,
Da ich wieder mal mit Speicherproblemen kämpfe und mir den Kopf zerbreche wo der Speicher verbraucht wird ist mir eine Frage zu folgendem Szenario eingefallen:
Fall:
Ein Script hat einige Eventroutinen in denen so einige Timerobjekte genutzt werden.
Vor dem Auftruf der setTimer Funktionen prüfe ich zunächst ob es noch ein Timer-Objekt gibt:if(LTDiele) clearTimeout(LTDiele); // Timer beenden falls noch einer aktiv ist und dann neu triggern
und beende/lösche diesen falls es da noch ein gültiges Objekt gibt. Anschließend erstelle ich ein neues Timer Objekt mit
LTDiele = setTimeout(function(){setState(DE_K_LFLUR_1, false)}, 120000); //Nach 2 Min
Was passiert aber wenn, sagen wir mal, der Timer noch läuft und drauf wartet die CallBack Funktion aufzurufen (in diesem Fall setState(DE.... ) und das Scrikpt in dem das Timer-Objekt erstellt wurde neu gestartet wird? Ist das Timerobjekt dann immer noch auf dem "Stack" und belegt Speicher als verwaistes Objekt oder wird das Timerobjekt auch jedesmal, wenn das Skript neu gestartet wird, gelöscht?
Hat also jedes Skript seinen eigenen "Stack"? Oder wird der vom JS-Controller genutzt?
-
@loxdus sagte: wird das Timerobjekt auch jedesmal, wenn das Skript neu gestartet wird, gelöscht?
Ja. Kann man auch leicht testen.
-
@loxdus
jedes skript wird in seiner eigenen sandbox ausgeführt.
d.h. wenn man einen timer vergisst nicht zu deaktivieren, dann ist der speicher nach beenden des skripts auch wieder frei.
auch sind die befehle setInterval und setTimeout, die zur Verfügung stehen nicht die originalen Befehle, die Javascript nativ zur Verfügung stellt, sondern da ist noch ein wenig sandbox-code dazwischen, so das das starten und stoppen eines skripts nicht zu einem Gesamt-Speicherverlust führt.Allerdings ist innerhalb der Laufzeit eines Skriptes der Programmierer verantwortlich das da keine Leaks entstehen.
-
@oliverio Vielen Dank für die ausführliche Erklärung. Dann werde ich jetzt mal meine riesen Skripte ein wenig in kleine Skripte aufteilen um einen besseren Überblick über die Speichernutzung zu bekommen.