From babc8cd07371422062aabb052afeca890cede3a9 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Wed, 28 Dec 2011 14:33:32 +0800 Subject: [PATCH] Fix accumulation of weak reference keys (mem leak) in snapshot cache --- src/main/java/org/dynmap/MapManager.java | 4 ++++ .../java/org/dynmap/utils/SnapshotCache.java | 17 +++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/dynmap/MapManager.java b/src/main/java/org/dynmap/MapManager.java index 94efd05f..9b03a33c 100644 --- a/src/main/java/org/dynmap/MapManager.java +++ b/src/main/java/org/dynmap/MapManager.java @@ -1076,6 +1076,10 @@ public class MapManager { if(saverestorepending) savePending(); + if(sscache != null) { + sscache.cleanup(); + sscache = null; + } } private HashMap worldTileDirectories = new HashMap(); diff --git a/src/main/java/org/dynmap/utils/SnapshotCache.java b/src/main/java/org/dynmap/utils/SnapshotCache.java index ee321fba..6bd26001 100644 --- a/src/main/java/org/dynmap/utils/SnapshotCache.java +++ b/src/main/java/org/dynmap/utils/SnapshotCache.java @@ -122,8 +122,10 @@ public class SnapshotCache { private void processRefQueue() { Reference ref; while((ref = refqueue.poll()) != null) { - String k = snapcache.reverselookup.get(ref); - if(k != null) snapcache.remove(k); + String k = snapcache.reverselookup.remove(ref); + if(k != null) { + snapcache.remove(k); + } } } /** @@ -141,5 +143,16 @@ public class SnapshotCache { public void resetStats() { cache_attempts = cache_success = 0; } + /** + * Cleanup + */ + public void cleanup() { + if(snapcache != null) { + snapcache.clear(); + snapcache.reverselookup.clear(); + snapcache.reverselookup = null; + snapcache = null; + } + } }