Skip to content

Fix memory leak in AbortSignal.any in environments with weak data structures #81

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

GeorgeTaveras1231
Copy link

@GeorgeTaveras1231 GeorgeTaveras1231 commented Mar 26, 2025

The current implementation of AbortSignal.any has two factors that lead to a memory leak

  1. Each time AbortSignal.any is called, it adds a new event handler to the given signals
  2. The abort event handler keeps a hard reference to the new "any" signal created, which does not allow the garbage collector to remove it from memory as long as the given signals are in memory.

The issue is apparent when you have a long-lived signal that is used as an argument to AbortSignal.any.

Solution

  1. Use EventTarget constructor if available. EventTarget uses a Set structure under the hood, so handlers are only added once
  2. Store the "any signals" in an iterable weak set on each signal. When a signal is aborted, iterate through all of its' "any signals" and abort them.

Debugging

I used the following script to visualize the memory issue

/* eslint-disable */

import { AbortController, AbortSignal } from './abortcontroller';

const controller = new AbortController();

setInterval(() => {
  console.log('Memory usage:', process.memoryUsage().heapUsed / 1024 / 1024, 'MB');
}, 1000);
setInterval(() => {

  // Force gc
  gc();

  for (let i = 0; i < 1000; i++) {
    AbortSignal.any([controller.signal]);
  }
});
node ./memory-leak.js --expose-gc

These are the logs from each implementation

Current implementation
Memory usage: 32.884498596191406 MB
Memory usage: 43.970985412597656 MB
Memory usage: 54.29621124267578 MB
Memory usage: 65.42012023925781 MB
Memory usage: 73.2559585571289 MB
Memory usage: 83.80862426757812 MB
Memory usage: 89.57674407958984 MB
Memory usage: 97.40546417236328 MB
Memory usage: 102.35001373291016 MB
Memory usage: 108.59725189208984 MB
Memory usage: 117.41264343261719 MB
Memory usage: 122.77072143554688 MB
Memory usage: 126.89059448242188 MB
Memory usage: 131.42245483398438 MB
Memory usage: 135.95431518554688 MB
Memory usage: 138.83822631835938 MB
Memory usage: 142.95809936523438 MB
Memory usage: 147.4927520751953 MB
Memory usage: 151.2006378173828 MB
Memory usage: 154.9085235595703 MB
Memory usage: 158.6164093017578 MB
Memory usage: 164.3890380859375 MB
Memory usage: 172.04300689697266 MB
Memory usage: 178.22281646728516 MB
Memory usage: 184.40262603759766 MB
Memory usage: 190.59125518798828 MB
Memory usage: 196.35907745361328 MB
Memory usage: 199.2488555908203 MB
Memory usage: 203.7807159423828 MB
Memory usage: 206.6646270751953 MB
Memory usage: 209.96585845947266 MB
Memory usage: 214.50165557861328 MB
Memory usage: 218.20954132080078 MB
Memory usage: 221.09345245361328 MB
Memory usage: 224.38935089111328 MB
Memory usage: 228.09723663330078 MB
Memory usage: 230.56916046142578 MB
Memory usage: 234.27704620361328 MB
Memory usage: 237.57962036132812 MB
Memory usage: 242.11148071289062 MB
Memory usage: 246.23135375976562 MB
Memory usage: 252.56246948242188 MB
Memory usage: 255.44638061523438 MB
Memory usage: 258.7422790527344 MB
Memory usage: 262.4501647949219 MB
Memory usage: 264.9220886230469 MB
Memory usage: 267.3942642211914 MB
Memory usage: 270.2781753540039 MB
Memory usage: 272.75392150878906 MB
Memory usage: 275.22584533691406 MB
Memory usage: 277.69776916503906 MB
Memory usage: 280.16969299316406 MB
Memory usage: 282.22962951660156 MB
Memory usage: 284.28956604003906 MB
Memory usage: 286.34950256347656 MB
Memory usage: 289.23341369628906 MB
Memory usage: 292.11732482910156 MB
Memory usage: 294.17726135253906 MB
Memory usage: 296.23719787597656 MB
Memory usage: 299.12110900878906 MB
Memory usage: 302.41700744628906 MB
Memory usage: 304.88893127441406 MB
Memory usage: 306.53688049316406 MB
Memory usage: 308.59681701660156 MB
Memory usage: 311.06874084472656 MB
Memory usage: 313.95265197753906 MB
Memory usage: 315.60060119628906 MB
Memory usage: 317.24855041503906 MB
Memory usage: 320.95643615722656 MB
Memory usage: 323.42835998535156 MB
Memory usage: 325.48829650878906 MB
Memory usage: 327.96022033691406 MB
Memory usage: 331.25611877441406 MB
Memory usage: 334.55201721191406 MB
Memory usage: 337.84791564941406 MB
Memory usage: 341.14381408691406 MB
Memory usage: 344.02772521972656 MB
Memory usage: 347.32362365722656 MB
Memory usage: 350.20753479003906 MB
Memory usage: 353.91542053222656 MB
Memory usage: 355.97535705566406 MB
Memory usage: 358.03529357910156 MB
Memory usage: 360.50721740722656 MB
Memory usage: 362.56715393066406 MB
Memory usage: 365.03907775878906 MB
Memory usage: 366.68702697753906 MB
Memory usage: 368.74696350097656 MB
Memory usage: 374.12376403808594 MB
Memory usage: 376.18370056152344 MB
Memory usage: 377.83164978027344 MB
Memory usage: 379.89158630371094 MB
Memory usage: 382.36351013183594 MB
Memory usage: 385.6656036376953 MB
Memory usage: 389.3734893798828 MB
Memory usage: 391.4334259033203 MB
Memory usage: 393.0813751220703 MB
Memory usage: 394.3173370361328 MB
Memory usage: 395.9652862548828 MB
Memory usage: 397.6149597167969 MB
Memory usage: 399.2629089355469 MB
Memory usage: 400.4997329711914 MB
Memory usage: 401.7356948852539 MB
Memory usage: 403.3836441040039 MB
Memory usage: 405.4435806274414 MB
Memory usage: 407.0915298461914 MB
Memory usage: 408.7394790649414 MB
Memory usage: 410.3874282836914 MB
Memory usage: 411.6233901977539 MB
Memory usage: 413.2713394165039 MB
Memory usage: 414.9192886352539 MB
Memory usage: 416.5672378540039 MB
Memory usage: 417.8031997680664 MB
Memory usage: 419.0391616821289 MB
Memory usage: 420.6871109008789 MB
Memory usage: 422.3350601196289 MB
Memory usage: 424.8069839477539 MB
Memory usage: 426.0429458618164 MB
Memory usage: 427.6908950805664 MB
Memory usage: 428.9268569946289 MB
Memory usage: 430.1628189086914 MB
Memory usage: 431.3987808227539 MB
Memory usage: 432.6347427368164 MB
Memory usage: 434.6946792602539 MB
Memory usage: 436.3426284790039 MB
Memory usage: 437.5785903930664 MB
Memory usage: 439.2265396118164 MB
Memory usage: 440.8744888305664 MB
Memory usage: 442.5224380493164 MB
Memory usage: 444.5833740234375 MB
Memory usage: 447.0552978515625 MB
Memory usage: 449.115234375 MB
Memory usage: 451.587158203125 MB
Memory usage: 454.05908203125 MB
Memory usage: 456.531005859375 MB
Memory usage: 458.178955078125 MB

Fixed implementation

Note: The expectation is that memory is released over time. The heap size never goes back to the original size but you should
notice subtle drops

Memory usage: 6.0558013916015625 MB
Memory usage: 6.1402435302734375 MB
Memory usage: 6.143280029296875 MB
Memory usage: 6.151092529296875 MB
Memory usage: 6.1779632568359375 MB
Memory usage: 6.1917266845703125 MB
Memory usage: 6.192024230957031 MB
Memory usage: 6.192985534667969 MB
Memory usage: 6.193687438964844 MB
Memory usage: 6.25994873046875 MB
Memory usage: 6.26373291015625 MB
Memory usage: 6.2659759521484375 MB
Memory usage: 6.2659759521484375 MB
Memory usage: 6.266304016113281 MB
Memory usage: 6.262626647949219 MB
Memory usage: 6.261177062988281 MB
Memory usage: 6.261177062988281 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.2652587890625 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.264991760253906 MB
Memory usage: 6.2652587890625 MB
Memory usage: 6.2647247314453125 MB
Memory usage: 6.271400451660156 MB
Memory usage: 6.271400451660156 MB
Memory usage: 6.271400451660156 MB
Memory usage: 6.271400451660156 MB
Memory usage: 6.271400451660156 MB
Memory usage: 6.271400451660156 MB
Memory usage: 6.271400451660156 MB
Memory usage: 6.271400451660156 MB
Memory usage: 6.2716522216796875 MB
Memory usage: 6.2716522216796875 MB
Memory usage: 6.275428771972656 MB
Memory usage: 6.275428771972656 MB
Memory usage: 6.2739715576171875 MB
Memory usage: 6.2744598388671875 MB
Memory usage: 6.2744598388671875 MB
Memory usage: 6.2744598388671875 MB
Memory usage: 6.274726867675781 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.284645080566406 MB
Memory usage: 6.284645080566406 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.284645080566406 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.284645080566406 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2843780517578125 MB
Memory usage: 6.2905731201171875 MB
Memory usage: 6.2905731201171875 MB
Memory usage: 6.2905731201171875 MB
Memory usage: 6.2905731201171875 MB
Memory usage: 6.290840148925781 MB
Memory usage: 6.2905731201171875 MB
Memory usage: 6.292564392089844 MB
Memory usage: 6.29229736328125 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293426513671875 MB
Memory usage: 6.293426513671875 MB
Memory usage: 6.293426513671875 MB
Memory usage: 6.293426513671875 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293426513671875 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.293159484863281 MB
Memory usage: 6.294158935546875 MB
Memory usage: 6.294158935546875 MB
Memory usage: 6.294158935546875 MB
Memory usage: 6.294158935546875 MB
Memory usage: 6.294425964355469 MB
Memory usage: 6.294158935546875 MB
Memory usage: 6.294158935546875 MB
Memory usage: 6.2949981689453125 MB
Memory usage: 6.2949981689453125 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.296348571777344 MB
Memory usage: 6.296348571777344 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.296348571777344 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.296348571777344 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.296348571777344 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.296348571777344 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.296348571777344 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.296348571777344 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.29608154296875 MB
Memory usage: 6.296348571777344 MB
Memory usage: 6.29608154296875 MB

Related issues

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant