Inconsistent hashCode/equals implementation in AbstractPointcutAdvisor results in CGLIB-related memory leak [SPR-12556] #17158
Labels
in: core
Issues in core modules (aop, beans, core, context, expression)
status: duplicate
A duplicate of another issue
Victor Bronstein opened SPR-12556 and commented
I suspect this is the reason for a CGLIB-related memory leak I see (resembling very close #12663), but the issue is so complicated I'm not sure.
We are creating and destroying a Spring context having a JPA entity. What we see in the dump is an instance of
AdvisedSupport
per context ever created, referenced byCglibAopProxy$ProxyCallbackFilter
referenced by CGLIBEnhancerKey
(having the matching number of instances). The EnhancerKeys are all different because the Filters are different and these are different because they have aPersistenceExceptionTranslationAdvisor
whose instances are compared by advice and pointcut. The advice isPersistenceExceptionTranslationInterceptor
which doesn't override equals so all instances are different.Now judging by the hashmap structure, the hashkey of them all seem to be the same which further strengthens my hypothesis.
I couldn't tell whether the approach of
hashCode
or the approach ofequals
is correct but they are not consistent. If we take the approach of hashCode, all instances of AbstractPointcutAdvisor would be the same. However ifequals
implementation is the correct one, the result is a memory leak because of the advisors being referenced byCglibAopProxy$ProxyCallbackFilter
instances which are strongly referenced by the CGLIB cache.Affects: 3.2.12, 4.1.3
Issue Links:
@Async
with cglib based proxy causes memory leak in heap ("duplicates")The text was updated successfully, but these errors were encountered: