From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Mon, 6 Apr 2020 17:39:25 -0700 Subject: [PATCH] Reduce memory footprint of NBTTagCompound Fastutil maps are going to have a lower memory footprint - which is important because we clone chunk data after reading it for safety. So, reduce the impact of the clone on GC. diff --git a/src/main/java/net/minecraft/nbt/NBTTagCompound.java b/src/main/java/net/minecraft/nbt/NBTTagCompound.java index 2e862122fd4596c26318aac3b12165970a1660f8..e37c82c3af7c0fea9c85f7bc8d7a4df648e723ff 100644 --- a/src/main/java/net/minecraft/nbt/NBTTagCompound.java +++ b/src/main/java/net/minecraft/nbt/NBTTagCompound.java @@ -26,6 +26,7 @@ import net.minecraft.ReportedException; import net.minecraft.network.chat.ChatComponentText; import net.minecraft.network.chat.IChatBaseComponent; import net.minecraft.network.chat.IChatMutableComponent; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; // Paper import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -47,7 +48,7 @@ public class NBTTagCompound implements NBTBase { if (i > 512) { throw new RuntimeException("Tried to read NBT tag with too high complexity, depth > 512"); } else { - HashMap hashmap = Maps.newHashMap(); + Object2ObjectOpenHashMap hashmap = new Object2ObjectOpenHashMap<>(8, 0.8f); // Paper - reduce memory footprint of NBTTagCompound byte b0; @@ -83,7 +84,7 @@ public class NBTTagCompound implements NBTBase { } public NBTTagCompound() { - this(Maps.newHashMap()); + this(new Object2ObjectOpenHashMap<>(8, 0.8f)); // Paper - reduce memory footprint of NBTTagCompound } @Override @@ -415,9 +416,17 @@ public class NBTTagCompound implements NBTBase { @Override public NBTTagCompound clone() { - Map map = Maps.newHashMap(Maps.transformValues(this.map, NBTBase::clone)); + // Paper start - reduce memory footprint of NBTTagCompound + Object2ObjectOpenHashMap ret = new Object2ObjectOpenHashMap<>(this.map.size(), 0.8f); - return new NBTTagCompound(map); + Iterator> iterator = (this.map instanceof Object2ObjectOpenHashMap) ? ((Object2ObjectOpenHashMap)this.map).object2ObjectEntrySet().fastIterator() : this.map.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + ret.put(entry.getKey(), entry.getValue().clone()); + } + + return new NBTTagCompound(ret); + // Paper end - reduce memory footprint of NBTTagCompound } public boolean equals(Object object) {