Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.01.2018, 19:54

Javascript und RAM Verbrauch

Hallo,

ich versuche zur Zeit meine Kentnisse in Javascript zu verbessern und habe zur Zeit ein Problem das der RAM Verbrauch langsam immer weiter ansteigt, solange meine Seite im Browser geoeffnet ist.

Der Code meiner Javascript Seite sieht so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<!DOCTYPE html>
<html>
<head>
<title>Testseite</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
<script type="text/javascript">
"use strict";

//Variablen deklarieren
var Downloadliste_Object = new Object();
var Zaehler=0;
var ZaehlerIndex=0;
var Downloadliste_Textinhalt="";
var strurl="";
var Anzahl=0;
var str="";
var res="";
console.log("Program started");


//--check json syntax
function isJson(item) 
{
    item = typeof item !== "string"
        ? JSON.stringify(item)
        : item;

    try {
        item = JSON.parse(item);
    } catch (e) {
        return false;
    }

    if (typeof item === "object" && item !== null) {
        return true;
    }

    return false;
}




//+------------------------------------------------------------------+
//| Server Funktion                                                  |
//+------------------------------------------------------------------+
function ServerFunktion()
{
     Download();
     document.getElementById("test").innerHTML = "Zaehler "+Zaehler;

     //---- 2000 = 2 sekunden
     setTimeout(ServerFunktion, 2000);
}



//----
function Download()
{
    //--Coins in Array Object
    if(Zaehler==0)
    {
            //-- namen into Array
        Downloadliste_Textinhalt = $.ajax({ url: "Downloadliste.txt", contentType:"application/json", dataType:"json", async: false }).responseText;
        if(isJson(Downloadliste_Textinhalt)==true)
        {
                    Downloadliste_Object = JSON.parse(Downloadliste_Textinhalt);
        }//json Check
        else alert("Download Liste json synatx error");     
        
    }
    //--
    //-- PHP Datei zum downloaden der Daten aufrufen
        else if(Zaehler>1)
    {
        Anzahl=Downloadliste_Object.Name.length;
        str=Object.keys(Downloadliste_Object.Name);
        if(str.indexOf("Name")>=0)
        {
            if(Downloadliste_Object.Name[ZaehlerIndex]=="Name1")
            {
               strurl="Save_data_1.php?name="+Downloadliste_Object.Name[ZaehlerIndex];
                   res=$.ajax({ url: strurl, contentType:"application/json", dataType:"json", async: false }).responseText;
               document.getElementById("test2").innerHTML = res;
            }
            else
            if(Downloadliste_Object.Name[ZaehlerIndex]=="Name2")
            {
                  strurl="Save_data_2.php?name="+Downloadliste_Object.Name[ZaehlerIndex];
                  res=$.ajax({ url: strurl, contentType:"application/json", dataType:"json", async: false }).responseText;
              document.getElementById("test2").innerHTML = res;
            }
            
            //--Zaehler Array Index
            ZaehlerIndex++;
            
            //--Zaehler zurueck setzen
            if(ZaehlerIndex>=Anzahl)
            {
                Zaehler=0;
                ZaehlerIndex=0;
            }
        }
    }
    Zaehler++;
}
</script>
</head>
<body onload="ServerFunktion()">

<span id="test"></span>
<span id="test1"></span>
<span id="test2"></span>

</body>
</html>


Mit diesem Javascript werden Daten gedownloadet, der Download passiert innerhalb einer PHP Datei.

Damit die PHP Datei die Downloads immer wieder macht, benutze ich "setTimeout(ServerFunktion, 2000)" innerhalb meiner sogenannten "ServerFunktion" befindet sich die Javascript Funktion "Download" welche auf diese Weise alle 2 Sekunden wieder aufgerufen wird, damit die Downloads gemacht werden.

In der "Download" Funktion werden zuerst Namen aus einer Textdatei in ein Object gespeichert, diese Namen werden dann immer weiter gegeben an die PHP Datei, damit diese wweis was sie als naechstes downloaden soll.

Die Idee wie ich das aufgebaut habe, damit bin ich zufrieden, den ich erreiche damit mein Ziel, aber ich habe das Problem das der RAM Verbrauch aus irgendeinem Grund langsam immer weiter ansteigt, solange ich diese Seite im Browser geoeffnet laufen lasse.

Kann irgend jemand von euch ein Grund fuer das ansteigen des RAM Verbrauches in meinem Javascript Aufbau finden?
Vielleicht habe ich dort etwas nicht gut genug aufgebaut, was den RAM Verbrauch langsam ansteigen laest, oder ist es generell nicht moeglich mit Javascript den RAM Verbrauch des Browsers gering oder auf ein staendig gleichen Level zu halten, wenn man beispielweise mit Funktionen wie "setTimeout()" eine staendige Wiederholung erzwingt?

Sollte man vielleicht auch besser "setInterval()" benutzen statt "setTimeout()"? Aber ich vermute es wird wo anders dran liegen und ob man "setTimeout" oder "setInterval" benutzt macht bestimmt kein grosen Unterschied.

Ich habe noch ein Bild angefuegt wo man mein Task Manager sehen kann, da sind irgendwie drei verschiedene Eintraege vom Chrome Browser und einer davon steigt immer weiter an nach einiger Zeit und es geht erst dann alles wieder runter, wenn ich die Seite im Browser schliese.
»Javaprogrammer« hat folgendes Bild angehängt:
  • ram.png

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

23.01.2018, 20:04

Ich kann dir zwar mit deinem Problem nicht helfen, aber der TaskManager ist nicht unbedingt die beste Stelle um zu sehen was dein Code an RAM frisst.
Chrome hat einen eigenen Task-Manager (Umschalt+Esc) der den Speicherverbauch auch pro Tab runterbrechen kann.

3

23.01.2018, 20:44

Ich kann dir zwar mit deinem Problem nicht helfen, aber der TaskManager ist nicht unbedingt die beste Stelle um zu sehen was dein Code an RAM frisst.
Chrome hat einen eigenen Task-Manager (Umschalt+Esc) der den Speicherverbauch auch pro Tab runterbrechen kann.


Dank dir fuer dein Beitrag. Ich habe jetzt Beispielweise nur das eine Tab geoffnet im Browser, wo meine Seite offen ist und bemerkte das der RAM immer weiter ansteigt.

Ich finde noch nicht den logischen Fehler in meinem Code und ich weis auch nicht mal ob es ueberhaupt moeglich ist so ein Prozess vernuenftig mit Javascript zu bauen, das den RAM Verbrauch nicht langsam immer weiter nach oben treibt.

Irgendwie vermisse ich so Sachen wie eine Funktion die irgendwie den Speicher wieder leer gibt damit das alles wieder runter kommt.

Meine Variablen habe ich im Codeaufbau alle als globale Variablen deklariert und denke daher das es nicht daran liegt das diese vielleicht immer wieder neu erstellt werden und dazu immer neuer Speicher gebraucht wird.

Ich weis nicht ob es vielleicht auch am Objekt liegt in welches der Inhalt der Textdatei gespeichert wird, das passiert in meinem Beispielcode circa alle 5 Minuten das wieder die Textdatei aufgerufen wird und der Inhalt ins Objekt gespeichert wird, aber ich gehe davon aus das dort das Objekt einfach ueberschrieben wird und nicht jedesmal ein neues gebildet wird.

Aber irgendetwas treibt den RAM halt nach oben, ich finde noch nicht den Grund, aber wuerde mich freuen wenn ich das mit etwas Hilfe herausfinden koennte, den einmal gelernt ist gelernt.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

23.01.2018, 22:30

Die Developer-Tools des Browsers haben auch Profiler & Co. Einfach mal nutzen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

23.01.2018, 23:25

Die Developer-Tools des Browsers haben auch Profiler & Co. Einfach mal nutzen.


Ich habe das auch schon gehoert, aber ich bin nicht so richtig schlau daraus geworden und habe gedacht vielleicht kann jemand direkt anhand meines Codes Probleme erkennen, welche zu einen hohen RAM Verbrauch fuehren koennen.

