Skip to content

fetch memory leak #3895

@styfle

Description

@styfle

Bug Description

undici.fetch() continues to use more memory the more requests made

Reproducible By

Run npm add [email protected] to install undici and then run the following code:

const { fetch } = require('undici');
async function main() {
  for (var i = 0; i <= 5000; i++) {
    const res = await fetch(`https://jsonplaceholder.typicode.com/photos/${i}`);
    if (i % 50 === 0) {
      console.log({
        i: i.toString().padStart(4, '0'),
        status: res.status,
        mem: process.memoryUsage.rss().toString().padStart(9, '0')
      });
    }
  }
}
main().catch(console.error);

Expected Behavior

Sometime during the 5000 requests, we should see memory decrease, preferably back down to the initial size around 90MB. Instead we see memory continue to increase up to 136MB.

Logs & Screenshots

Here is the resulting output:

{ i: '0000', status: 404, mem: '069959680' }
{ i: '0050', status: 200, mem: '090046464' }
{ i: '0100', status: 200, mem: '093208576' }
{ i: '0150', status: 200, mem: '095010816' }
{ i: '0200', status: 200, mem: '089260032' }
{ i: '0250', status: 200, mem: '092127232' }
{ i: '0300', status: 200, mem: '094109696' }
{ i: '0350', status: 200, mem: '096436224' }
{ i: '0400', status: 200, mem: '098844672' }
{ i: '0450', status: 200, mem: '099696640' }
{ i: '0500', status: 200, mem: '099713024' }
{ i: '0550', status: 200, mem: '100122624' }
{ i: '0600', status: 200, mem: '100597760' }
{ i: '0650', status: 200, mem: '102858752' }
{ i: '0700', status: 200, mem: '104398848' }
{ i: '0750', status: 200, mem: '109363200' }
{ i: '0800', status: 200, mem: '109363200' }
{ i: '0850', status: 200, mem: '109379584' }
{ i: '0900', status: 200, mem: '109379584' }
{ i: '0950', status: 200, mem: '108904448' }
{ i: '1000', status: 200, mem: '110575616' }
{ i: '1050', status: 200, mem: '111411200' }
{ i: '1100', status: 200, mem: '112132096' }
{ i: '1150', status: 200, mem: '112132096' }
{ i: '1200', status: 200, mem: '112148480' }
{ i: '1250', status: 200, mem: '112771072' }
{ i: '1300', status: 200, mem: '112836608' }
{ i: '1350', status: 200, mem: '112836608' }
{ i: '1400', status: 200, mem: '113147904' }
{ i: '1450', status: 200, mem: '113147904' }
{ i: '1500', status: 200, mem: '116752384' }
{ i: '1550', status: 200, mem: '118652928' }
{ i: '1600', status: 200, mem: '118669312' }
{ i: '1650', status: 200, mem: '119226368' }
{ i: '1700', status: 200, mem: '120111104' }
{ i: '1750', status: 200, mem: '120487936' }
{ i: '1800', status: 200, mem: '120487936' }
{ i: '1850', status: 200, mem: '120602624' }
{ i: '1900', status: 200, mem: '120684544' }
{ i: '1950', status: 200, mem: '120684544' }
{ i: '2000', status: 200, mem: '121733120' }
{ i: '2050', status: 200, mem: '121749504' }
{ i: '2100', status: 200, mem: '121749504' }
{ i: '2150', status: 200, mem: '121798656' }
{ i: '2200', status: 200, mem: '122748928' }
{ i: '2250', status: 200, mem: '122912768' }
{ i: '2300', status: 200, mem: '122929152' }
{ i: '2350', status: 200, mem: '122994688' }
{ i: '2400', status: 200, mem: '125403136' }
{ i: '2450', status: 200, mem: '126337024' }
{ i: '2500', status: 200, mem: '126353408' }
{ i: '2550', status: 200, mem: '126353408' }
{ i: '2600', status: 200, mem: '126353408' }
{ i: '2650', status: 200, mem: '126353408' }
{ i: '2700', status: 200, mem: '126369792' }
{ i: '2750', status: 200, mem: '126369792' }
{ i: '2800', status: 200, mem: '126500864' }
{ i: '2850', status: 200, mem: '126517248' }
{ i: '2900', status: 200, mem: '126517248' }
{ i: '2950', status: 200, mem: '126795776' }
{ i: '3000', status: 200, mem: '126828544' }
{ i: '3050', status: 200, mem: '127746048' }
{ i: '3100', status: 200, mem: '128286720' }
{ i: '3150', status: 200, mem: '128319488' }
{ i: '3200', status: 200, mem: '128319488' }
{ i: '3250', status: 200, mem: '128319488' }
{ i: '3300', status: 200, mem: '128319488' }
{ i: '3350', status: 200, mem: '128319488' }
{ i: '3400', status: 200, mem: '128319488' }
{ i: '3450', status: 200, mem: '128319488' }
{ i: '3500', status: 200, mem: '128335872' }
{ i: '3550', status: 200, mem: '128335872' }
{ i: '3600', status: 200, mem: '128335872' }
{ i: '3650', status: 200, mem: '128335872' }
{ i: '3700', status: 200, mem: '128335872' }
{ i: '3750', status: 200, mem: '128352256' }
{ i: '3800', status: 200, mem: '128352256' }
{ i: '3850', status: 200, mem: '128614400' }
{ i: '3900', status: 200, mem: '128663552' }
{ i: '3950', status: 200, mem: '128663552' }
{ i: '4000', status: 200, mem: '128663552' }
{ i: '4050', status: 200, mem: '128663552' }
{ i: '4100', status: 200, mem: '128679936' }
{ i: '4150', status: 200, mem: '129253376' }
{ i: '4200', status: 200, mem: '129253376' }
{ i: '4250', status: 200, mem: '129253376' }
{ i: '4300', status: 200, mem: '129253376' }
{ i: '4350', status: 200, mem: '129253376' }
{ i: '4400', status: 200, mem: '130236416' }
{ i: '4450', status: 200, mem: '130236416' }
{ i: '4500', status: 200, mem: '130236416' }
{ i: '4550', status: 200, mem: '130940928' }
{ i: '4600', status: 200, mem: '133595136' }
{ i: '4650', status: 200, mem: '134709248' }
{ i: '4700', status: 200, mem: '134709248' }
{ i: '4750', status: 200, mem: '134725632' }
{ i: '4800', status: 200, mem: '134725632' }
{ i: '4850', status: 200, mem: '134758400' }
{ i: '4900', status: 200, mem: '136708096' }
{ i: '4950', status: 200, mem: '136708096' }
{ i: '5000', status: 200, mem: '136708096' }

Environment

  • macOS 15.1.1
  • Node.js 22.11.0

Additional context

The repeated values are suspicious so perhaps I'm doing something wrong.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions