From 90031e2fc8bd3c09c1c1e5a9636b91d820719234 Mon Sep 17 00:00:00 2001 From: Alexdoru <57050655+Alexdoru@users.noreply.github.com> Date: Thu, 11 Dec 2025 12:08:11 +0100 Subject: [PATCH] [Memory-opti:fix leak] Fix world leak in SPacketMEUpdateBuffer (#374) --- .../java/com/glodblock/github/FluidCraft.java | 4 ++-- .../github/network/SPacketMEUpdateBuffer.java | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/glodblock/github/FluidCraft.java b/src/main/java/com/glodblock/github/FluidCraft.java index 5c20a21a..291eaf4b 100644 --- a/src/main/java/com/glodblock/github/FluidCraft.java +++ b/src/main/java/com/glodblock/github/FluidCraft.java @@ -100,12 +100,12 @@ public class FluidCraft { @Mod.EventHandler public void onServerStart(FMLServerStartingEvent event) { - SPacketMEUpdateBuffer.init(); + SPacketMEUpdateBuffer.start(); } @Mod.EventHandler public void onServerStop(FMLServerStoppedEvent event) { - SPacketMEUpdateBuffer.disable(); + SPacketMEUpdateBuffer.stop(); } @Mod.EventHandler diff --git a/src/main/java/com/glodblock/github/network/SPacketMEUpdateBuffer.java b/src/main/java/com/glodblock/github/network/SPacketMEUpdateBuffer.java index e7c5aefa..fc10f710 100644 --- a/src/main/java/com/glodblock/github/network/SPacketMEUpdateBuffer.java +++ b/src/main/java/com/glodblock/github/network/SPacketMEUpdateBuffer.java @@ -29,10 +29,9 @@ public class SPacketMEUpdateBuffer { private static ScheduledFuture task; private static final Map> itemBuffer = new HashMap<>(); - private static final Map> fluidBuffer = new HashMap<>(); - public static void init() { + public static void start() { executor = Executors.newSingleThreadScheduledExecutor(r -> { Thread thread = new Thread(r); thread.setName("AE2FC Network worker"); @@ -44,13 +43,21 @@ public class SPacketMEUpdateBuffer { .scheduleAtFixedRate(SPacketMEUpdateBuffer::sendBuffer, 0, Config.packetRate, TimeUnit.MILLISECONDS); } - public static void disable() { + public static void stop() { if (task != null) { task.cancel(false); } if (executor != null) { executor.shutdown(); } + executor = null; + task = null; + synchronized (itemBuffer) { + itemBuffer.clear(); + } + synchronized (fluidBuffer) { + fluidBuffer.clear(); + } } public static void scheduleItemUpdate(EntityPlayerMP player, List stacks) { @@ -64,7 +71,7 @@ public class SPacketMEUpdateBuffer { } public static void scheduleFluidUpdate(EntityPlayerMP player, List stacks) { - synchronized (itemBuffer) { + synchronized (fluidBuffer) { if (!fluidBuffer.containsKey(player)) { fluidBuffer.put(player, new LinkedHashSet<>(1024)); } @@ -94,6 +101,8 @@ public class SPacketMEUpdateBuffer { packet.setResort(true); FluidCraft.proxy.netHandler.sendTo(packet, player); }); + } + synchronized (fluidBuffer) { fluidBuffer.forEach((player, updates) -> { if (updates.isEmpty()) return; int i = 0; @@ -122,6 +131,8 @@ public class SPacketMEUpdateBuffer { if (itemBuffer.containsKey(player)) { itemBuffer.get(player).clear(); } + } + synchronized (fluidBuffer) { if (fluidBuffer.containsKey(player)) { fluidBuffer.get(player).clear(); }