diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pooling/PhantomArrayListCheckout.java b/core/src/main/java/com/seibel/distanthorizons/core/pooling/PhantomArrayListCheckout.java index 95da5674e..2213dd3ef 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pooling/PhantomArrayListCheckout.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pooling/PhantomArrayListCheckout.java @@ -10,6 +10,7 @@ import org.jetbrains.annotations.Nullable; import java.lang.ref.SoftReference; import java.util.ArrayList; +import java.util.Arrays; /** * This keeps track of all the poolable @@ -33,7 +34,7 @@ public class PhantomArrayListCheckout implements AutoCloseable /** Will be null if the parent pool doesn't want leak stack tracing */ @Nullable - public final String allocationStackTrace; + public String allocationStackTrace = null; private final ArrayList byteArrayLists = new ArrayList<>(); private final ArrayList shortArrayLists = new ArrayList<>(); @@ -47,21 +48,20 @@ public class PhantomArrayListCheckout implements AutoCloseable public PhantomArrayListCheckout(@NotNull PhantomArrayListPool owningPool) { - if (owningPool.logGarbageCollectedStacks) - { - // TODO remove the top 4 or so lines since those will always be the same (relating to the phantom allocations) - // and aren't helpful when debugging - this.allocationStackTrace = StringUtil.join("\n", Thread.currentThread().getStackTrace()); - } - else - { - this.allocationStackTrace = null; - } - this.owningPool = owningPool; this.ownerSoftReference = new SoftReference<>(this); } + public void onCheckout() + { + if (this.owningPool.logGarbageCollectedStacks) + { + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + StackTraceElement[] trimmedElements = Arrays.copyOfRange(stackTraceElements, 4, stackTraceElements.length); + this.allocationStackTrace = StringUtil.join("\n", trimmedElements).intern(); + } + } + //=========// diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pooling/PhantomArrayListPool.java b/core/src/main/java/com/seibel/distanthorizons/core/pooling/PhantomArrayListPool.java index 18a671cb9..595a7630e 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pooling/PhantomArrayListPool.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pooling/PhantomArrayListPool.java @@ -159,6 +159,7 @@ public class PhantomArrayListPool { // pool is empty, create new checkout checkout = new PhantomArrayListCheckout(this); + checkout.onCheckout(); } else { @@ -166,6 +167,7 @@ public class PhantomArrayListPool if (checkout != null) { // use pooled checkout + checkout.onCheckout(); } else {