HelperInjector optimization#1126
Merged
Merged
Conversation
dougqh
approved these changes
Dec 5, 2019
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.
This pull request makes some changes to
HelperInjectorto reduce memory usage, increase performance, and decrease the chance of deadlocks.Removes
helperMapto save memoryThe
helperMapwas an injector-local cache of thebyte[]representation of an instrumentation's helper classes. Since each instrumentation has its ownHelperInjector, each instrumentation had its ownhelperMap. These arrays were never reclaimable by GC.The performance impact of removing this cache should be negligible because:
classloaderDatadogClassloaderhas its own internal class cacheModule logic improvement
There is only one
unnamed moduleper classloader. The new code takes advantage of this fact.Removes synchronization block
Internally, bytebuddy locks the
classloaderbeing injected. The synchronization block meant there was potential for deadlock:HelperInjectorlock, is waiting forClassloaderlockClassloaderlock, is waiting forHelperInjectorlockWhile unlikely because of when injection usually happens, it was still possible. Additionally, synchronization was only necessary because of the
HelperMapcaching. As the cache was removed, synchronization could also be removed.Using
injectRaw()instead ofinject()Internal to ByteBuddy,
inject()callsinjectRawby copying the classmap. Unintentionally, some instrumentation code paths converted this map 3-4 times. UsinginjectRaw()avoids this problem.