Something is eating your memory. Find out who: helpers, renderers, and all.
↑ this terminal is live. Click the flags to run each mode. --watch actually watches.
Prebuilt binaries, no Go required. Pick your platform; on a Mac, brew is the one you want.
brew install cicerothoma/tap/memhogs
# download the .deb from the latest release, then
sudo dpkg -i memhogs_*.deb
sudo rpm -i memhogs-*.rpm # Fedora / RHEL sudo apk add --allow-untrusted memhogs_*.apk # Alpine
go install github.com/cicerothoma/memhogs@latest
On Linux, use the packages above or a tarball. Tarballs for every platform are on the releases page, and the README walks through every option.
On a phone? There is an Android app too, with its own install walkthrough below.
Watch what happens when 17 anonymous processes meet a process tree.
17 processes. Which app owns what? Good luck: one of them is a browser named stable.
Walks the process tree so every helper, renderer, and language server rolls up into the app that spawned it. One app, one row, one total.
Resolves the .app bundle on macOS and the systemd unit on Linux. Warp shows up as Warp, not as a binary called stable.
Memory footprint on macOS (the Activity Monitor metric), PSS on Linux. Shared memory is never counted twice. Plain RSS is one flag away.
The tree walk stops at interactive shells, so the 4 GiB training run you launched from a terminal tab shows as python3, not as your terminal.
JSON output with raw byte counts for dashboards and alerts. Filter by name, cap the list, or watch it live.
One static binary for macOS and Linux, amd64 and arm64. No runtime, no config, no dependencies.
Run memhogs and read the top of the list. Everything else is a flag, and every mode below is runnable in the live terminal at the top of this page.
memhogsEvery app and service, largest first. Groups expand to their five biggest processes; the footer tells you the metric and the machine total.
memhogs --compactOne row per app, no member processes. The quickest answer to "who is eating my RAM".
memhogs --treeEvery member process of every group, when you need to know which renderer is the 2 GiB one.
memhogs --flatRaw processes ranked like top, but with real names and the fair metric.
memhogs slackAny extra word filters by name, case-insensitive. Works with every mode.
memhogs --watchFull-screen live view, like top: repaints in place, fits your window, restores the terminal on ctrl-c. --interval 5s changes the pace.
memhogs --jsonThe full structure with raw byte counts, for scripts, dashboards, and alerts.
memhogs --rssSwitches to the number ps and top report, for comparing against those tools.
Full documentation, with real captured outputs for every command, lives in the README.
The same idea in your pocket: every app ranked by honest memory, helpers grouped under the app that owns them, and a safe reclaim button that reports exactly how much came back.
Reclaim kills background processes only, the same thing Android does under memory pressure, so nothing you have open is touched. Without Shizuku the app still shows the device-wide gauge.
"How much memory is that app using?" has several honest answers. Here is what the abbreviations mean and why the tools disagree.
A process reserves a large range of addresses (its virtual memory), but only some of that is real. Pages it has actually touched sit in RAM; pages it shares with other processes (system libraries, or an Electron framework mapped into every renderer) sit in RAM once, no matter how many processes use them; rarely-touched pages get compressed in place or swapped to disk. Every memory metric is just a choice about which of those pieces to count.
The pages a process has physically in RAM right now. It's what ps and top report. Honest for one process, misleading when you sum: forty helpers sharing one framework each count it again.
Linux's fair version of RSS. A page shared by ten processes counts one tenth toward each, so PSS values sum to the truth. Read from /proc/<pid>/smaps_rollup.
macOS's answer, and the number Activity Monitor shows. Counts private and compressed memory but not shared framework code, so summing is fair. That is why an idle app can appear to grow: its untouched pages compress, and footprint sees them while RSS forgets them.
A process's (or in memhogs, a whole app's) share of the machine's physical RAM. The column that answers "is 700 MiB a lot on this box?"
Under pressure the OS evicts cold pages, either to a compressed store in RAM (fast) or to disk (slow). Those pages leave RSS entirely, which is how a leaking process can look like it's shrinking.
Address space the process has reserved, most of it never touched. Browsers reserve terabytes. Ignore this column; everyone else does.
memhogs defaults to footprint on macOS and PSS on Linux so that group totals don't double-count, and falls back to RSS for processes the OS won't let it inspect. --rss switches everything back when you need numbers comparable with ps.
Feature requests are tracked as GitHub issues, so you can browse what's been asked for and vote with a thumbs-up. This prompt is a shortcut: