From 120 to 800 MB of RAM usage in 5 minutes

(totally not a click bait)

Performance - INDUSTRY STAnDARDS (?)

what if your users spend hours, days, or even weeks without page reload?

WHAT If your app does that

WHAT If your app does that

memory leak- WHY?

  • not removed event listeners, RxJS subscriptions, endless state updates, timers ...
  • references kept in closure
  • circular references*
  • detached and not destroyed HTML nodes
  • overusing global scope

*circular references aren't the case in Mark and Sweep algorithm,

but there are edge cases for JS + DOM

speaking of which...

Profiling

profiling

performance monitor

memory api

    
    // window.performance.memory
   
    {
      totalJSHeapSize: 29400000,
      usedJSHeapSize: 15200000,
      jsHeapSizeLimit: 1530000000
    }
  • only in Chrome
  • requires flag
    --enable-precise-memory-info

synthetic memory tests

Memory snapshots

you can even ask your clients to send you a snapshot and analyze it ❤️

Memory snapshots comparison

przyklad, omowic retained vs shallow size

you can even ask your clients to send you their snapshots

🙈

it kinda felt like this

syntH. memory tests - before

syntH. memory tests - AFTER

real user

measurements

 

  • calculations are only approximate
  • yet another task that would slow down code execution on client's side

Manually calculate memory allocated on heap but:

long tasks


    const observer = new PerformanceObserver((list) => {
        const perfEntries = list.getEntries();
    
        // queue reporting for long tasks existance
    });
    
    observer.observe({entryTypes: ["longtask"]});
    
    // long task refers to occurrences of event loop tasks
    // or pauses caused by UI thread work
    // whose duration exceeds 50ms

long tasks

long tasks

  • No Firefox and Safari support
  • You can get the idea of what's happening in general 

fin

memory leaks @ hj

By Rafał Rumanek (truti)

memory leaks @ hj

  • 151