Skip to content

fix(router): prevent memory leak in RouterScroller scroll position store#68177

Draft
arturovt wants to merge 1 commit intoangular:mainfrom
arturovt:fix/router_issue_51120
Draft

fix(router): prevent memory leak in RouterScroller scroll position store#68177
arturovt wants to merge 1 commit intoangular:mainfrom
arturovt:fix/router_issue_51120

Conversation

@arturovt
Copy link
Copy Markdown
Contributor

The store map in RouterScroller accumulates scroll positions keyed by navigation ID, which increments indefinitely. Entries were never evicted, causing unbounded memory growth over the lifetime of the application.

Scroll positions are only ever read on popstate events, meaning only entries corresponding to current browser history stack entries are useful. Chromium/Blink enforces a hard cap of 50 history entries via kMaxSessionHistoryEntries, pruning via
NavigationControllerImpl::PruneOldestSkippableEntryIfFull(). Entries beyond that limit can never be restored via popstate.

The fix evicts the oldest entry (smallest navigation ID) whenever the store exceeds 50 entries, bounding memory usage to a constant size.

Closes #51120

The `store` map in `RouterScroller` accumulates scroll positions keyed by
navigation ID, which increments indefinitely. Entries were never evicted,
causing unbounded memory growth over the lifetime of the application.

Scroll positions are only ever read on popstate events, meaning only
entries corresponding to current browser history stack entries are useful.
Chromium/Blink enforces a hard cap of 50 history entries via
`kMaxSessionHistoryEntries`, pruning via
`NavigationControllerImpl::PruneOldestSkippableEntryIfFull()`. Entries
beyond that limit can never be restored via popstate.

The fix evicts the oldest entry (smallest navigation ID) whenever the
store exceeds 50 entries, bounding memory usage to a constant size.

Closes angular#51120
@ngbot ngbot bot added this to the Backlog milestone Apr 13, 2026
@thePunderWoman
Copy link
Copy Markdown
Contributor

Woah, looks like you've opened a lot of issues/PRs recently. While we appreciate contributions from the community, triaging and reviewing a large influx of content in a short time period takes time away from other ongoing projects. As a result, we're closing these issues/PRs to maintain the team's focus.

Note that this is not necessarily a rejection of the goals or direction of any of these contributions in particular, so much as a reflection of the team's current capacity and priorities.

You are welcome to open a smaller subset of issues/PRs in accordance with our policy focused on the most important and impactful contributions and we will do our best to prioritize a response as soon as possible.

@arturovt arturovt deleted the fix/router_issue_51120 branch April 13, 2026 16:54
@arturovt arturovt restored the fix/router_issue_51120 branch April 13, 2026 17:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Memory leak in RouterScroller class

2 participants