From 70a454761097fc22918861c53db1f09445b685bb Mon Sep 17 00:00:00 2001 From: KimmingLau <294001791@qq.com> Date: Thu, 4 Apr 2024 04:20:18 +0800 Subject: [PATCH] JoinPointImpl: Remove thread-locals after usage, where possible Avoid potential ThreadLocalMap.Entry accumulation. Entry is a WeakReference. When JoinPointImpl objects are collected by GC, Entry instances are still be referenced by ThreadLocalMap, which leads to memory pressure and potentially more full GCs. So, we proactively remove ThreadLocal arcIndex instances when arcIndex has been decremented back to -1 per thread. This is not perfect, because not each thread can be expected to proceed, but it should ameliorate the situation to some degree. Fixes #302. Co-authored-by: Alexander Kriegisch Signed-off-by: KimmingLau <294001791@qq.com> Signed-off-by: Alexander Kriegisch --- .../java/org/aspectj/runtime/reflect/JoinPointImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/runtime/src/main/java/org/aspectj/runtime/reflect/JoinPointImpl.java b/runtime/src/main/java/org/aspectj/runtime/reflect/JoinPointImpl.java index 8db5e0730..01def8451 100644 --- a/runtime/src/main/java/org/aspectj/runtime/reflect/JoinPointImpl.java +++ b/runtime/src/main/java/org/aspectj/runtime/reflect/JoinPointImpl.java @@ -154,7 +154,11 @@ class JoinPointImpl implements ProceedingJoinPoint { arcs = new ArrayList<>(); } if (arc == null) { - arcIndex.set(arcIndex.get() - 1); + int newIndex = arcIndex.get() - 1; + if (newIndex > -1) + arcIndex.set(newIndex); + else + arcIndex.remove(); } else { this.arcs.add(arc); -- 2.39.5