Memory leak when marshalling StringWriter between AppDomains.#495
Open
johannesg wants to merge 1 commit intoAntaris:masterfrom
johannesg:stringwriterbug
Open
Memory leak when marshalling StringWriter between AppDomains.#495johannesg wants to merge 1 commit intoAntaris:masterfrom johannesg:stringwriterbug
johannesg wants to merge 1 commit intoAntaris:masterfrom
johannesg:stringwriterbug
Conversation
…Writer. Use of a StreamWriter between mashalled calls removes the leak.
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.
Attached is a small program that renders a template to a string using the extension method that uses a StringWriter internally:
When this loop is called when using a sandbox (IsolatedRazorEngineService), it will quite quickly run out of memory, causing OutOfMemoryException.
The reason is that the internal StringBuilder instance inside the StringWriter will not be GC:ed for several minutes because It is held by the lease manager.
I made a hack in the extension method 'WithWriter' that, instead of using StringWriter, use a MemoryStream + StreamWriter and encode it back to a String. For some reason, using a StreamWriter will not cause memory usage to rise.
I'm not sure if this is actually a bug in .NET or rather an effect of how RazorEngine overrides the management of service lifetime across AppDomains (CrossAppDomainObject).