JavaScript - strona się wysypuje po jakimś czasie.

Odpowiedz Nowy wątek
2015-02-19 08:38
0

Witam wszystkich,

Piszę z kolejnym problemem. Napisałem stronę która zapewnia komunikację pomiędzy sterownikiem, a PC. Strona ta odświeża wybrane wartości z urządzenia co dwie sekundy, następnie rysuje ich wykresy jak się zmieniają w czasie. Wszystko pięknie śmiga, tak jak chciałem. ALE! Problem w tym, że w pewnym momencie (mniej więcej po godzinie) wyrzuca mi komunikat z Windowsa "low memory", a po jakimś czasie strona generuje błędy i przeglądarka się sama wyłącza.

Da się coś z tym zrobić, drogie Panie i Panowie?

edytowany 2x, ostatnio: smutny_grzegorz, 2015-02-19 08:39

Pozostało 580 znaków

2015-02-19 08:50
0

Da się


Jak tak krótko to chociaż kropkę byś dopisał :D - nieznasz 2015-02-20 14:23

Pozostało 580 znaków

2015-02-19 09:13
0

To dobrze :D
A mógłbym liczyć na pomoc z Twojej strony? :D Z resztą po raz kolejny, o ile dobrze kojarzę.

Pozostało 580 znaków

2015-02-19 09:19
0

No ja myślę, że w linii 21 masz błąd. (liczę, że zrozumiałeś)


Pozostało 580 znaków

2015-02-19 13:15
0

Jak najbardziej zrozumiałem. Myślałem, że jest jakaś funkcja kontrolująca takie cuda. :)
Był to mój pierwszy program więc proszę o wyrozumiałość.
Załączam plik.

edytowany 1x, ostatnio: smutny_grzegorz, 2015-02-19 13:19
o jesu, ile kodu, to dopiero wieczorem w to popatrzę. generalnie masz coś takiego jak "wyciek pamięci" - pogrzeb sobie w międzyczasie co to jest i jak to eliminować, może sam znajdziesz problem ;) - dzek69 2015-02-19 13:23

Pozostało 580 znaków

2015-02-20 10:24
0

Dzięki za wskazówki, zacznę przeglądać na pewno. :)

Pozostało 580 znaków

2015-03-09 16:34
0

Wracam, przez chwilę mój problem nie był "nagły" jednak, zacząłem teraz o tym czytać i przyznam szczerze, ze się gubię.
Rozumiem, że mam te wycieki pamięci nie wiem tylko jak zlokwalizować miejsce w którym powstają i jak je powstrzymać, czyli najważniejszych rzeczy.

Podpowiecie mi jak mogę znaleźć miejsce ich występowania?

Edit:
Mam niemal pewność, że za wyciek odpowiada: getJSON, przykładowo:

$.getJSON("I_Pressures.htm", function(data){

                tab_PT101[i]=parseFloat(data.PT101).toFixed(2);
                tab_PT103[i]=parseFloat(data.PT103).toFixed(2);
                tab_PT110[i]=parseFloat(data.PT110).toFixed(2);
                tab_PT205[i]=parseFloat(data.PT205).toFixed(2);

                l_PT101.innerHTML = tab_PT101[i]+" "+ "[bar]";
                l_PT103.innerHTML = tab_PT103[i]+" "+ "[bar]";
                l_PT110.innerHTML = tab_PT110[i]+" "+ "[bar]";
                l_PT205.innerHTML = tab_PT205[i]+" "+ "[bar]";

                return data;
}); 
edytowany 1x, ostatnio: smutny_grzegorz, 2015-03-09 18:26

Pozostało 580 znaków

2015-03-12 17:16
0

Po raz kolejny podbijam. Przeczytałem książka Pana Stoyanowa (Programowania Obiektowe Java Script), całkiem sporo ciekawych rzeczy się po niej dowiedziałem, jednak problemu w dalszym ciągu nie potrafię rozwiązać. Z rozdziału o DOM wynotowałem sobie, że:

Problem polega na tym, że jeśli wiele obserwatorów jest dołączonych do usuwanych elementów, IE nie usunie obserwatorów, co prowadzi do wycieków pamięci (przechowywane są referencje do nieistniejących elementów). Zaimplementuj ogólną funkcję, która usuwa węzły DOM , najpierw usuwając związanych z nimi obserwatorów. Możesz przejść iteracyjnie przez wszystkie atrybuty węzła, sprawdzając, czy wartość któregoś z nich nie jest funkcją. Jeśli jest, prawdopodobnie jest to atrybut podobny do oncl i ck. Musisz przypisać mu wartość nul 1 przed usunięciem danego elementu z drzewa.

Wrzuciłem na sterownik jedynie:

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="utf-8">
        <title>Web Server</title>
        <script src="jquery-2.1.3.min.js"></script>
        <link href="traci.css" type="text/css" rel="stylesheet" />
    </head>

    <body>
        <p><img class="Schematic" src="Traci.jpg" alt="zdjecie"></p>
        <label class="l_Name" id="l_Name">web</label>
        <label class="l_autor">autor</label>    

         <label class="l_TT101" id="l_TT101">TT101</label>
         <label class="l_TT102" id="l_TT102">TT102</label>
         <label class="l_TT103" id="l_TT103">TT103</label>
         <label class="l_TT104" id="l_TT104">TT104</label>
         <label class="l_TT105" id="l_TT105">TT105</label>
         <label class="l_TT106" id="l_TT106">TT106</label>
         <label class="l_TT110" id="l_TT110">TT110</label>
         <label class="l_TT205A" id="l_TT205A">TT205A</label>
         <label class="l_TT205B" id="l_TT205B">TT205B</label>
         <label class="l_TTEX01" id="l_TTEX01">TT_EX01</label>
         <label class="l_PT101" id="l_PT101">PT101</label>
         <label class="l_PT103" id="l_PT103">PT103</label>
         <label class="l_PT110" id="l_PT110">PT110</label>
         <label class="l_PT205" id="l_PT205">PT205</label>
         <label class="l_FT103" id="l_FT103">FT103</label>
         <label class="l_DP101" id="l_DP101">DP101</label>
         <label class="l_SC101" id="l_SC101">SC101</label>
         <label class="l_SC102" id="l_SC102">SC102</label>
         <label class="l_SC103" id="l_SC103">SC103</label>
         <label class="l_speed" id="l_speed">Speed</label>

         <label class="lt_TT101" id="lt_TT101">TT101:</label>
         <label class="lt_TT102" id="lt_TT102">TT102:</label>
         <label class="lt_TT103" id="lt_TT103">TT103:</label>
         <label class="lt_TT104" id="lt_TT104">TT104:</label>
         <label class="lt_TT105" id="lt_TT105">TT105:</label>
         <label class="lt_TT106" id="lt_TT106">TT106:</label>
         <label class="lt_TT110" id="lt_TT110">TT110:</label>
         <label class="lt_TT205A" id="lt_TT205A">TT205A:</label>
         <label class="lt_TT205B" id="lt_TT205B">TT205B:</label>
         <label class="lt_TT_EX01" id="lt_TT_EX01">TT_EX01:</label>
         <label class="lt_PT101" id="lt_PT101">PT101:</label>
         <label class="lt_PT103" id="lt_PT103">PT103:</label>
         <label class="lt_PT110" id="lt_PT110">PT110:</label>
         <label class="lt_PT205" id="lt_PT205">PT205:</label>
         <label class="lt_FT103" id="lt_FT103">FT103:</label>
         <label class="lt_DP101" id="lt_DP101">DP101:</label>
         <label class="lt_SC101" id="lt_SC101">SC101:</label>
         <label class="lt_SC102" id="lt_SC102">SC102:</label>
         <label class="lt_SC103" id="lt_SC103">SC103:</label>
         <label class="lt_speed" id="lt_speed">Speed:</label>
    </body>

    <script type="text/javascript">

    var i = 0; //iteration

    //T
    var tab_TT101=[];
    var tab_TT102=[];
    var tab_TT103=[];
    var tab_TT104=[];
    var tab_TT105=[];
    var tab_TT106=[];
    var tab_TT110=[];
    var tab_TT205A=[];
    var tab_TT205B=[];
    var tab_TTEX01=[];

    l_TT101=document.getElementById("l_TT101");
    l_TT102=document.getElementById("l_TT102");
    l_TT103=document.getElementById("l_TT103");
    l_TT104=document.getElementById("l_TT104");
    l_TT105=document.getElementById("l_TT105");
    l_TT106=document.getElementById("l_TT106");
    l_TT110=document.getElementById("l_TT110");
    l_TT205A=document.getElementById("l_TT205A");
    l_TT205B=document.getElementById("l_TT205B");
    l_TTEX01=document.getElementById("l_TTEX01");

    $(document).ready(function(){

        $.ajaxSetup({ cache: false });

        setInterval(function() {    

            $.getJSON("I_Temperatures.htm", function(data){     

                tab_TT101[i]=parseFloat(data.TT101);
                tab_TT102[i]=parseFloat(data.TT102);
                tab_TT103[i]=parseFloat(data.TT103);
                tab_TT104[i]=parseFloat(data.TT104);
                tab_TT105[i]=parseFloat(data.TT105);
                tab_TT106[i]=parseFloat(data.TT106);
                tab_TT110[i]=parseFloat(data.TT110);
                tab_TT205A[i]=parseFloat(data.TT205A);
                tab_TT205B[i]=parseFloat(data.TT205B);
                tab_TTEX01[i]=parseFloat(data.TTEX01);

                l_TT101.innerHTML = tab_TT101[i]+ " " + "°C";
                l_TT102.innerHTML = tab_TT102[i]+ " " + "°C";
                l_TT103.innerHTML = tab_TT103[i]+ " " + "°C";
                l_TT104.innerHTML = tab_TT104[i]+ " " + "°C";
                l_TT105.innerHTML = tab_TT105[i]+ " " + "°C";
                l_TT106.innerHTML = tab_TT106[i]+ " " + "°C";
                l_TT110.innerHTML = tab_TT110[i]+ " " + "°C";
                l_TT205A.innerHTML = tab_TT205A[i]+ " " + "°C";
                l_TT205B.innerHTML = tab_TT205B[i]+ " " + "°C";
                l_TTEX01.innerHTML = tab_TTEX01[i]+ " " + "°C";

                return data;

            }); 

            i++;

            if(i==100){
                tab_TT101.splice(0,tab_TT101.length);
                tab_TT102.splice(0,tab_TT102.length);
                tab_TT103.splice(0,tab_TT103.length);
                tab_TT104.splice(0,tab_TT104.length);
                tab_TT105.splice(0,tab_TT105.length);
                tab_TT106.splice(0,tab_TT106.length);
                tab_TT110.splice(0,tab_TT110.length);
                tab_TT205A.splice(0,tab_TT205A.length);
                tab_TT205B.splice(0,tab_TT205B.length);
                tab_TT_EX01.splice(0,tab_TT_EX01.length);
                i=0;
            }

        },1000);        
    });

    </script>

