Fix WeakConcurrentMap memory leak #5316
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.
We noticed that opentelemetry javaagent produces a memory leak and root class for this is
io.opentelemetry.javaagent.tooling.muzzle.AgentCachingPoolStrategy
as you can see from heap dump analysis:From what can see in the code
AgentCachingPoolStrategy
usesWeakLockFreeCache
opentelemetry-java-instrumentation/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentCachingPoolStrategy.java
Line 52 in f6bcd76
and it only calls the method
computeIfAbsent()
on itopentelemetry-java-instrumentation/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/AgentCachingPoolStrategy.java
Line 71 in f6bcd76
computeIfAbsent()
makes calls to only two methods of the underlyingWeekConcurrentMap.WithInlinedExpunction delegate
object:getIfPresent()
andputIfAbsent()
opentelemetry-java-instrumentation/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/cache/WeakLockFreeCache.java
Line 21 in f6bcd76
opentelemetry-java-instrumentation/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/cache/WeakLockFreeCache.java
Line 46 in f6bcd76
opentelemetry-java-instrumentation/instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/cache/WeakLockFreeCache.java
Line 36 in f6bcd76
But
WeekConcurrentMap.WithInlinedExpunction
doesn't override those two methods and, thus, theexpungeStaleEntries()
method is not called and the weak keys are not removed from the map.We think the described issue is the root cause of the observed memory leak and this pull request should fix it.
Related to #5265