From 0abf7483353e4a1b8dbf4b2155d7dfa045b12fd2 Mon Sep 17 00:00:00 2001 From: md_5 Date: Fri, 20 Jun 2014 19:40:00 +1000 Subject: [PATCH] Prevent Unbounded IntCache Growth Based on work by Peter Lawrey, this commit prevents unbounded growth of the integer cache and instead caps it to a value specified in the configuration (1024 by default). Should prevent thrashing, especially around world generation. diff --git a/src/main/java/net/minecraft/server/IntCache.java b/src/main/java/net/minecraft/server/IntCache.java index 4b4f005..0d8eb6c 100644 --- a/src/main/java/net/minecraft/server/IntCache.java +++ b/src/main/java/net/minecraft/server/IntCache.java @@ -17,11 +17,11 @@ public class IntCache { if (i <= 256) { if (IntCache.b.isEmpty()) { aint = new int[256]; - IntCache.c.add(aint); + if (c.size() < org.spigotmc.SpigotConfig.intCacheLimit) IntCache.c.add(aint); return aint; } else { aint = (int[]) IntCache.b.remove(IntCache.b.size() - 1); - IntCache.c.add(aint); + if (c.size() < org.spigotmc.SpigotConfig.intCacheLimit) IntCache.c.add(aint); return aint; } } else if (i > IntCache.a) { @@ -29,15 +29,15 @@ public class IntCache { IntCache.d.clear(); IntCache.e.clear(); aint = new int[IntCache.a]; - IntCache.e.add(aint); + if (e.size() < org.spigotmc.SpigotConfig.intCacheLimit) IntCache.e.add(aint); return aint; } else if (IntCache.d.isEmpty()) { aint = new int[IntCache.a]; - IntCache.e.add(aint); + if (e.size() < org.spigotmc.SpigotConfig.intCacheLimit) IntCache.e.add(aint); return aint; } else { aint = (int[]) IntCache.d.remove(IntCache.d.size() - 1); - IntCache.e.add(aint); + if (e.size() < org.spigotmc.SpigotConfig.intCacheLimit) IntCache.e.add(aint); return aint; } } diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java index 78dcb39..c5e995b 100644 --- a/src/main/java/org/spigotmc/SpigotConfig.java +++ b/src/main/java/org/spigotmc/SpigotConfig.java @@ -327,4 +327,10 @@ public class SpigotConfig { saveUserCacheOnStopOnly = getBoolean( "settings.save-user-cache-on-stop-only", false ); } + + public static int intCacheLimit; + private static void intCacheLimit() + { + intCacheLimit = getInt( "settings.int-cache-limit", 1024 ); + } } -- 2.1.0