If you run Puppeteer in production long enough, you eventually meet the same graph: resident memory climbing steadily over hours, flat under test, until a container hits its limit and the OOM killer takes it. The short version is that Puppeteer memory leaks in production are almost never a single bug. They are three problems stacked on top of each other, and the fix is a combination of hygiene, bounding, and an honest question about whether you should be running Chromium at all.
This post covers all three: what actually leaks, the fixes people ship (and keep shipping), how to find the real source instead of guessing, and the case for handing the whole thing off when your only job is a screenshot.
The short answer
Close everything. Every page and BrowserContext you open must be closed in a finally block, on every path including timeouts and throws. Leaked pages are leaked renderer processes.
Treat Chromium as disposable. A long-lived browser accumulates state it never fully releases. Recycle it after a fixed number of jobs instead of keeping one alive forever.






