Paper/Spigot-Server-Patches/0475-Reduce-memory-footprint-of-NBTTagCompound.patch

55 lines
2.6 KiB
Diff

From 1702763635d87ea03b05354b5e541cda6e348da0 Mon Sep 17 00:00:00 2001
From: Spottedleaf <spottedleaf@spottedleaf.dev>
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/server/NBTTagCompound.java b/src/main/java/net/minecraft/server/NBTTagCompound.java
index 98deaba12..02a2ed1ba 100644
--- a/src/main/java/net/minecraft/server/NBTTagCompound.java
+++ b/src/main/java/net/minecraft/server/NBTTagCompound.java
@@ -31,7 +31,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();
+ it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<String, NBTBase> hashmap = new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(8, 0.8f); // Paper - reduce memory footprint of NBTTagCompound
byte b0;
@@ -67,7 +67,7 @@ public class NBTTagCompound implements NBTBase {
}
public NBTTagCompound() {
- this(Maps.newHashMap());
+ this(new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(8, 0.8f)); // Paper - reduce memory footprint of NBTTagCompound
}
@Override
@@ -402,9 +402,17 @@ public class NBTTagCompound implements NBTBase {
@Override
public NBTTagCompound clone() {
- Map<String, NBTBase> map = Maps.newHashMap(Maps.transformValues(this.map, NBTBase::clone));
+ // Paper start - reduce memory footprint of NBTTagCompound
+ it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<String, NBTBase> ret = new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(this.map.size(), 0.8f);
- return new NBTTagCompound(map);
+ Iterator<Map.Entry<String, NBTBase>> iterator = (this.map instanceof it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap) ? ((it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap)this.map).object2ObjectEntrySet().fastIterator() : this.map.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry<String, NBTBase> 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) {
--
2.25.1