sandwichfarm / nostr-watch

nostr registry and monitor web-client
https://nostr.watch
MIT License
181 stars 483 forks source link

Memory leak on favorites (and relays and statistics) #243

Closed dskvr closed 11 months ago

dskvr commented 1 year ago

Describe the bug Browser crashes when clicking 'favorites'

To Reproduce Steps to reproduce the behavior: click favorites

Expected behavior Doesn't crash

Screenshots Screen Shot 2023-01-27 at 12 41 49 AM

Desktop (please complete the following information): Chrome, Firefox, Brave

Smartphone (please complete the following information): None, works on Mobile

Additional context Doesn't occur locally

dskvr commented 1 year ago

Somehow introduced a memory leak in the merge... Was memleak tested before shipping. Weird.

dskvr commented 1 year ago

One down. before

TEST RESULTS

--------------------

Test         : Go to /relays and back
Memory change: +628 kB
Leak detected: Yes

Leaking objects:

╔═══════════════════════╤═════════╤════════════════════════╗
║ Object                │ # added │ Retained size increase ║
╟───────────────────────┼─────────┼────────────────────────╢
║ D                     │ 11      │ +136 kB                ║
╟───────────────────────┼─────────┼────────────────────────╢
║ WebSocket             │ 11      │ +12.2 kB               ║
╟───────────────────────┼─────────┼────────────────────────╢
║ n                     │ 11      │ +15.1 kB               ║
╟───────────────────────┼─────────┼────────────────────────╢
║ Element               │ 38      │ +3.35 kB               ║
╟───────────────────────┼─────────┼────────────────────────╢
║ EventListener         │ 44      │ +6.17 kB               ║
╟───────────────────────┼─────────┼────────────────────────╢
║ V8EventHandlerNonNull │ 44      │ +3 kB                  ║
╟───────────────────────┼─────────┼────────────────────────╢
║ Object                │ 999     │ +507 kB                ║
╚═══════════════════════╧═════════╧════════════════════════╝

Leaking DOM nodes (+152.85714285714286 total):

╔═════════════╤═══════════════════╗
║ Description │ # added           ║
╟─────────────┼───────────────────╢
║ span        │ 90.42857142857143 ║
╚═════════════╧═══════════════════╝

--------------------

after

TEST RESULTS

--------------------

Test         : Go to /relays and back
Memory change: -26.4 kB
Leak detected: No

Leaking objects:

╔═══════════╤═════════╤════════════════════════╗
║ Object    │ # added │ Retained size increase ║
╟───────────┼─────────┼────────────────────────╢
║ Generator │ 1       │ +168 B                 ║
╚═══════════╧═════════╧════════════════════════╝

Leaking DOM nodes (+27.142857142857142 total):

╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╤═════════════════════╗
║ Description                                                                                                              │ # added             ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span                                                                                                                     │ 18.142857142857142  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ tr.loaded.bg-gray-50.hover:bg-slate-200.dark:bg-transparent.dark:hover:bg-slate-200/5.xl:text-xl.xl:h-9.h-1              │ 3.7142857142857144  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.w-4.h-4.bg-green-500.ml-2.block.relative                                                                            │ 1.8571428571428572  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.verified-shape-wrapper.cursor-pointer                                                                               │ 2.7142857142857144  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.shape.verified                                                                                                      │ 2.7142857142857144  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.text-green-600/100.dark:text-green-600/80                                                                           │ 2.5714285714285716  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.m-auto.block.bg-green-500.text-xl.m-auth.h-5.w-5.rounded-2xl                                                        │ 4.142857142857143   ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.m-auto.block.align-middle.bg-green-500.text-xl.m-auth.h-5.w-5.rounded-2xl                                           │ 5.142857142857143   ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ tr.loaded.bg-slate-100.bg-gray-50.hover:bg-slate-200.dark:bg-transparent.dark:hover:bg-slate-200/5.xl:text-xl.xl:h-9.h-1 │ 3.857142857142857   ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.w-4.h-4.bg-orange-500.ml-2.block.relative                                                                           │ 2.2857142857142856  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.m-auto.block.align-middle.bg-red-500.text-xl.m-auth.h-5.w-5.rounded-2xl                                             │ 10                  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.text-green-600/80.dark:text-green-400/50                                                                            │ 0.2857142857142857  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.text-orange-500                                                                                                     │ 0.14285714285714285 ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.text-red-400.dark:text-red-600                                                                                      │ 0.5714285714285714  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.w-4.h-4.bg-red-500.ml-2.block.relative                                                                              │ 3.4285714285714284  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────╢
║ span.m-auto.block.bg-red-500.text-xl.m-auth.h-5.w-5.rounded-2xl                                                          │ 3.4285714285714284  ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╧═════════════════════╝

Leaking collections:

╔═══════╤════════╤════════════╤══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ Type  │ Change │ Preview    │ Size increased at                                                                                                                                                                                                                                                                                                                                ║
╟───────┼────────┼────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║ Array │ +11    │ [Set, ...] │ trackEffects               webpack-internal:///./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js:326:23                                                                                                                                                                                                                              ║
║       │        │            │ track                      webpack-internal:///./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js:310:5                                                                                                                                                                                                                               ║
║       │        │            │ Object.get                 webpack-internal:///./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js:499:7                                                                                                                                                                                                                               ║
║       │        │            │ Proxy.eval                 webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/components/relays/blocks/MapSummary.vue?vue&type=script&lang=js:144:32                                                                                         ║
║       │        │            │ eval                       webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[3]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/components/relays/blocks/MapSummary.vue?vue&type=template&id=f7794994&scoped=true:65:21  ║
║       │        │            │ renderList                 webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:2951:16                                                                                                                                                                                                                         ║
║       │        │            │ eval                       webpack-internal:///./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[3]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/components/relays/blocks/MapSummary.vue?vue&type=template&id=f7794994&scoped=true:59:216 ║
║       │        │            │ Proxy.renderFnWithContext  webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:933:13                                                                                                                                                                                                                          ║
║       │        │            │ Proxy.render               webpack-internal:///./node_modules/@vue-leaflet/vue-leaflet/dist/vue-leaflet.esm.js:1993:40                                                                                                                                                                                                                           ║
╚═══════╧════════╧════════════╧══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

--------------------

Still have more to do but at least the browser won't crash.

dskvr commented 1 year ago

The statistics leak is likely related to a method in the DOM.