Fix memory leak in SbtUpdateReport
caching
#563
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.
Fixes sbt/sbt#8142
This updates
SbtUpdateReport.caching
to use weak references for both the cached keys and values to prevent memory leaks.Keys
Weak references to keys are handled by using a
WeakHashMap
instead of aConcurrentHashMap
.Note that this also required passing the map to
Collections.synchronizedMap
to ensure it's still thread-safe. I'm guessing that a goal ofsbt-coursier
is to include as few dependencies as possible, but if that's not correct then I think it's likely that a better alternative toCollections.synchronizedMap
would be to use one of:MapMaker
class with calls toweakKeys
andweakValues
Caffeine
cache with calls toweakKeys
andweakValues
Values
Weak references to values are handled by wrapping each value in
WeakReference
.Results
Using https://github.com/mrdziuban/sbt-update-memory-leak, I ran:
and got the following results for the heap retained by
SbtUpdateReport$
:update
s