Toon posts:

[Javascript]Geheugen gebruik bij aanroepen Webservice

Pagina: 1
Acties:

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 27-05 16:10
Hallo,

Ik heb een simpele webservice in C# die 1 parameter ontvangt en een boolean waarde terug geeft. Deze webservice roep ik aan via javascript op de volgende manier:

JavaScript:
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
var timer = null;
var onreadyallowed = false;
var alertallowed = true;
var _Oid;
var _Timeout;
var _UpdateTekst;
var _TheRequest;

function StartUpdateControle(Oid, Timeout, UpdateTekst) 
{
    _Oid = Oid;
    _Timeout = Timeout;
    _UpdateTekst = UpdateTekst;
    _TheRequest = GetXMLObject();

    StopUpdateControle();
        timer = setTimeout("CheckForUpdates()", _Timeout);
}

function GetXMLObject()
{
    //Construct an XMLHTTP Object to handle our HTTP Request
    var xmlHttpReq = false;
    try {
        xmlHttpReq = new XMLHttpRequest();
    }
    catch (err)
    {
        try
        {
            xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (err2)
        {
            xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
        }
    }

    if (!xmlHttpReq)
    {
        return null
    }

    return xmlHttpReq;
}

function CheckForUpdates()
{
    onreadyallowed = true;

    if (_TheRequest == null)
    {
        return;
    }

    _TheRequest.open('POST', 'Services/CheckForUpdate.asmx', true);
    _TheRequest.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
    _TheRequest.setRequestHeader('SOAPAction', 'http://tempuri.org/IsUpdateAvailable');
    _TheRequest.onreadystatechange = function () {
        if (_TheRequest.readyState == 4 && onreadyallowed) {
            onreadyallowed = false;
            ParseResponse();
        }
    }

    try
    {
        var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
        xml += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
        xml += "<soap:Body>";
        xml += "<IsUpdateAvailable xmlns=\"http://tempuri.org/\">";
        xml += "<Oid>" + _Oid + "</Oid>";
        xml += "</IsUpdateAvailable>";
        xml += "</soap:Body>";
        xml += "</soap:Envelope>";

        _TheRequest.send(xml);
    }
    catch (e)
    {
        error = ("Error while sending: " + e);
        error += ("e.number is: " + (e.number & 0xFFFF) + "(" + e.number + ")");
        error += ("e.description is: " + e.description);
        error += ("e.name is: " + e.name);
        error += ("e.message is: " + e.message);
        error += ("xmlHttpReq.status is: " + xmlHttpReq.status);
        error += ("xmlHttpReq.statusText is: " + xmlHttpReq.statusText);
        alert(error);
    }
}

function ParseResponse() {

    if (_TheRequest.responseXML.getElementsByTagName('IsUpdateAvailableResponse')[0] == null) {
            return;
        }
        else {
            var result = _TheRequest.responseXML.getElementsByTagName('IsUpdateAvailableResponse')[0].text;
            if (result == null) {
                result = _TheRequest.responseXML.getElementsByTagName('IsUpdateAvailableResponse')[0].textContent;
            }

            if ("true" == result) {
                alert(_UpdateTekst);
            }
        }

        _TheRequest.onreadystatechanged = nill;
        _TheRequest.abort();
        timer = setTimeout("CheckForUpdates()", _Timeout);
}

function nill() { }


Alleen elke keer als deze code uitgevoerd wordt zie ik het geheugen van de browser met een paar kB omhoog gaan in de task manager. Ik kan niet goed achterhalen waar dit vandaan komt,

Ik heb al geprobeerd om de onreadystatechanged event op een lege functie in te stellen, en ook al om niet telkens een nieuw XmlHttpRequest object aan te maken, maar niets helpt.

Doe ik iets fout of moet ik de fout toch ergens anders zoeken?

Hail to the king baby!


  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 25-05 10:46
urk_forever schreef op woensdag 15 juni 2011 @ 15:57:
Alleen elke keer als deze code uitgevoerd wordt zie ik het geheugen van de browser met een paar kB omhoog gaan in de task manager. Ik kan niet goed achterhalen waar dit vandaan komt,

....

Doe ik iets fout of moet ik de fout toch ergens anders zoeken?
Je voert een javascript functie uit (AJAX functie) waardoor het geheugengebruik van de browser een paar kB omhoog gaat en volgens jou is dit een fout?

Ik denk dat ik het niet helemaal volg, maar ik vind het niet meer dan logisch dat het geheugengebruik van de browser (welke eigenlijk?) stijgt als je hem een opdracht geeft :)

Engineering is like Tetris. Succes disappears and errors accumulate.


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 27-05 16:10
armageddon_2k1 schreef op woensdag 15 juni 2011 @ 16:15:
[...]


Je voert een javascript functie uit (AJAX functie) waardoor het geheugengebruik van de browser een paar kB omhoog gaat en volgens jou is dit een fout?

Ik denk dat ik het niet helemaal volg, maar ik vind het niet meer dan logisch dat het geheugengebruik van de browser (welke eigenlijk?) stijgt als je hem een opdracht geeft :)
Nou deze functie wordt continue en achter elkaar uitgevoerd. Als elke keer dat de functie uitgevoerd wordt het geheugen gebruik omhoog gaat dan kan je op een gegeven moment tegen limieten aanlopen. Op een desktop browser duurt dat misschien een tijdje, maar op, oudere, mobile devices met minder geheugen kan dat natuurlijk problemen geven.

Met een timeout van 60 milliseconden zit ik in IE9 binnen een minuut op 30mB geheugen (bij startup 8mB).

[Voor 6% gewijzigd door urk_forever op 15-06-2011 16:22]

Hail to the king baby!


  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 25-05 10:46
Hoe weet je dat de browser niet op gezette tijden aan garbagecleaning doet en denk je dat mobile devices dit misschien niet stricter hebben? Ik snap dat het interessant is om een zo lean mogelijke app te maken, maar meten = weten. Je wil niet uren bezig zijn met een optimalisatie welke alle moderne (mobiele) browsers er al uit-optimaliseren. Daarnaast is het dan ook handig om te kijken of het nuttig is om continu AJAX calls uit te voeren.

Ik zie dat het om een update-notificatie gaat. Dat is toch niet nodig elke 60ms? Elk uur zou logischer zijn.

[Voor 13% gewijzigd door armageddon_2k1 op 15-06-2011 16:27]

Engineering is like Tetris. Succes disappears and errors accumulate.


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 27-05 16:10
Ik ben er vandaag al een paar uurtjes mee bezig geweest, maar in IE9 bijvoorbeeld zie ik continue het geheugen gebruik oplopen en nooit minder worden. Daarom vroeg ik me af of ik iets fout doe.

De 60ms is maar een voorbeeld, in het echt zal het altijd een grotere interval zijn. Maar ook met een grotere interval zie ik het geheugen gebruik alleen maar oplopen.

[Voor 30% gewijzigd door urk_forever op 15-06-2011 16:30]

Hail to the king baby!


  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 25-05 10:46
Hoe lang heb je getest met IE? Misschien zit er een soort max op die jij nog niet gehaald heb.
Ik ben zelf niet zo'n javascript guru, maar wellicht leer je hier iets:
http://stackoverflow.com/...script-garbage-collection

[Voor 78% gewijzigd door armageddon_2k1 op 15-06-2011 16:35]

Engineering is like Tetris. Succes disappears and errors accumulate.


  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 17-04 12:13
Zie : http://www.tomshardware.c...r-9-safari-5,2680-10.html
Daar zie je een grafiek dat als je 40tabs opent en daarna weer sluit je, als snel een aantal 100MB's aan geheugen kwijt bent geraakt. Of te wel, de meeste browsers ruimen slecht hun geheugen weer op.

Wil je echt testen op memory-leaks gebruik dan Chrome ..

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Offtopic maar je weet dat je in ASP.NET d.m.v. een ScriptManager automatisch de javascript webservice client code kan laten genereren voor een asmx of een WCF webservice? Zodat je niet zelf de soap berichten hoeft uit te typen.

Zie: http://msdn.microsoft.com/en-us/magazine/cc163499.aspx

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 27-05 16:10
@armageddon_2k1: Nee, zoals ik aangaf is de 60ms in werkelijkheid wel hoger, maar dit was een voorbeeld. Ook met een interval van 5000ms zie ik het geheugen gebruik steeds omhoog kruipen.

@djexplo: In IE9 heb ik maar 1 tab en verder gebruik ik IE helemaal niet. Ik heb alleen die pagina open staan en de javascript wordt uitgevoerd, en toch gaat elke keer het geheugen gebruik omhoog. Als je tips hebt hoe ik kan testen op memory leaks in Chrome hoor ik het graag.

@Face_-_LeSS: Ik zal eens kijken of ik de ScriptManager kan gebruiken. Het probleem is wel dat het ook moet draaien onder bijvoorbeeld PocketIE op Windows Mobile 5 bijvoorbeeld.

Hail to the king baby!


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
De bron van je data heeft natuurlijk niks met het geheugen gebruik te maken. Dat maakt dit een client-side javascript probleem en hoort dus in WEB thuis

PRG -> WEB dus..

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • djexplo
  • Registratie: Oktober 2000
  • Laatst online: 17-04 12:13
urk_forever schreef op woensdag 15 juni 2011 @ 17:38:
@djexplo: In IE9 heb ik maar 1 tab en verder gebruik ik IE helemaal niet. Ik heb alleen die pagina open staan en de javascript wordt uitgevoerd, en toch gaat elke keer het geheugen gebruik omhoog. Als je tips hebt hoe ik kan testen op memory leaks in Chrome hoor ik het graag.
Het is ook niet een letterlijke vergelijking. Je zie dat de "Garbage Collector" van Chrome netjes alles opruimt in hun meerdere tab's test, terwijl andere browsers 100mb's aan objecten niet opruimen.
Dus als je jou script ook in Chrome steeds meer geheugen gaat gebruiken ligt het aan je script, anders aan een slechte IE "Garbage Collector"

'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 13-01 10:59
djexplo schreef op woensdag 15 juni 2011 @ 16:37:
Zie : http://www.tomshardware.c...r-9-safari-5,2680-10.html
Daar zie je een grafiek dat als je 40tabs opent en daarna weer sluit je, als snel een aantal 100MB's aan geheugen kwijt bent geraakt. Of te wel, de meeste browsers ruimen slecht hun geheugen weer op.
Ik zou dat eerder omdraaien. Goed memory-management ruimt het juist niet de hele tijd op. Dat is juist een van de sterkere punten van OS X bijvoorbeeld.

Geheugengebruik is dan ook een hele slechte graadmeter, want liever dat een applicatie het geheugen beschikbaar houdt en pas vrijgeeft als het OS het nodig heeft, dan dat het geheugen de hele tijd leeg (en dus nutteloos) is.
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee