Solving memory leak by reusing BuildManager and ProjectRoolElementCache#7655
Merged
rokonec merged 3 commits intoJun 2, 2022
Merged
Conversation
Forgind
approved these changes
May 27, 2022
Contributor
Forgind
left a comment
There was a problem hiding this comment.
Very nice; thanks for figuring this out!
ad2a713 to
5ade626
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #7639
Context
Memory leak has been detected when MSBuild server runs many sessions.
Changes Made
BuildManager.DefaultBuildManagerby not disposing it.ProjectRootElementCachebetween MSBuild server sessions.ProjectRootElementCachebefore build.Testing
Manual tests. Manual memory consumption analyze.
When I run simple console.csproj build in loop this is how used memory looked like:
Before:

After:

Notes
Changes are isolated to Server mode only.
XmlDocumentWithLocation.s_globalStringCacheroots unboundedProjectStringCache._documentswhich is not cleared at the end of build but at the start of build indirectly throughProjectRootElementCachecallbacks, so ifProjectRootElementCacheis not reused, it is never cleared.