First, check whether it's one app or all of them
The beach ball spins over one window — but other apps still switch, scroll, and type normally.
This takes five seconds and decides which page you should be reading. Click a different app in the Dock, or press ⌘ Tab. If that app answers straight away, your Mac is healthy and exactly one app is stuck.
If instead everything is slow — every app beachballs, switching takes seconds, typing lags — nothing is frozen. The Mac has run short of memory or disk space, and the fix is completely different.
Fixone app stuck, everything else fine? Carry on down this page. Everything slow at once? Go to why your Mac is slow instead, or check whether memory has spilled onto the disk.
What the spinning ball actually means
An app spends its life waiting for you. Clicks, keystrokes and scrolls arrive as events — small messages from macOS saying what you did — and the app picks each one up, does the work, and redraws its window. It handles them on its main thread, which is the single line of work inside the app that deals with you.
The main thread can only do one thing at a time. If something it started takes a long while — reading an enormous file, waiting on a server, waiting on another program — it is not collecting your events while that runs. After a couple of seconds macOS notices that the app has stopped answering, and draws the spinning ball over its window.
So the ball is not an error, and it is not a crash. It is macOS telling you this app is not listening right now. That leaves the only question that matters: is it busy, or is it stuck?
Find out whether it will come back
The ball has spun for more than a minute or two, and you cannot tell whether waiting longer will help.
You can look at what the app is doing without touching it. The sample command watches a running app for a few seconds and reports where its time went. It takes a snapshot every millisecond, then hands the app straight back — it does not close anything, and it needs no special permission for an app of your own. Open Terminal (⌘ Space, type Terminal) and run it on the stuck app:
% sample Finder 3 -mayDieAnalysis of sampling Finder (pid 1217) every 1 millisecond
Call graph:
2596 Thread_10723 DispatchQueue_1: com.apple.main-thread (serial)
+ 2596 NSApplicationMain (in AppKit) + 880
+ 2596 -[NSApplication run] (in AppKit) + 368
+ 2596 _DPSNextEvent (in AppKit) + 576
+ 2595 RunCurrentEventLoopInMode (in HIToolbox) + 320
+ 2560 __CFRunLoopRun (in CoreFoundation) + 1188
+ 2560 __CFRunLoopServiceMachPort (in CoreFoundation) + 160
+ 2560 mach_msg2_trap (in libsystem_kernel.dylib) + 8Real output from a healthy Finder, shortened — the full report lists every thread. Replace Finder with the name of your stuck app. Three seconds of watching, then a moment to look up the names.
Read the deepest indented line under the main thread and ignore the rest. The run above is what a perfectly healthy app looks like: mach_msg2_trap underneath __CFRunLoopRun means the app is sitting still, waiting for the next event. That is an app with nothing to do, not an app in trouble.
On a stuck app that bottom line will be something else. The name usually hints at what it is waiting for — reading a file, a network call, or another program that has not replied. Run the command a second time, a minute later, and compare:
- The deepest line changed. The app is still getting through work. Give it longer.
- The deepest line is identical. It has been waiting in the same place for a minute. It is stuck, and waiting will not fix it.
Fixstill working? Leave it alone and come back in ten minutes. Stuck in the same place twice? Force quit it, below.
Force quit it — and what that costs
Force quitting stops the app instantly, without letting it tidy up or save. A process here is one running program as macOS counts it. Apple's own guide to quitting one is blunt: “If the process has files open, you may lose data.”
Anything you had typed and not saved in that app is gone, and a frozen app generally cannot save on the way out. That is the whole cost, and it is why the two checks above come first. Once you accept it, Apple's steps are three keys:
- Press ⌥ ⌘ Esc together — or choose Force Quit from the menu.
- Select the unresponsive app in the list.
- Click Force Quit, and confirm.
Fixreopen the app afterwards. Many apps — Word, Pages, Preview, most browsers — offer to restore the documents or tabs you had open, which recovers more than people expect. If the same app freezes repeatedly, update it: a hang that happens every time is a bug in that app, not a fault in your Mac.
NoahNoah cannot see the freeze itself. Nothing in it watches whether an app is answering, so you tell it which app is stuck. It can read a processor-ranked list of what is running, which separates a frozen app that is burning processor from one sitting idle. Neither state settles whether it will recover — that is still the two-sample check above. With your approval, it can quit the stuck app. Opening it again afterwards is your step. The unsaved work is lost either way — that part no tool can rescue.
If you want the full picture: spindump
macOS has a heavier tool called spindump, which records what every running program is doing rather than one app. You mostly do not need it, and it will stop you at the door unless you run it with sudo:
% spindump Finder 1 -o /tmp/spin.txtspindump must be run as root when sampling the live systemThe real refusal. Putting sudo in front makes it run and asks for your password. sample, above, needs no password and answers the question you actually have.
It matters for one reason: macOS already runs it for you. When you force quit an app that had stopped answering, the system writes a spindump report of its own accord and files it in /Library/Logs/DiagnosticReports/. If you ever report a repeated freeze to an app's developer, that folder is where the evidence they want already is.
The short version
- Click another app. Only one stuck? Keep reading. Everything slow? Different problem.
- If the app was doing something heavy, wait a few minutes.
- Run
sample AppName 3 -mayDietwice, a minute apart. - Deepest line changed — still working, wait. Identical — stuck.
- Force quit with ⌥ ⌘ Esc, knowing unsaved work is lost, then reopen.