hotti: Lebensdauer von Objekten und Variablen

Mahlzeit,

in Perl isses ja so nach meinem Verständnis, dass funktionsinterne Variablen nach dem Verlassen einer Subfunktion sterben, d.h., dass auch der MEM wieder freigegeben wird.

Ist das in JS auch so?

Hotte

  1. [latex]Mae  govannen![/latex]

    in Perl isses ja so nach meinem Verständnis, dass funktionsinterne Variablen nach dem Verlassen einer Subfunktion sterben, d.h., dass auch der MEM wieder freigegeben wird.

    Ist das in JS auch so?

    Generell schon, wenn die Variable nicht in einer Closure bewahrt wird und der Referenz-Zähler auf diese Variable auf 0 ist. Allerdings ist keine verbindliche Spezifikation für die Durchführung der Garbage-Collection vorgegreben, d.h. die Browserhersteller müssen sich selber darum kümmern (was natürlich dazu geführt hat, daß Microsoft es beim IE6 versaut hat und dieser bei zirkulären Referenzen den Speicher nie mehr freigibt. Siehe auch die FAQ von c.l.j.

    Cü,

    Kai

    --
    A workaround for an avoidable problem often adds clutter and overhead to the program which
    could have been avoided by not creating the problem in the first place.(Garrett Smith/clj)
    Foren-Stylesheet Site Selfzeug JS-Lookup
    SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
    1. hi,

      [..], daß Microsoft es beim IE6 versaut hat und dieser bei zirkulären Referenzen den Speicher nie mehr freigibt. Siehe auch die FAQ von c.l.j.

      Das habch mir schon gedacht ;-)

      Danke für die Info,
      Horst Hunger

      1. Das habch mir schon gedacht ;-)

        Jetzt verwirrst du mich, mir ist diese Problematik noch nie über dem Weg gelaufen (ausser dass ich darüber gelesen habe), wo hast du dieses Verhalten den bemerkt?

        Struppi.

        1. Das habch mir schon gedacht ;-)

          Jetzt verwirrst du mich, mir ist diese Problematik noch nie über dem Weg gelaufen (ausser dass ich darüber gelesen habe), wo hast du dieses Verhalten den bemerkt?

          Ich meinte, das war klar, dass der IE mal wieder Zicken macht. Hab letztens einen Bug gefunden, das hat mich 2 Tage Zeit gekostet.

          Vieße Grüle,
          Horst Zickenschulze

          1. Ich meinte, das war klar, dass der IE mal wieder Zicken macht.

            Was für Zicken denn? so wie du deine Frage gestellt hast, klingt das ja so, als ob der Speicher voll gelaufen ist. Sowas ist mir aber noch nicht passiert (und wenn habe ich Speicherprobleme eher mit Firefox).

            Struppi.

            1. Ich meinte, das war klar, dass der IE mal wieder Zicken macht.

              Was für Zicken denn? so wie du deine Frage gestellt hast, klingt das ja so, als ob der Speicher voll gelaufen ist. Sowas ist mir aber noch nicht passiert (und wenn habe ich Speicherprobleme eher mit Firefox).

              Vollgelaufen ist bei mir nichts ;-9

              Ne, war nuhrso.ne Frage. Mach Dir keine Sorgen um mich.

              Vieße Grüle,
              Horst

            2. Ich meinte, das war klar, dass der IE mal wieder Zicken macht.

              Was für Zicken denn?

              /* Prüfe Session */

              Es ist ein 'ü' in iso-8859-1 in der Kommentar(!)zeile. IE vermeldet irreführende Statements ("Objekt erwaret...") und verweigert die weitere Ausführung von JS wenn die Seite in utf-8 ausgeliefert wird. Das Problem ist mit IE6 reproduzierbar. Der Witz: // Blümchen machen keine Probleme

              Horst

              --
              In meine Kommentare schreibe ich was ich wüll!
              1. Es ist ein 'ü' in iso-8859-1 in der Kommentar(!)zeile. IE vermeldet irreführende Statements ("Objekt erwaret...") und verweigert die weitere Ausführung von JS wenn die Seite in utf-8 ausgeliefert wird. Das Problem ist mit IE6 reproduzierbar. Der Witz: // Blümchen machen keine Probleme

                Das Problem hattest du doch erst vor kurzem schon mal (und ich kenne es auch zu genüge), aber mit deiner Frage hat es überhaupt nichts zu tun.

                Struppi.

                1. hi,

                  Das Problem hattest du doch erst vor kurzem schon mal (und ich kenne es auch zu genüge), aber mit deiner Frage hat es überhaupt nichts zu tun.

                  Jetzt passe mal off, Du: Meine Probleme haben alle irgendwie miteinander, untereinander, übereinander, nebeneinander und nacheinander miteinander was zu tun. Ist das Klar!?

                  Schön, dass Du da bist ;-)

                  Viele Grüße an Elle,
                  Rolf

      2. hi,

        [..], daß Microsoft es beim IE6 versaut hat und dieser bei zirkulären Referenzen den Speicher nie mehr freigibt. Siehe auch die FAQ von c.l.j.

        Das habch mir schon gedacht ;-)

        Bist du immer noch beim Chat?

        Dieser erzeugt bei jedem Request ein neues Objekt, immer und immer wieder. Obwohl du hier mit einem einzigen Request Objekt auskommen könntest. Problematisch wird das, dass du bei jedem abschicken des Formular ein neues Request Objekt erzeugst ohne das das vorherige fertig ist. Ich kann mir vorstellen, dass da der IE irgendwann rumzickt. Aber wie gesagt, einfacher wäre die ganze Sache mit einem einzigen Objekt.

        Struppi.

        1. Dieser erzeugt bei jedem Request ein neues Objekt, immer und immer wieder. Obwohl du hier mit einem einzigen Request Objekt auskommen könntest. Problematisch wird das, dass du bei jedem abschicken des Formular ein neues Request Objekt erzeugst ohne das das vorherige fertig ist. Ich kann mir vorstellen, dass da der IE irgendwann rumzickt. Aber wie gesagt, einfacher wäre die ganze Sache mit einem einzigen Objekt.

          Ob einfacher oder nicht, darüber kann man getrennter Meinung sein. Eleganter finde ich die Variante mit dem lokalen XHR, aber darüber kann man auch streiten.
          Auf jeden Fall ist es so, dass man dem IE zwar auf die Sprünge helfen muss, er dann aber auch den Speicher für das XHR-Objekt wieder freigibt.

            
          var count = 0;  
          function xhr(url) {  
            var request=null;  
            if(window.ActiveXObject){  
              request=new ActiveXObject("Microsoft.XMLHTTP");  
            }  
            else if(window.XMLHttpRequest){  
              request=new XMLHttpRequest();  
            }  
            request.open("GET", url, true);  
            request.onreadystatechange=function(){  
              if(request.readyState==4){  
                document.getElementById("count").innerHTML=++count;  
                delete request;  
                request=null  
              }  
            }  
            request.send(null);  
          }  
            
          window.onload=function(){setInterval(function(){xhr("xhr.xhr");},500);};  
          
          
          1. Hallo unknown,

            delete request;
                  request=null

            kannst du mal erklären, warum du das Objekt erst löscht, und ihm dann den Wert null zuweist?

            Gruß, Jürgen

            1. Hallo,

              delete request;
                    request=null

              kannst du mal erklären, warum du das Objekt erst löscht, und ihm dann den Wert null zuweist?

              Ja, seltsam. "Doppelt hält besser" gilt in dem Fall wohl nicht.
              Der Code ist äquivalent zu
              request = nix||null; // oder was immer, Hauptsache weg ;)

              Gruß, Don P

  2. in Perl isses ja so nach meinem Verständnis, dass funktionsinterne Variablen nach dem Verlassen einer Subfunktion sterben, d.h., dass auch der MEM wieder freigegeben wird.

    Ist es so? Ich glaube es ist wesentlich komplizierter (genauso wie in JS).

    Ist das in JS auch so?

    Warum fragst du?

    Struppi.

    1. hi,

      Warum fragst du?

      Ach ich wollte nur mal wissen, obs Dich noch gibt ;-)

      Horst

      --
      JavaScript ist geil.
      1. Warum fragst du?

        Ach ich wollte nur mal wissen, obs Dich noch gibt ;-)

        Das glaub ich dir nicht.

        Struppi.

      2. Hi,

        Warum fragst du?

        Ach ich wollte nur mal wissen, obs Dich noch gibt ;-)

        Kannst du dir dieses Verhalten nicht langsam mal abgewöhnen?

        Das ist bei dir in letzter Zeit so häufig, dass du fachliche absolut berechtigte Anmerkungen/Rückfragen ignorierst, und stattdessen irgendeinen Blödsinn antwortest.

        Wenn du an fachlichen Diskussionen zur Erweiterung des eigenen Tellerrandes nicht interessiert bist, dann sag das doch bitte klipp und klar. Dann kann ich deine Threads künftig einfach ignorieren.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Hi Chris,

          Warum fragst du?

          Ach ich wollte nur mal wissen, obs Dich noch gibt ;-)

          Kannst du dir dieses Verhalten nicht langsam mal abgewöhnen?

          Klar doch. Es ist halt manchmal so, dass ich die Frage nicht verstanden habe und meine Antwort dann blödsinnig erscheint. Ich bin übrigens nicht der Einzige, der Struppis Posts/Rückfragen nicht versteht, um eine Antwort jedoch bin ich schon bemüht.

          Aber irgendwie hab ich generell das Gefühl, dass mir die Arbeit mit diesem Forum hier keinen Spaß mehr macht. Immerhin ist neulich ein Post von mir, in dem ich eine fachliche Frage "zu diesem Forum" stellte, einfach so gelöscht worden. Das finde ich bedauerlich.

          Viele Grüße,
          Rolf

          1. Hi,

            Klar doch. Es ist halt manchmal so, dass ich die Frage nicht verstanden habe und meine Antwort dann blödsinnig erscheint.

            Du willst mir doch nicht erzählen, dass wenn du auf eine Rückfrage, die offensichtlich wissen will, warum sich dir diese Frage stellt (weil vermutlich gute Aussicht besteht, dass man dir gezielter weiterhelfen kann, wenn mehr über die Umgebung, in der diese Fragestellung auftaucht, weiss), mit

            Ach ich wollte nur mal wissen, obs Dich noch gibt ;-)

            antwortest, nur mir das subjektiv blödsinnig erscheint?

            Ich bin übrigens nicht der Einzige, der Struppis Posts/Rückfragen nicht versteht

            Ich verstehe die Motivation dahinter hingegen ziemlich gut.
            Und wer die Rückfrage an sich nicht versteht - der sollte vielleicht eher bitten, dass sie ihm noch mal erklärt werden möge, anstatt eine Quark-mit-Smilie-hinten-dran-Antwort zu geben.

            Aber irgendwie hab ich generell das Gefühl, dass mir die Arbeit mit diesem Forum hier keinen Spaß mehr macht. Immerhin ist neulich ein Post von mir, in dem ich eine fachliche Frage "zu diesem Forum" stellte, einfach so gelöscht worden. Das finde ich bedauerlich.

            Warum ging's denn dabei?

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
          2. Klar doch. Es ist halt manchmal so, dass ich die Frage nicht verstanden habe und meine Antwort dann blödsinnig erscheint. Ich bin übrigens nicht der Einzige, der Struppis Posts/Rückfragen nicht versteht, ...

            Was heißt das?
            Ich versuche deine Fragestelung nachzuvollziehen und habe Vermutungen, was du eigentlich wissen willst, das geht aber nur, weil ich die anderen Fragen von dir kenne. Ich versuche rauszufinden, was die Motivation der Frage ist.

            Stattdessen stellst sich dann raus, dass es lediglich an der Umstellung von ISO auf UTF lag. Das Problem kenne ich nur zu genüge, da ich ebenfalls schwer damit zu kämpfen hatte. Hätte dir also auch dahingehend u.U. einen Rat geben können - Nur - deine Frage hatte nichts mit dieser Problematik zu tun. Und jetzt stellst du dich hin und meinst meine Nachfragen nicht zu verstehen?

            Ich finde es ziemlich dreist, wie du meine Bemühungen deine Probleme zu verstehen darstellst und so tust, als ob es ein Problem meiner Nachfragen wäre. Das auch andere nicht auf meine Nachfragen eingehen ist normal, da habe ich mich dran gewöhnt, aber das du als Stammposter nicht erkennst, dass dahinter die Motivation steht, deine Probleme verstehen zu wollen, ist traurig.

            Struppi.

  3. in Perl isses ja so nach meinem Verständnis, dass funktionsinterne Variablen nach dem Verlassen einer Subfunktion sterben, d.h., dass auch der MEM wieder freigegeben wird.

    Jein.

    sub somefunc{

    return [];

    }

    wird erst nach exit freigegeben.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische