From b286c81cb36446a6595dd2ed01d64ed7fa46ef94 Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Mon, 11 May 2015 10:11:13 +0200 Subject: [PATCH] Fix a memory leak. --- .../massivecore/MassiveCoreEngineMain.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/com/massivecraft/massivecore/MassiveCoreEngineMain.java b/src/com/massivecraft/massivecore/MassiveCoreEngineMain.java index babf663b..ddb2f3b4 100644 --- a/src/com/massivecraft/massivecore/MassiveCoreEngineMain.java +++ b/src/com/massivecraft/massivecore/MassiveCoreEngineMain.java @@ -334,13 +334,26 @@ public class MassiveCoreEngineMain extends EngineAbstract protected Map, Entry>> idToRemoteEntries = new ConcurrentHashMap, Entry>>(); // Intended to be ran asynchronously. - public void storeRemoteEntries(String playerId) + public void storeRemoteEntries(final String playerId) { // Create remote entries ... Map, Entry> remoteEntries = createRemoteEntries(playerId); - // ... and store them. + // ... store them ... this.idToRemoteEntries.put(playerId, remoteEntries); + + // ... and make sure they are removed after 30 seconds. + // Without this we might cause a memory leak. + // Players might trigger AsyncPlayerPreLoginEvent but not PlayerLoginEvent. + // Using WeakHashMap is not an option since the player object does not exist at AsyncPlayerPreLoginEvent. + Bukkit.getScheduler().runTaskLaterAsynchronously(this.getPlugin(), new Runnable() + { + @Override + public void run() + { + idToRemoteEntries.remove(playerId); + } + }, 20*30); } // Intended to be ran synchronously.