From 583b74fb7ea857121fc41c1113e8bfb0dd451f5d Mon Sep 17 00:00:00 2001 From: cyberpwn Date: Tue, 17 Aug 2021 23:40:47 -0400 Subject: [PATCH] No leaky --- .../iris/core/project/loader/IrisData.java | 14 ++++++++++ ...ExecutionSVC.java => PreservationSVC.java} | 28 +++++++++++++++++-- .../com/volmit/iris/engine/IrisEngine.java | 6 ++-- .../engine/object/noise/IrisGenerator.java | 1 + .../volmit/iris/util/context/IrisContext.java | 21 +++++++++++--- .../volmit/iris/util/parallel/MultiBurst.java | 6 ++-- .../volmit/iris/util/scheduling/Looper.java | 6 ++-- 7 files changed, 67 insertions(+), 15 deletions(-) rename src/main/java/com/volmit/iris/core/service/{ExecutionSVC.java => PreservationSVC.java} (75%) diff --git a/src/main/java/com/volmit/iris/core/project/loader/IrisData.java b/src/main/java/com/volmit/iris/core/project/loader/IrisData.java index 28c36af52..5b18e1fdc 100644 --- a/src/main/java/com/volmit/iris/core/project/loader/IrisData.java +++ b/src/main/java/com/volmit/iris/core/project/loader/IrisData.java @@ -82,6 +82,20 @@ public class IrisData { hotloaded(); } + public static void dereference() + { + dataLoaders.v().forEach(IrisData::cleanupEngine); + } + + public void cleanupEngine() + { + if(engine != null && engine.isClosed()) + { + engine = null; + Iris.debug("Dereferenced Data " + getId() + " " + getDataFolder()); + } + } + public static int cacheSize() { int m = 0; for(IrisData i : dataLoaders.values()) diff --git a/src/main/java/com/volmit/iris/core/service/ExecutionSVC.java b/src/main/java/com/volmit/iris/core/service/PreservationSVC.java similarity index 75% rename from src/main/java/com/volmit/iris/core/service/ExecutionSVC.java rename to src/main/java/com/volmit/iris/core/service/PreservationSVC.java index b9f369583..b6123d28d 100644 --- a/src/main/java/com/volmit/iris/core/service/ExecutionSVC.java +++ b/src/main/java/com/volmit/iris/core/service/PreservationSVC.java @@ -19,17 +19,21 @@ package com.volmit.iris.core.service; import com.volmit.iris.Iris; +import com.volmit.iris.core.project.loader.IrisData; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.IrisService; +import com.volmit.iris.util.scheduling.Looper; import java.util.concurrent.ExecutorService; -public class ExecutionSVC implements IrisService +public class PreservationSVC implements IrisService { private KList threads = new KList<>(); private KList bursts = new KList<>(); private KList services = new KList<>(); + private Looper dereferencer; public void register(Thread t) { @@ -46,13 +50,31 @@ public class ExecutionSVC implements IrisService services.add(service); } + public void dereference() + { + IrisContext.dereference(); + IrisData.dereference(); + } + @Override public void onEnable() { - + /* + * Dereferences copies of Engine instances that are closed to prevent memory from + * hanging around and keeping copies of complex, caches and other dead objects. + */ + dereferencer = new Looper() { + @Override + protected long loop() { + dereference(); + return 60000; + } + }; } @Override public void onDisable() { + dereferencer.interrupt(); + for(Thread i : threads) { if(i.isAlive()) @@ -97,5 +119,7 @@ public class ExecutionSVC implements IrisService } } + + dereference(); } } diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index 0f46c32af..5bea6a8dc 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -23,6 +23,7 @@ import com.google.gson.Gson; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.events.IrisEngineHotloadEvent; +import com.volmit.iris.core.service.PreservationSVC; import com.volmit.iris.engine.actuator.IrisBiomeActuator; import com.volmit.iris.engine.actuator.IrisDecorantActuator; import com.volmit.iris.engine.actuator.IrisTerrainIslandActuator; @@ -66,8 +67,6 @@ import org.bukkit.generator.BlockPopulator; import java.io.File; import java.io.IOException; import java.util.Random; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -340,6 +339,9 @@ public class IrisEngine extends BlockPopulator implements Engine { getPostModifier().close(); getMantle().close(); getComplex().close(); + getData().dump(); + getData().clearLists(); + Iris.service(PreservationSVC.class).dereference(); Iris.debug("Engine Fully Shutdown!"); } diff --git a/src/main/java/com/volmit/iris/engine/object/noise/IrisGenerator.java b/src/main/java/com/volmit/iris/engine/object/noise/IrisGenerator.java index bbc1393d0..6a1c0d12c 100644 --- a/src/main/java/com/volmit/iris/engine/object/noise/IrisGenerator.java +++ b/src/main/java/com/volmit/iris/engine/object/noise/IrisGenerator.java @@ -24,6 +24,7 @@ import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.annotations.*; import com.volmit.iris.engine.object.common.IRare; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.interpolation.IrisInterpolation; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.noise.CellGenerator; diff --git a/src/main/java/com/volmit/iris/util/context/IrisContext.java b/src/main/java/com/volmit/iris/util/context/IrisContext.java index 3795e955a..001b978fb 100644 --- a/src/main/java/com/volmit/iris/util/context/IrisContext.java +++ b/src/main/java/com/volmit/iris/util/context/IrisContext.java @@ -18,6 +18,7 @@ package com.volmit.iris.util.context; +import com.volmit.iris.Iris; import com.volmit.iris.core.project.loader.IrisData; import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.framework.Engine; @@ -30,7 +31,7 @@ import lombok.Data; @AllArgsConstructor public class IrisContext { private static ChronoLatch cl = new ChronoLatch(60000); - private static KMap context = new KMap<>(); + private static final KMap context = new KMap<>(); private final Engine engine; public static IrisContext get() { @@ -42,10 +43,22 @@ public class IrisContext { context.put(Thread.currentThread(), c); if (cl.flip()) { - for (Thread i : context.k()) { - if (!i.isAlive()) { - context.remove(i); + dereference(); + } + } + } + + public static void dereference() { + synchronized (context) + { + for (Thread i : context.k()) { + if (!i.isAlive() || context.get(i).engine.isClosed()) { + if(context.get(i).engine.isClosed()) + { + Iris.debug("Dereferenced Context " + i.getName() + " " + i.getId()); } + + context.remove(i); } } } diff --git a/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java b/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java index 03d677a8f..29440720a 100644 --- a/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java +++ b/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java @@ -20,7 +20,7 @@ package com.volmit.iris.util.parallel; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.service.ExecutionSVC; +import com.volmit.iris.core.service.PreservationSVC; import com.volmit.iris.util.io.InstanceState; import com.volmit.iris.util.math.M; import com.volmit.iris.util.scheduling.J; @@ -71,7 +71,7 @@ public class MultiBurst { }; heartbeat.setName(name + " Monitor"); heartbeat.start(); - Iris.service(ExecutionSVC.class).register(this); + Iris.service(PreservationSVC.class).register(this); } private synchronized ExecutorService getService() { @@ -90,7 +90,7 @@ public class MultiBurst { return t; }); - Iris.service(ExecutionSVC.class).register(service); + Iris.service(PreservationSVC.class).register(service); Iris.debug("Started MultiBurst Pool " + name + " with " + tc + " threads at " + priority + " priority."); } diff --git a/src/main/java/com/volmit/iris/util/scheduling/Looper.java b/src/main/java/com/volmit/iris/util/scheduling/Looper.java index 6ae2822e0..60a74219b 100644 --- a/src/main/java/com/volmit/iris/util/scheduling/Looper.java +++ b/src/main/java/com/volmit/iris/util/scheduling/Looper.java @@ -19,14 +19,12 @@ package com.volmit.iris.util.scheduling; import com.volmit.iris.Iris; -import com.volmit.iris.core.service.ExecutionSVC; - -import java.util.concurrent.ExecutorService; +import com.volmit.iris.core.service.PreservationSVC; public abstract class Looper extends Thread { @SuppressWarnings("BusyWait") public void run() { - Iris.service(ExecutionSVC.class).register(this); + Iris.service(PreservationSVC.class).register(this); while (!interrupted()) { try { long m = loop();