Memoize Virtus attribute and fix memory leak. #1109
Merged
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.
This one fixes a serious problem we faced in production under a heavy load. Investigation led us to the fact that it happens only when params are defined with
type: Array[SomeClass]
. In this caseVirtus
dynamically create some virtual classes (withClass.new
) which inherits from base class withDescendantsTracker
added which saves descendant classes into the array. Here we have a leak because garbage collector doesn't free these classes because an array still holds a reference to them.So at least I can say that
Virtus
isn't designed for creating things dynamically. They should be stored somehow statically.@dblock
Look, this is funny! Remember ruby-grape/grape-entity#161 ? This is why it is bad to store descendant classes in the array. Look at the implementation of
DescendantsTracker
— is it similar, right?