A stock iOS simulator is heavy. Boot one, wait for it to settle, and it's sitting at about 4 GB of memory across 258 processes. On a 16 GB Mac, that means around five simulators before the machine starts thrashing. I wanted a lot more than five.
So here's what happened.
Where all that memory goes
A freshly booted simulator starts around 180 background services. Siri. Spotlight indexing. Photo analysis. News widgets. Wallpaper posters. iCloud sync. Screen Time. Ad services. It's basically a full iPhone, minus the hardware.
And almost none of it matters when the simulator exists to run your app in CI or under UI automation. Nobody is asking Siri anything. Nobody is looking at the wallpaper.
The wallpaper one is my favorite, actually. Widgets and wallpaper posters alone hold about 675 MB of idle memory. That's more than some entire Linux VMs. For a lock screen nobody will ever see.
The fix
simslim turns those services off. It writes persistent launchctl disable entries into the simulator's own launchd database and reboots it. The entries stick, so the simulator comes up slim on every boot after that. One command:
simslim on <udid>
Same simulator, before and after:
| Stock | Slim | |
|---|---|---|
| Processes | 258 | 70 |
| Memory | 4.0 GB | 0.9 GB |
That's phys_footprint — the number Activity Monitor shows, including compressed and swapped pages. It's the number that decides how many simulators actually fit before the machine starts swapping.
Roughly 4x less memory per simulator. On my 16 GB MacBook Pro that took me from about 5 simulators to 19, all booted and running automation at the same time.
simslim off puts everything back to stock. And it never touches your Mac — only the simulator you point it at.
The honest part: some things break
Turning services off means those features stop working. That's the whole point, but you should know what you're giving up:
- Spotlight and in-Settings search return nothing.
- Push notifications need
apsd. StoreKit testing needsstorekitd. - Universal links need
swcd. - The Contacts, Photos, and Calendar pickers can act up.
If your tests need one of those, keep it:
simslim on <udid> --except search # keep a whole category
simslim on <udid> --keep com.apple.apsd # keep one daemon
And because a mis-slimmed simulator is an annoying thing to discover halfway through a test run, there's a preflight check:
simslim doctor <udid> --requires push,storekit,universal-links
It exits non-zero if any required feature is broken, so you can put it at the top of a CI job and fail fast instead of debugging a flaky test that was never going to pass.
For repeatable setups, you can commit a JSON profile next to your project — a ci.json that keeps push and StoreKit, a dev.json that keeps search — and apply it with --profile ci.json.
There's also a safety net inside the tool itself. simslim works off an allowlist: it will only ever touch daemons that are known safe to disable. A few daemons wedge a simulator when turned off, and those are hard-excluded with a test that keeps them out. Anything not on the list is never touched.
Watching the fleet
Once you have 19 simulators up, you want to see what they're doing. simslim top is a live monitor for the whole fleet — memory and slim status per simulator, and you can drill into one to see per-daemon RAM and CPU. It's how I found the wallpaper number.
Why I built this
Testing is changing. Once agents are writing apps, you want agents running them too, and an iOS app runs in a simulator. One agent, one simulator. So the amount of parallel work you get out of a machine comes down to how many simulators it can hold.
Slimming them is the cheapest way to raise that ceiling. No extra hardware, no cloud Macs, just less waste per simulator. I built it for MobAI, where the whole game is controlling as many automated devices per machine as possible.
Try it
brew install mobai-app/tap/simslim
simslim list
simslim on <udid>
simslim measure <udid>
macOS only, and you need Xcode with an iOS Simulator runtime. There's also a small SwiftUI app that wraps the CLI if you'd rather click than type.
It's MIT licensed, on GitHub at mobai-app/simslim. If it saves you from buying a bigger Mac, that was the idea.