dumpsys meminfo
read-onlyWhich processes are using the most memory, measured as proportional set size.
- Command
- adb shell dumpsys meminfo
- Commands
- System services (dumpsys)
- Risk
- read-only
Syntax
dumpsys meminfoExamples
dumpsys meminfoThe summary sections: memory per process, and the RAM totals.
top -b -n 1 -m 10Cheaper, and gives resident memory rather than proportional.
Reading the output
Sample output
Applications Memory Usage (in Kilobytes):
Uptime: 5178721 Realtime: 5178721
Total PSS by process:
353,876K: com.google.android.gms.persistent (pid 3062 / activities)
215,668K: system (pid 1650)
94,952K: surfaceflinger (pid 842)Rows are already sorted largest first, and the numbers are kilobytes with comma grouping — `1,234,567K` is one number, and a reader that stops at the first comma reports 1 MB for a 1.2 GB process. Proportional set size divides each shared page by the number of processes mapping it, so these numbers add up to something close to the real footprint, which resident set sizes do not.
Output fields
| Field | Meaning |
|---|---|
| N,NNNK: | Proportional set size in kilobytes, comma-grouped. |
| (pid N / activities) | The process id and a qualifier — `activities`, `services`, `cached`. It is how you tell a live app from a cached corpse holding the same memory. |
| Total RAM / Free RAM / Used RAM | Whole-device totals, also in comma-grouped kilobytes. |
What access it needs
Two permissions, both already held: the memory binder calls `DumpUtils.checkDumpAndUsageStatsPermission` with the literal tag `meminfo`, so refusals name that lowercase word rather than a class, and it wants `android.permission.DUMP` together with `android.permission.PACKAGE_USAGE_STATS`. The Shell manifest declares both, and the usage-stats path short-circuits `SHELL_UID` before the app-op is consulted, so an authorised `adb` connection is enough — no root, no `adb root`, no "Usage access" grant in Settings. The cost, not the permission, is what you have to plan around, and it is worse than the per-process walk suggests. The binder's `dump` wraps the entire dump in `enableFreezer(false)` … `enableFreezer(true)`, so for as long as this command runs **every frozen cached app on the device is unfrozen**, and they are re-frozen only when it finishes. On top of that each surviving process is sent a binder transaction and computes its own figure by walking its own memory maps. Running this on a timer therefore does not merely measure the phone, it changes the thing being measured: cached apps that were costing nothing wake up, and the CPU spike you were investigating acquires a contribution from your own tooling. The Android System Monitor sends it on a slow cadence behind a toggle for exactly this reason; `top` is the cheap answer when resident memory will do.
Failure messages, decoded
| Message | Meaning |
|---|---|
| Permission Denial: can't dump meminfo from from pid=4821, uid=10231 due to missing android.permission.DUMP permission | The tag is the bare word `meminfo` because that is the literal string the memory binder passes, and the doubled `from from` is genuine AOSP text. Written to **stdout**, in place of the table, so an automated reader that scans for `K:` rows sees a device with no processes rather than a refused call. |
| *** SERVICE 'meminfo' DUMP TIMEOUT (10000ms) EXPIRED *** | Ten seconds is the `dumpsys` default and this is the dump most likely to reach it on a loaded phone, because the deadline covers every process's own map walk. What you keep is a truncated table, and since rows are sorted largest first the missing tail is the small processes — so a truncated dump still answers "what is biggest" and can never be summed into a device total. |
| Unknown argument: -x; use -h for help | An option the memory dump's argument loop does not recognise. It prints this on stdout and **carries on** with the arguments it did understand rather than aborting, so a mistyped flag yields a full dump of a different shape instead of an error — the failure mode here is a plausible answer to a question you did not ask. |
| Can't find service: meminfo | Printed to stderr by the `dumpsys` binary: the service manager has no `meminfo` entry, which is normal before boot completes and after a `system_server` restart. Nothing was asked of the service, so this is not the same as an empty table — and captured without `2>&1` it is invisible. |
Version and vendor notes
- This is the most expensive thing you can ask a phone for. It walks every running process, sends each one a binder transaction, and each of them computes its own figure by walking its memory maps — hundreds of milliseconds to a couple of seconds of real CPU, on the device you are watching for CPU spikes. Do not put it on a one-second timer.
- Proportional and resident set sizes are different quantities and must never be presented as the same one; `top` gives you the latter for free.
- On low-memory configurations the section can be titled by resident size instead, because proportional collection is disabled there.
- AOSP prints an RSS section ahead of the PSS section — `Total RSS by process:` then `Total PSS by process:` — on every release from tag android-11.0.0_r1 through android-15.0.0_r1, so an RSS heading at the top of the dump is the normal layout.
- The dump unfreezes every frozen cached app for its whole duration and re-freezes them at the end, so running it on a timer changes the memory and CPU picture it is reporting.
We have a UI for this
Android System Monitor runs this command over USB and parses what comes back — a Chromium browser, no SDK, nothing uploaded.
Related commands
Commands that turn up in the same session as dumpsys meminfo.
| Command | What it does |
|---|---|
| top | A one-shot process table: CPU share, memory, state and command line. |
| am force-stop | Kills every process and service belonging to one app. |
| dumpsys battery | The battery service's live state: level, status, health, voltage and temperature. |
More System services (dumpsys) commands
| Command | What it does |
|---|---|
| dumpsys diskstats | Free space per partition, a disk write latency check, and a cached per-app breakdown of what is using storage. |
| dumpsys thermalservice | Whether the phone is throttling, and every thermal zone the hardware layer reports, in degrees Celsius. |
| dumpsys sensorservice | Every sensor the phone has, with its vendor, type, rates and batching — plus a buffer of recent readings. |
| dumpsys package | Everything the package manager knows about one app: version, paths, flags, install source and per-user state. |
| dumpsys activity activities | Which app is in the foreground, and the task and stack structure behind it. |
| dumpsys dropbox | The platform's ring buffer of crashes, ANRs and tombstones — how you read ANR traces without root. |
Checked against AOSP, toybox and kernel sources while writing the parsers behind our Web ADB tools. Where a behaviour genuinely varies by Android version or manufacturer, this page says so instead of giving a number that would be wrong on half the phones out there.