Skip to content

fix: reduce potential menu bar memory growth from oversized collapsed widths#344

Merged
phucledien merged 1 commit into
developfrom
fix/memory-leak-monitor-loop
Mar 3, 2026
Merged

fix: reduce potential menu bar memory growth from oversized collapsed widths#344
phucledien merged 1 commit into
developfrom
fix/memory-leak-monitor-loop

Conversation

@phucledien

Copy link
Copy Markdown
Member

Summary

This PR addresses high-memory reports (see #326) by removing oversized status item collapse widths that can trigger expensive menu bar layout behavior on newer macOS versions.

Closes #343.

Root cause hypothesis

StatusBarController used very large hardcoded collapse lengths (10000) for status items when hiding sections.
On newer macOS builds, oversized status item geometry appears to cause pathological layout/repaint work, which aligns with reports of Hidden consuming multiple GB of RAM.

What changed

  • Replaced hardcoded large collapse lengths with a dynamic bounded width based on current screen width.
    • New bounded formula: max(500, min(screenWidth + 200, 4000))
  • Recompute collapse lengths when display configuration changes via:
    • NSApplication.didChangeScreenParametersNotification
  • Added cleanup safety:
    • deinit now removes observers.
  • Fixed status item lifecycle in always-hidden toggle:
    • Explicitly remove old NSStatusItem from NSStatusBar before replacing/nilling.

Why this is safe

  • Behavior remains functionally the same (collapsed section still fully hidden).
  • Uses realistic, bounded geometry instead of extreme values.
  • Should reduce risk of memory growth while preserving UX.

Validation notes

I couldn’t run full xcodebuild in this environment because full Xcode isn’t installed (only Command Line Tools). Please validate on macOS 15/26 with Activity Monitor after repeated collapse/expand + auto-hide cycles.

@phucledien phucledien self-assigned this Mar 3, 2026
@phucledien phucledien changed the base branch from master to develop March 3, 2026 06:35
@phucledien phucledien merged commit a971149 into develop Mar 3, 2026
@phucledien phucledien deleted the fix/memory-leak-monitor-loop branch March 3, 2026 13:47
sdenike added a commit to sdenike/hidden-revived that referenced this pull request Apr 23, 2026
Adds the non-overlapping pieces of huynguyenh's PR dwarvesf#335 on top of
rm335's PR dwarvesf#346. Handles the biggest leak source (NSLayoutConstraint
retention when NSImageViews were recreated 9-10 times per toggle).

- Deactivate NSLayoutConstraints before removing views in
  NSStackView.removeAllSubViews (prevents constraint retention of
  removed NSImageViews — primary leak source on macOS Sequoia/Tahoe)
- Extend StatusBarController.deinit to invalidate timer and remove
  the always-hidden NSStatusItem
- Change toggleStatusBarIfNeeded to only create the always-hidden
  status item when it doesn't already exist, instead of tearing down
  and recreating on every .alwayHideToggle notification

Combined with the widest-display collapse-length calc in dwarvesf#354 and the
bounded-length work in dwarvesf#344, this should resolve the runaway memory
growth reported in upstream dwarvesf#326, dwarvesf#336, dwarvesf#351, dwarvesf#352.

Co-Authored-By: huynguyenh <hoanghuy2908@gmail.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
sdenike pushed a commit to sdenike/hidden-revived that referenced this pull request Apr 29, 2026
sdenike added a commit to sdenike/hidden-revived that referenced this pull request Apr 29, 2026
Adds the non-overlapping pieces of huynguyenh's PR dwarvesf#335 on top of
rm335's PR dwarvesf#346. Handles the biggest leak source (NSLayoutConstraint
retention when NSImageViews were recreated 9-10 times per toggle).

- Deactivate NSLayoutConstraints before removing views in
  NSStackView.removeAllSubViews (prevents constraint retention of
  removed NSImageViews — primary leak source on macOS Sequoia/Tahoe)
- Extend StatusBarController.deinit to invalidate timer and remove
  the always-hidden NSStatusItem
- Change toggleStatusBarIfNeeded to only create the always-hidden
  status item when it doesn't already exist, instead of tearing down
  and recreating on every .alwayHideToggle notification

Combined with the widest-display collapse-length calc in dwarvesf#354 and the
bounded-length work in dwarvesf#344, this should resolve the runaway memory
growth reported in upstream dwarvesf#326, dwarvesf#336, dwarvesf#351, dwarvesf#352.

Co-Authored-By: huynguyenh <hoanghuy2908@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

High memory usage likely caused by oversized status item lengths on newer macOS

1 participant