• @Robin, I don't get what is messing with you...

    Memory not freeing up after call to E.getSizeOf() anomaly

    When you provide a depth parameter > 0 for E.getSizeOf(), you get JSON string back of object cluster, such as in the example output below. If you keep that in a variable, it eats up space as well until you assign something else to this variable. So no surprise you run out of memory...

    In "Memory evolution..." section towards the end of the console output you see what each of the components cost to establish. As you notice there are hidden things because the numbers do not straight add up. Nevertheless the figures are close enough to explain where and on what the emory is spent on.

    Since the memory tracking costs also memory, you have to adjust by it (mo - memory overhead - and you notice that it varies dependent on the length of the cmt comment assigned; cmt describes the activity that just happened to then show the increment in memory usage that activity did cost / consume in memory).

    var ms = [], m, pm = function(id,cmt) { 
        ms.push(m=process.memory());
        m.id=id; m.sz = 0; m.cmt = (cmt) ? cmt : "-"; m.sz = E.getSizeOf(m);
        m = undefined;
      };
    
    pm(0,"setup");
    
    // eGetSizeOfText.js
    // 
    // Explanation what E.getSizeOf() does and tells (on PICO_R1_3, 2v01)
    //
    // We will crate an object 'tree' - with no circular references (yet) -
    // and explore what E.getSizeOf() tells us about the tree / the
    // objects in the tree applying various depths. To observe memory
    // evolution, we collect process.memory() objects in ms
    //
    var rootObj
      , childAObj
      , childXyzObj
      , root2WLongNmeObj
      ;
    
    pm(1,"var declaration");
    
    function log() { console.log.apply(console,arguments); } // logger
    
    pm(2,"log function code");
    
    function onInit() {
    
      // create the folloging object 'tree' (nme shown):
      //
      //  root                           - has three children
      //  ^  |
      //  |  +--- childA                 - has no children
      //  |  +--- childXyz               - has no children
      //  |  '--- childC                 - has one child
      //  |       ^  |
      //  |       |  '--- childOfChildC  - has no children
      //  |       |       ^
      //  |       |       |
      //  |       |       '---- depth 3 / level 3 - relative to root
      //  |       '------------ depth 2 / level 2 - relative to root
      //  '-------------------- depty 1 / level 1 - relative to root
      //
      //  root2WLongNmeObj               - same sub structure as root
      //     |
      //     ...
    
    pm(3,"onInit() header");
      childOfChildCObj = { nme: "childOfChildC" , children: [] };
    pm(4,"childOfChildC");
      childAObj        = { nme: "childA"        , children: [] };
    pm(5,"childA");
      childXyzObj      = { nme: "childZyz"      , children: [] };
    pm(6,"childZyz");
      childCObj        = { nme: "childCwChild"  , children: [ childOfChildCObj ] };
    pm(7,"childCwChild");
      rootObj          = { nme: "root"          , children: [ childAObj, childXyzObj ] };
    pm(8,"root");
      root2WLongNmeObj = { nme: "root2WLongNme" , children: [ childAObj, childXyzObj ] };
    pm(9,"root2WLongNme");
    
      log("-----");
      log("a: E.getSizeOf(childOfChildC  ) =",E.getSizeOf(childOfChildCObj  ));
      log("b: E.getSizeOf(childOfChildC,1) =",E.getSizeOf(childOfChildCObj,1));
      log("c: E.getSizeOf(childOfChildC,2) =",E.getSizeOf(childOfChildCObj,2));
      log("d: E.getSizeOf(childOfChildC,3) =",E.getSizeOf(childOfChildCObj,3));
      log("-----");
      log("e: E.getSizeOf(childA         ) =",E.getSizeOf(childAObj         ));
      log("f: E.getSizeOf(childA       ,1) =",E.getSizeOf(childAObj       ,1));
      log("g: E.getSizeOf(childA       ,2) =",E.getSizeOf(childAObj       ,2));
      log("h: E.getSizeOf(childA       ,3) =",E.getSizeOf(childAObj       ,3));
      log("-----");
      log("i: E.getSizeOf(childXyz       ) =",E.getSizeOf(childXyzObj       ));
      log("j: E.getSizeOf(childXyz     ,1) =",E.getSizeOf(childXyzObj     ,1));
      log("k: E.getSizeOf(childXyz     ,2) =",E.getSizeOf(childXyzObj     ,2));
      log("l: E.getSizeOf(childXyz     ,3) =",E.getSizeOf(childXyzObj     ,3));
      log("-----");
      log("m: E.getSizeOf(childC         ) =",E.getSizeOf(childCObj         ));
      log("n: E.getSizeOf(childC       ,1) =",E.getSizeOf(childCObj       ,1));
      log("o: E.getSizeOf(childC       ,2) =",E.getSizeOf(childCObj       ,2));
      log("p: E.getSizeOf(childC       ,3) =",E.getSizeOf(childCObj       ,3));
      log("q: E.getSizeOf(childC       ,4) =",E.getSizeOf(childCObj       ,4));
      log("-----");
      log("r: E.getSizeOf(root           ) =",E.getSizeOf(rootObj           ));
      log("s: E.getSizeOf(root         ,1) =",E.getSizeOf(rootObj         ,1));
      log("t: E.getSizeOf(root         ,2) =",E.getSizeOf(rootObj         ,2));
      log("u: E.getSizeOf(root         ,3) =",E.getSizeOf(rootObj         ,3));
      log("v: E.getSizeOf(root         ,4) =",E.getSizeOf(rootObj         ,4));
      log("w: E.getSizeOf(root         ,5) =",E.getSizeOf(rootObj         ,5));
      log("-----");
      log("x: E.getSizeOf(root2WLongNme  ) =",E.getSizeOf(root2WLongNmeObj  ));
      log("y: E.getSizeOf(root2WLongNme,1) =",E.getSizeOf(root2WLongNmeObj,1));
      log("z: E.getSizeOf(root2WLongNme,2) =",E.getSizeOf(root2WLongNmeObj,2));
      log("@: E.getSizeOf(root2WLongNme,3) =",E.getSizeOf(root2WLongNmeObj,3));
      log("#: E.getSizeOf(root2WLongNme,4) =",E.getSizeOf(root2WLongNmeObj,4));
      log("$: E.getSizeOf(root2WLongNme,5) =",E.getSizeOf(root2WLongNmeObj,5));
      log("-----");
    
    pm(10,"print of all sizes");
    
    log("Memory evolution (mo = memory tracking overhead):");
    log(" # usage mo cost subject causing the cost");
    m = ms[0];
    log(("   "+m.id).substr(-4), (" "+m.usage).substr(-3), m.sz, m.free, m.cmt, m);
    ms.forEach(function(m,mdx,ms) { 
    log(("   "+m.id).substr(-4), (" "+m.usage).substr(-3), m.sz
      , ("     "+(((mdx === 0) ? m.total : (ms[mdx-1].free)) - m.free)).substr(-4), m.cmt);
    });
    m = ms[ms.length-1];
    log(("   "+m.id).substr(-4), (" "+m.usage).substr(-3), m.sz
      , ("     "+(ms[ms.length-2].free - m.free)).substr(-4), m.cmt, m);
    
    m = undefined;
    
    }
    
    pm(11,"onInit() code");
    
    setTimeout(onInit,500); // while dev'g
    
    pm(12,"setTimeout() to start code");
    

    Console output:

    >
     ____                 _
    |  __|___ ___ ___ _ _|_|___ ___
    |  __|_ -| . |  _| | | |   | . |
    |____|___|  _|_| |___|_|_|_|___|
             |_| espruino.com
     2v01 (c) 2018 G.Williams
    >
    -----
    a: E.getSizeOf(childOfChildC  ) = 7
    b: E.getSizeOf(childOfChildC,1) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 3 }
     ]
    c: E.getSizeOf(childOfChildC,2) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 3,
        "more": [  ]
       }
     ]
    d: E.getSizeOf(childOfChildC,3) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 3,
        "more": [  ]
       }
     ]
    -----
    e: E.getSizeOf(childA         ) = 6
    f: E.getSizeOf(childA       ,1) = [
      {
        "name": "nme",
        "size": 2 },
      {
        "name": "children",
        "size": 3 }
     ]
    g: E.getSizeOf(childA       ,2) = [
      {
        "name": "nme",
        "size": 2 },
      {
        "name": "children",
        "size": 3,
        "more": [  ]
       }
     ]
    h: E.getSizeOf(childA       ,3) = [
      {
        "name": "nme",
        "size": 2 },
      {
        "name": "children",
        "size": 3,
        "more": [  ]
       }
     ]
    -----
    i: E.getSizeOf(childXyz       ) = 6
    j: E.getSizeOf(childXyz     ,1) = [
      {
        "name": "nme",
        "size": 2 },
      {
        "name": "children",
        "size": 3 }
     ]
    k: E.getSizeOf(childXyz     ,2) = [
      {
        "name": "nme",
        "size": 2 },
      {
        "name": "children",
        "size": 3,
        "more": [  ]
       }
     ]
    l: E.getSizeOf(childXyz     ,3) = [
      {
        "name": "nme",
        "size": 2 },
      {
        "name": "children",
        "size": 3,
        "more": [  ]
       }
     ]
    -----
    m: E.getSizeOf(childC         ) = 15
    n: E.getSizeOf(childC       ,1) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 11 }
     ]
    o: E.getSizeOf(childC       ,2) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 11,
        "more": [
          {
            "name": "0",
            "size": 8 }
         ]
       }
     ]
    p: E.getSizeOf(childC       ,3) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 11,
        "more": [
          {
            "name": "0",
            "size": 8,
            "more": [
              {
                "name": "nme",
                "size": 3 },
              {
                "name": "children",
                "size": 3 }
             ]
           }
         ]
       }
     ]
    q: E.getSizeOf(childC       ,4) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 11,
        "more": [
          {
            "name": "0",
            "size": 8,
            "more": [
              {
                "name": "nme",
                "size": 3 },
              {
                "name": "children",
                "size": 3,
                "more": [  ]
               }
             ]
           }
         ]
       }
     ]
    -----
    r: E.getSizeOf(root           ) = 20
    s: E.getSizeOf(root         ,1) = [
      {
        "name": "nme",
        "size": 2 },
      {
        "name": "children",
        "size": 17 }
     ]
    t: E.getSizeOf(root         ,2) = [
      {
        "name": "nme",
        "size": 2 },
      {
        "name": "children",
        "size": 17,
        "more": [
          {
            "name": "0",
            "size": 7 },
          {
            "name": "1",
            "size": 7 }
         ]
       }
     ]
    u: E.getSizeOf(root         ,3) = [
      {
        "name": "nme",
        "size": 2 },
      {
        "name": "children",
        "size": 17,
        "more": [
          {
            "name": "0",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3 }
             ]
           },
          {
            "name": "1",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3 }
             ]
           }
         ]
       }
     ]
    v: E.getSizeOf(root         ,4) = [
      {
        "name": "nme",
        "size": 2 },
      {
        "name": "children",
        "size": 17,
        "more": [
          {
            "name": "0",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3,
                "more": [  ]
               }
             ]
           },
          {
            "name": "1",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3,
                "more": [  ]
               }
             ]
           }
         ]
       }
     ]
    w: E.getSizeOf(root         ,5) = [
      {
        "name": "nme",
        "size": 2 },
      {
        "name": "children",
        "size": 17,
        "more": [
          {
            "name": "0",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3,
                "more": [  ]
               }
             ]
           },
          {
            "name": "1",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3,
                "more": [  ]
               }
             ]
           }
         ]
       }
     ]
    -----
    x: E.getSizeOf(root2WLongNme  ) = 21
    y: E.getSizeOf(root2WLongNme,1) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 17 }
     ]
    z: E.getSizeOf(root2WLongNme,2) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 17,
        "more": [
          {
            "name": "0",
            "size": 7 },
          {
            "name": "1",
            "size": 7 }
         ]
       }
     ]
    @: E.getSizeOf(root2WLongNme,3) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 17,
        "more": [
          {
            "name": "0",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3 }
             ]
           },
          {
            "name": "1",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3 }
             ]
           }
         ]
       }
     ]
    #: E.getSizeOf(root2WLongNme,4) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 17,
        "more": [
          {
            "name": "0",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3,
                "more": [  ]
               }
             ]
           },
          {
            "name": "1",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3,
                "more": [  ]
               }
             ]
           }
         ]
       }
     ]
    $: E.getSizeOf(root2WLongNme,5) = [
      {
        "name": "nme",
        "size": 3 },
      {
        "name": "children",
        "size": 17,
        "more": [
          {
            "name": "0",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3,
                "more": [  ]
               }
             ]
           },
          {
            "name": "1",
            "size": 7,
            "more": [
              {
                "name": "nme",
                "size": 2 },
              {
                "name": "children",
                "size": 3,
                "more": [  ]
               }
             ]
           }
         ]
       }
     ]
    -----
    Memory evolution (mo = memory tracking overhead):
     # usage mo cost subject causing the cost
       0  51 31 5049 setup { "free": 5049, "usage": 51, "total": 5100, "history": 22,
      "gc": 0, "gctime": 5.80596923828, "stackEndAddress": 536958576, "flash_start": 134217728, "flash_binary_end": 384024,
      "flash_code_start": 134234112, "flash_length": 393216, "id": 0, "sz": 31,
      "cmt": "setup"
     }
       0  51 31   51 setup
       1  93 32   42 var declaration
       2 134 32   41 log function code
      11 391 32  257 onInit() code
      12 432 33   41 setTimeout() to start code
       3 463 32   31 onInit() header
       4 505 32   42 childOfChildC
       5 543 31   38 childA
       6 581 31   38 childZyz
       7 624 32   43 childCwChild
       8 664 31   40 root
       9 706 32   42 root2WLongNme
      10 742 32   36 print of all sizes
      10 742 32   36 print of all sizes { "free": 4358, "usage": 742, "total": 5100, "history": 411,
      "gc": 0, "gctime": 6.39057159423, "stackEndAddress": 536958576, "flash_start": 134217728, "flash_binary_end": 384024,
      "flash_code_start": 134234112, "flash_length": 393216, "id": 10, "sz": 32,
      "cmt": "print of all sizes"
     }
    > 
    
  • Sun 2019.02.03

    Thank you @Gordon for the clarification in #13   That and @allObjects eGetSizeOfText.js should make things clearer.


    '@Robin, I don't get what is messing with you...'
    'Memory not freeing up after call to E.getSizeOf() anomaly'

    'If you keep that in a variable, it eats up space'

    Over thinking perhaps?   When E.getSizeOf() is used as a command in the console left pane, and is able to complete (depth) without error, it is as a status indicator, writes it's output to the Window and no JsVars are used.

    In the case when there isn't sufficient memory to create the output, as when I attempted to recurse a large class instance and at depth level two, although some level data was displayed, the function crapped out mid-way, finishing with the low memory error and cluttering memory. (maybe garbage collection doesn't/isn't occur?)

    I'm modifing eGetSizeOfText.js to see what else I can glean from under the hood. Thanks for cranking that out.

About

Avatar for allObjects @allObjects started