Memory leak when marshalling StringWriter between AppDomains. #495
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).