From: KimmingLau <294001791@qq.com> Date: Wed, 3 Apr 2024 20:20:18 +0000 (+0800) Subject: JoinPointImpl: Remove thread-locals after usage, where possible X-Git-Tag: V1_9_22_1~27 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=70a454761097fc22918861c53db1f09445b685bb;p=aspectj.git 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 --- 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);