Lighter interceptors: more efficient initialization and lower memory usage #10387
+342
−176
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.
https://hibernate.atlassian.net/browse/HHH-19536
Exploring some internal refactoring of how two core interceptors are being initialized:
EnhancementAsProxyLazinessInterceptor
LazyAttributeLoadingInterceptor
(These two are both implementors of of
AbstractInterceptor
, and represent the full set of its implementors )The goal is to both reduce allocation pressure significantly, and also reduce the amount of repeating work being done when each of these instances is being initialized. Generally speaking, we identified a significant amount of "state" which is immutable and could be shared across all such interceptor instances when they belong to the same type.
JOL provided stats, assuming 15+ JDK, COOPS, CCPS :
Before:
After:
This exploration also led to rethink how we model the association of such an interceptor to the current Session, also providing both memory and computational benefits. Code comments hopefully explain this in more detail.
(fully relies on all existing tests)
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license
and can be relicensed under the terms of the LGPL v2.1 license in the future at the maintainers' discretion.
For more information on licensing, please check here.
https://hibernate.atlassian.net/browse/HHH-19536