Claude Desktop (macOS): main process hard-wedges when free RAM is low; WarmLifecycle keeps spawning session children with no memory backpressure

Status Open
Reported on v2.1.221
Maintainer reply None cached
Activity 0 comments · opened Aug 8, 2026

Environment

  • Claude Desktop 1.25927.0 (all freezes below; machine has since auto-updated to 1.26832.0)
  • Bundled Claude Code CLI 2.1.221
  • macOS Darwin 25.5.0, Apple Silicon, 48 GB RAM
  • Heavy multi-session use: several concurrent Code sessions + scheduled tasks + claude.ai connectors (9 remote MCP servers / 68 tools per session) + 5 local desktop extensions

Symptom

The app stops accepting chat input entirely; the whole UI is unresponsive and only force-quit works. This happened ~6 times on 2026-08-06 and twice on 2026-08-08. No crash reports are generated (nothing crashes — the main process stalls).

Evidence from ~/Library/Logs/Claude/main.log

The main process logs [ScheduledTasks] lines every 60 s, so log silence >150 s indicates the Electron main process stopped executing (not just a renderer). Confirmed silent gaps, with the last [process-memory] reading before each:

| Date | Silence | tree_rss_sum | children | sys_free_raw |
|---|---|---|---|---|
| 08-06 | 5.5 min | ~4.7 GB | 25 | 616–706 MB |
| 08-06 | 33.1 min | 4.6 GB | 20 | ~1.4 GB falling |
| 08-06 | 3.5 min | 5.2 GB | 24 | 706 MB |
| 08-08 | 4.5 min | 8.7 GB | 52 | 1020 MB |
| 08-08 | 4.0 min | 5.2 GB | 27 | 1092 MB |

Every freeze occurred with sys_free_raw0.6–1.1 GB. (Note sys_free — which includes reclaimable cache — stayed at 11–28 GB throughout; it is not the operative number.)

The immediate trigger in each case was session lifecycle work at that floor:

11:15:02 [WarmLifecycle:preview] Warming up session local_6bab6417-…
11:15:09 Sending message to session local_6bab6417-…
11:15:17 [process-memory] … sys_free_raw=1092MB
11:15:19 [CCD] LocalSessions.setFocusedSession: sessionId=null
[ 4.0 minutes of total log silence — user force-quits ]

and on 08-06:

13:15:47 [CCD] Warming session local_a97cdd68-…   (sys_free_raw ≈ 1.4 GB and falling)
[ 33.1 minutes of silence ]

Analysis

  1. Each warm session holds a ~500 MB CLI child plus local MCP server processes. Children accumulated to 52 (5.4 GB) on 08-08; electron_main itself was at 1285 MB RSS.
  2. Archiving a session does not release its child: LocalSessions.archive is immediately followed by [WarmLifecycle:session] Starting idle timeout: 900s — the child stays warm 15–30 min after explicit archive.
  3. WarmLifecycle warms new sessions even when sys_free_raw is ~1 GB — the subsystem that logs the memory number applies no backpressure from it.
  4. When macOS starts aggressive reclaim at that floor, the (very large) main process pages and its event loop stalls minutes at a time → user force-quits.

Requests

  • Backpressure: don't warm additional sessions (and start shedding idle warm children) when sys_free_raw drops below a threshold.
  • Release the CLI child on explicit archive, or expose a "close session now" that does.
  • Expose warm-pool size / idle-timeout as settings (none exist in the bundle today).
  • Consider trimming electron_main RSS growth (1.3 GB after a morning of use).

Also observed (separate, minor)

  • With the Claude browser extension installed in two Chromium browsers (Chrome + Comet), the bridge rejects tool calls with Multiple Chrome extensions connected — target_device_id required (674 log occurrences) while ensureConnected reports connected=true — sessions bind to a dead browser connection.
  • [ScheduledTasks] looks for task files at ~/Claude/Scheduled/<name>/SKILL.md while the scheduler MCP keeps them at ~/.claude/scheduled-tasks/<name>/SKILL.md, producing ENOENT warn-spam every 60 s for ~40 tasks that exist and fire correctly.

---
🤖 Drafted with Claude Code from local main.log forensics; filed by the account owner.

View original on GitHub ↗