diff --git a/Spigot-Server-Patches/Cleanup-Region-Files-Direct-Memory-on-close.patch b/Spigot-Server-Patches/Cleanup-Region-Files-Direct-Memory-on-close.patch deleted file mode 100644 index 84a48ccf72..0000000000 --- a/Spigot-Server-Patches/Cleanup-Region-Files-Direct-Memory-on-close.patch +++ /dev/null @@ -1,84 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Mon, 4 May 2020 00:38:13 -0400 -Subject: [PATCH] Cleanup Region Files Direct Memory on close - -Mojang was semi leaking native memory here by relying on finalizers -to clean up the direct memory. - -Finalizers have no guarantee on when they will be ran, and since this is -old generation memory, it might be a while before its called. - -diff --git a/src/main/java/net/minecraft/server/RegionFile.java b/src/main/java/net/minecraft/server/RegionFile.java -index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 ---- a/src/main/java/net/minecraft/server/RegionFile.java -+++ b/src/main/java/net/minecraft/server/RegionFile.java -@@ -0,0 +0,0 @@ public class RegionFile implements AutoCloseable { - private final FileChannel dataFile; - private final java.nio.file.Path d; - private final RegionFileCompression e; -- private final ByteBuffer f; -+ private final ByteBuffer f; private ByteBuffer getFileBuffer() { return f; } // Paper - clean up direct buffers on close - private final IntBuffer g; - private final IntBuffer h; - private final RegionFileBitSet freeSectors; -@@ -0,0 +0,0 @@ public class RegionFile implements AutoCloseable { - } - } finally { // Paper start - Prevent regionfiles from being closed during use - this.fileLock.unlock(); -+ if (getFileBuffer().isDirect()) cleanDirectByteBuffer(getFileBuffer()); // Paper - clean up direct buffers on close - } - } // Paper end - - } -+ // Paper start -+ private static int getVersion() { -+ String version = System.getProperty("java.version"); -+ if(version.startsWith("1.")) { -+ version = version.substring(2, 3); -+ } else { -+ int dot = version.indexOf("."); -+ if(dot != -1) { version = version.substring(0, dot); } -+ } return Integer.parseInt(version); -+ } -+ static java.lang.reflect.Method unsafeClean; -+ static sun.misc.Unsafe unsafe = com.destroystokyo.paper.utils.UnsafeUtils.getUnsafe(); -+ static java.util.function.Consumer cleaner; -+ static { -+ try { -+ if (unsafe != null) { -+ unsafeClean = unsafe.getClass().getMethod("invokeCleaner", ByteBuffer.class); -+ if (unsafeClean != null) { -+ cleaner = (buf) -> { -+ try { -+ unsafeClean.invoke(unsafe, buf); -+ } catch (Exception ex) { -+ com.destroystokyo.paper.util.SneakyThrow.sneaky(ex); -+ } -+ }; -+ LOGGER.info("[RegionFile] Using Java 9+ invokeCleaner DirectByteBuffer cleanup method"); -+ } -+ } -+ } catch (java.lang.NoSuchMethodException e) {} -+ if (cleaner == null && getVersion() <= 8) { -+ cleaner = (buf) -> { -+ ((sun.nio.ch.DirectBuffer) buf).cleaner().clean(); -+ }; -+ LOGGER.info("[RegionFile] Using Java 8 DirectByteBuffer cleanup method"); -+ } -+ } -+ public static void cleanDirectByteBuffer(ByteBuffer toBeDestroyed) { -+ try { -+ if (cleaner != null) { -+ cleaner.accept(toBeDestroyed); -+ } -+ } catch (Exception ex) { -+ LOGGER.warn("Failed automatically cleaning DirectByteBuffer"); -+ ex.printStackTrace(); -+ cleaner = null; -+ } -+ } -+ // Paper end - - private void c() throws IOException { - int i = (int) this.dataFile.size();