Kennst du dich den aus mit diesen Developer Tools von Chrome und bist dir sicher das man damit die Stelle finden kann wo der hohe RAM Verbrauch entsteht? Wenn man das damit sicher finden kann, kann ich mir ja beibringen wie man damit richtig sucht.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

23.01.2018, 23:32

Hoher RAM-Verbrauch ist nicht unbedingt schlimm. RAM ist schließlich dafür da, dass er genutzt wird. JavaScript hat einen Garbage Collector. Manchmal dauert es vielleicht etwas länger, bis der mal wieder läuft und tote Objekte löscht. Lass das Ganze mal noch länger laufen und schau, ob der Speicherverbrauch irgendwann wieder sinkt. Nur wenn er wirklich immer weiter steigt und das System irgendwann anfängt zu swappen, solltest du dir richtig Sorgen machen.

7

23.01.2018, 23:56

Hoher RAM-Verbrauch ist nicht unbedingt schlimm. RAM ist schließlich dafür da, dass er genutzt wird. JavaScript hat einen Garbage Collector. Manchmal dauert es vielleicht etwas länger, bis der mal wieder läuft und tote Objekte löscht. Lass das Ganze mal noch länger laufen und schau, ob der Speicherverbrauch irgendwann wieder sinkt. Nur wenn er wirklich immer weiter steigt und das System irgendwann anfängt zu swappen, solltest du dir richtig Sorgen machen.


Es ist schon einige mal vorgekommen das der RAM ueber 90% ging und spaeter habe ich gesehen das der Browser down war, also muste ich es wieder neu starten.
Dann habe ich versucht einige Sachen zu optimieren und jetzt sieht es so aus als ob der RAM immer noch steigt, nur langsamer als vorher.

Falls man mit irgendwelchen Tools solche Javascript Fehler finden kann waere das sehr hilfreich, den in meinem Code selber finde ich keine Stelle wo ich weiter optimieren kann.

Eine Idee ist mir eben noch gekommen, wenn ich mir den Windows Taskmanager ansehe, dort sind drei Eintraege fuer Chrome und bei einem Eintrag steht der Titel der Seite welche im Browser Tab geoeffnet ist und der andere Eintrag koennte auch das Chrome Developer Fenster sein, weil ich das auch offen hatte um Fehler zu sehen, vielleicht baut das Developer Tool Fenster langsam mehr Ram auf und nicht die eigentliche Seite von mir, ich werde das nochmal genauer beobachten ohne geoeffneten Developer Fenster.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

24.01.2018, 06:20

Dir wurde doch auch schon gesagt, dass Chrome selbst auch einen Task-Manager hat. Da siehst du welches Tab wie viel Speicher belegt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

24.01.2018, 10:34

Ja das waren schon hilfreiche Tips. Ich habe gestern auch gesehen das irgendwie dieses Chrome Developer Tool Fenster vom Chrome Browser den RAM Verbrauch anheben koennte und ich werde das alles mal mehr beobachten, vielleicht habe ich etwas Glueck und stelle nachher fest das es doch nicht an meinem Javascript liegt sondern an diesem Developer Tool Fenster das geoeffnet war.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

24.01.2018, 10:48

Ja das waren schon hilfreiche Tips. Ich habe gestern auch gesehen das irgendwie dieses Chrome Developer Tool Fenster vom Chrome Browser den RAM Verbrauch anheben koennte und ich werde das alles mal mehr beobachten, vielleicht habe ich etwas Glueck und stelle nachher fest das es doch nicht an meinem Javascript liegt sondern an diesem Developer Tool Fenster das geoeffnet war.

Das spielt doch hier keine Rolle. Du sollst dir den Speicherverbrauch in Chrome selbst ansehen. Dafür öffnest du die Developertools und schaust unter Memory. Da kannst du dann prüfen was dein Javascript-Code an Speicher verbraucht. Unabhängig von anderen Programmen oder Chrome selbst.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige