`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).
1 file changedLine totals unavailable