Skip to content

Commit 1b45bb6

Browse files
committed
Fix memory leak in per-level FakePlayer cache
The FakePlayer value holds a strong reference to its ServerLevel key (Entity.level), so a WeakHashMap (weak keys only) kept the key reachable and leaked the level. Use a Guava MapMaker with weak keys AND values.
1 parent c705909 commit 1b45bb6

1 file changed

Lines changed: 5 additions & 2 deletions

File tree

loader-neoforge/src/main/java/org/cyclops/structuredcrafting/craft/provider/WorldItemStackProviderNeoForge.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,19 @@
1313
import net.neoforged.neoforge.items.IItemHandler;
1414
import org.cyclops.cyclopscore.helper.BlockEntityHelpers;
1515

16+
import com.google.common.collect.MapMaker;
17+
1618
import java.util.Map;
17-
import java.util.WeakHashMap;
1819

1920
/**
2021
* World that can provide an itemstack.
2122
* @author rubensworks
2223
*/
2324
public class WorldItemStackProviderNeoForge extends WorldItemStackProviderBase {
2425

25-
private static final Map<ServerLevel, FakePlayer> FAKE_PLAYERS = new WeakHashMap<ServerLevel, FakePlayer>();
26+
// Weak keys AND values: the FakePlayer value holds a reference to its ServerLevel key,
27+
// so a WeakHashMap (weak keys only) would keep the key alive forever and leak.
28+
private static final Map<ServerLevel, FakePlayer> FAKE_PLAYERS = new MapMaker().weakKeys().weakValues().makeMap();
2629

2730
public static FakePlayer getFakePlayer(ServerLevel world) {
2831
FakePlayer fakePlayer = FAKE_PLAYERS.get(world);

0 commit comments

Comments
 (0)