lsp: Fix retained notification subscriptions leaking dropped language servers (#58866)

`Subscription::Notification` held a strong `Arc` to a language server's
entire notification handler map, while `Subscription::Io` already used a
`Weak`. Any subscription retained beyond the server's lifetime (e.g.
`copilot_log_subscription` in the LSP log store, which lives until the
project is closed) kept **every** handler on the dead server alive —
along with everything those closures capture, including
`Arc<CachedLspAdapter>` and `LspAdapterDelegate`s that pin full worktree
snapshots. Each server restart while such a subscription existed leaked
one server generation; on large worktrees that's tens of MB per restart.

The fix changes `Subscription::Notification` to hold a `Weak` reference,
matching the `Io` variant. Dropping a subscription still deregisters its
handler when the server is alive; if the server is already gone, there
is nothing left to clean up.

Also adds a regression test
(`test_subscription_leaks_handlers_after_server_drop`) to prevent this
from happening again

Helps with #58190 and #31461 (long-running memory growth involving
language servers), though it likely isn't the whole story for either,
the unbounded outbound message channel in `crates/lsp/src/lsp.rs`
remains a separate suspect for the extreme growth in #58190.

Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content adheres to Zed's UI standards
([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
and
[icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md)
guidelines)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- Fixed a memory leak where restarting a language server could leak
memory if its notification subscriptions were still retained (e.g. while
the LSP log view was tracking it).
3f16f7b908Anthony Eid committed on 6/8/2026, 9:24:36 PM· committed by GitHubparent7f6f93c
1 file changedLine totals unavailable