What we measured, and how
All three apps ran on one Mac: an Apple M5 Max with 36 GiB of memory and macOS 27.2. Each was set to 8 CPUs and 12 GiB, started fresh with its own command, and run alone, with the others quit and verified gone. Idle figures come from a 60-second window after a 45-second settle, counting every process the product runs: the app, its helpers and the engine with its Linux system. Container figures are medians of five samples after a warmup, and anything within 10 % counts as level.
Oxcart 0.1.2 was measured on 2026-10-10 with its bundled docker 29.9 client. OrbStack 2.2.3 and Docker Desktop 4.94.0 were measured earlier the same day, on the same Mac and harness, with docker 29.4. Each product runs its own Linux kernel. This is one pass per product on one machine, not a study; the method is the same for everyone.
Idle memory with no containers
| App | Idle memory |
|---|---|
| Oxcart 0.1.2 | 776 MiB |
| OrbStack 2.2.3 | 792 MiB |
| Docker Desktop 4.94.0 | 1,745 MiB |
This is the memory a container app costs you just by being ready: between work sessions, during meetings, on a laptop that has it open all day. Oxcart and OrbStack are level here; Docker Desktop holds more than twice as much.
The cost of watching your containers
Dashboards, terminal monitors and coding agents poll container stats constantly, so the cost of reading them matters more than it looks.
| Measure | Oxcart | OrbStack | Docker Desktop |
|---|---|---|---|
CPU of one streaming docker stats client | 1.29 % | 3.81 % | 5.45 % |
docker stats --no-stream | 1,038 ms | 2,050 ms | 2,054 ms |
CPU as a percentage of one core. Oxcart 0.1.2 measured 2026-10-10 with its bundled docker 29.9 client; OrbStack 2.2.3 and Docker Desktop 4.94.0 measured earlier the same day, on the same Mac and harness, with docker 29.4.
Oxcart's own menu bar item, with 20 containers running, costs 0.0004 % of a core and 0.033 wakeups per second. That figure is the app alone, not the engine.
Under load: level
Once containers do real work, the apps converge, because the work itself dominates. Two rows from the same run:
| Measure | Oxcart | OrbStack | Docker Desktop |
|---|---|---|---|
| Mac CPU per CPU-second inside the container | 1.10× | 1.11× | 1.09× |
| Mac memory per container touching 256 MiB | 235 MiB | 266 MiB | 236 MiB |
In practice: a CPU-bound build or test costs about the same Mac CPU on any of the three, and a container that uses 256 MiB costs your Mac about that much. What differs is everything around the work: how long each docker run, stop and teardown takes, which is where Oxcart leads (vs Docker Desktop, vs OrbStack).
When you're done: memory goes back to macOS
Since Oxcart 0.1.3, about 30 s after your last container stops, Oxcart restarts its Linux side and the memory returns to macOS: 570 MiB, down from 3,319 MiB, 32 s after your last container stops (a second run: 3,352 to 579 MiB). This happens only when no container is running. It happens in the background: a Docker command that arrives during the restart simply waits for it.
Measured on Oxcart 0.1.3.
Measure a container app's memory on your own Mac
- Start from a quiet Mac. Quit other container apps, stop your containers, and wait a minute after the app starts so start-up work settles.
- Find every process the app runs. In Activity Monitor, open the Memory tab and search for the app's name; the process that runs the Linux side is usually the largest. From the terminal,
ps -axo pid,rss,comm | grep -i <app>lists them. - Read the memory macOS charges. Use the Memory column in Activity Monitor, or
footprint <pid>for each process, and add them up. Resident size (RSS) alone can over- or under-count shared and compressed memory. - Measure with your workload running. Start your usual Compose stack, use it for a few minutes, and read the same numbers again.
docker stats --no-streamshows what each container uses inside the Linux side. - Measure after you stop. Stop everything and read the numbers once more, a minute later. That is the memory the app keeps while idle between work sessions.
Settings that matter
- The app's limits. Each app caps the CPUs and memory its Linux side may use. In Oxcart: Settings › Resources, or
oxcart config set cpus=6andoxcart config get; values apply at the next start. A cap well above what your stack needs buys nothing. - Per-container limits.
--memory,--cpusand--pids-limitondocker run, ormem_limit,cpusandpids_limitin Compose, keep one runaway service from taking everything. - Stop what you aren't using.
docker compose stopfor stacks you'll come back to;docker compose downfor ones you won't. With Oxcart, stopping the last container is also what lets memory go back to macOS. - Watch cheaply. Prefer
docker stats --no-streamin scripts, and give coding agents a summary tool instead of raw stats (Docker for AI coding agents).
Questions
How much memory does Docker use on a Mac?
It depends on the app and on what your containers do. With no containers running, on one Apple silicon Mac set to 12 GiB, we measured 776 MiB for Oxcart, 792 MiB for OrbStack and 1,745 MiB for Docker Desktop, counting every process each product runs. Once containers run, memory follows the workloads.
Why is Docker Desktop using so much memory?
Every container app on a Mac runs a Linux system, and the memory its workloads touch shows up as one large process on the Mac. In our measurement Docker Desktop also had the highest idle figure of the three, 1,745 MiB with no containers. Lower the memory limit in its settings, stop containers you don't need, and compare an alternative such as Oxcart, which idled at 776 MiB on the same Mac.
Does Oxcart give memory back to macOS?
Yes, once nothing runs. Since Oxcart 0.1.3, about 30 s after your last container stops, Oxcart restarts its Linux side and the memory returns to macOS: 570 MiB, down from 3,319 MiB, 32 s after the last container stopped, in a pre-release measurement. This happens only when no container is running.
How do I limit a container's memory and CPU?
Per container: docker run --memory 512m --cpus 1.5 …, or mem_limit and cpus in a Compose service. Oxcart applies memory, CPU and process-count updates with docker update, and they survive the container being recreated by a restart.
How do I set how many CPUs and how much memory Oxcart can use?
In Settings › Resources, or from the terminal with oxcart config set cpus=4 and oxcart config get to see the effective values and your Mac's limits. New values apply at the next start.
Does docker stats slow my Mac down?
A live docker stats stream costs CPU on every app. We measured 1.3 % of a core for Oxcart, 3.8 % for OrbStack and 5.5 % for Docker Desktop, the lowest of the three. A one-shot docker stats --no-stream for 20 containers took 1.0 s on Oxcart, about half the time of the other two.
Sources and method
- Oxcart 0.1.2, OrbStack 2.2.3 and Docker Desktop 4.94.0, measured 2026-10-10 on the same Mac (Apple M5 Max, 36 GiB, macOS 27.2), 8 CPUs and 12 GiB each, one product at a time.
- Memory returned after the last container stops: Oxcart 0.1.3.
- Menu bar cost: measured on Oxcart, 2026-10-09.