</html>

Załączam zdjęcia:

user image

I już tylko to mi zapełnia pamięć. Z porad rozumiem, że mam usunąć obserwatorów (nie mam ich, ale widze, że listeners cały czas rośnie), mam znaleźć węzły i usunąć ich atrybuty które mogą być funkcjami, ale ich również nie mam. Tzn, że powinienem usuwać każdego po załadowaniu tab_TTxxx?

Bardzo proszę, chociaż o naprowadzenie mnie na właściwe tory.

edytowany 1x, ostatnio: smutny_grzegorz, 2015-03-12 17:16

Pozostało 580 znaków

2015-03-12 22:09
1

Spróbuj nie korzystać z globali. Zamiast raz wybierać elementy DOM - wybieraj je za każdym razem w pętli. Pozbywaj się też danych, z których nie korzystasz.

Na razie zrób (możesz dodać te kolejne dane, ja tu tylko skracam, żeby przykład pokazać) np:

    $(document).ready(function(){
        $.ajaxSetup({ cache: false });
        setInterval(function() {     
            $.getJSON("I_Temperatures.htm", function(data){        
                var tab_TT101=parseFloat(data.TT101);
                var l_TT101=document.getElementById("l_TT101");

                l_TT101.innerHTML = tab_TT101+" *C";
            });    
        },1000);        
    });

Pozostało 580 znaków

2015-03-13 22:23
0

Wielkie dzięki za rady.
Jutro rano na pewno je przetestuje.
Usuwać dane z których nie korzystam wystarczy np.:

tab_TT101 = null;

Czy może lepiej?

delete tab_TT101;

Pozostało 580 znaków

2015-03-14 00:05
0

null


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0