You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2024/01/11 17:31:44 UTC

(groovy) branch GROOVY_4_0_X updated: GROOVY-11271: ConcurrentCommonCache causes memory leaks

This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
     new abdb19786e GROOVY-11271: ConcurrentCommonCache causes memory leaks
abdb19786e is described below

commit abdb19786e38a6d7985863b751951232605a6a66
Author: Daniel Sun <su...@apache.org>
AuthorDate: Mon Jan 8 23:37:04 2024 +0800

    GROOVY-11271: ConcurrentCommonCache causes memory leaks
    
    (cherry picked from commit 43f5630338ced375c3a468c44ddc7b513686decb)
---
 .../codehaus/groovy/runtime/memoize/CommonCache.java   | 18 ++++++++++++++++--
 .../groovy/runtime/memoize/CommonCacheTest.java        |  4 ++--
 .../runtime/memoize/ConcurrentCommonCacheTest.java     |  2 +-
 .../groovy/runtime/memoize/StampedCommonCacheTest.java |  2 +-
 4 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/runtime/memoize/CommonCache.java b/src/main/java/org/codehaus/groovy/runtime/memoize/CommonCache.java
index cf231a4614..3701f44e31 100644
--- a/src/main/java/org/codehaus/groovy/runtime/memoize/CommonCache.java
+++ b/src/main/java/org/codehaus/groovy/runtime/memoize/CommonCache.java
@@ -19,6 +19,8 @@
 
 package org.codehaus.groovy.runtime.memoize;
 
+import org.apache.groovy.util.concurrent.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
+
 import java.io.Serializable;
 import java.lang.ref.SoftReference;
 import java.lang.ref.WeakReference;
@@ -64,14 +66,26 @@ public class CommonCache<K, V> implements EvictableCache<K, V>, ValueConvertable
      * @param evictionStrategy LRU or FIFO, see {@link org.codehaus.groovy.runtime.memoize.EvictableCache.EvictionStrategy}
      */
     public CommonCache(final int initialCapacity, final int maxSize, final EvictionStrategy evictionStrategy) {
-        this(new LinkedHashMap<K, V>(initialCapacity, DEFAULT_LOAD_FACTOR, EvictionStrategy.LRU == evictionStrategy) {
+        this(createMap(initialCapacity, maxSize, evictionStrategy));
+    }
+
+    private static <K, V> Map<K, V> createMap(int initialCapacity, int maxSize, EvictionStrategy evictionStrategy) {
+        final boolean lru = EvictionStrategy.LRU == evictionStrategy;
+
+        if (lru) {
+            return new ConcurrentLinkedHashMap.Builder<K, V>()
+                        .initialCapacity(initialCapacity)
+                        .maximumWeightedCapacity(maxSize)
+                        .build();
+        }
+        return new LinkedHashMap<K, V>(initialCapacity, DEFAULT_LOAD_FACTOR, lru) {
             private static final long serialVersionUID = -8012450791479726621L;
 
             @Override
             protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
                 return size() > maxSize;
             }
-        });
+        };
     }
 
     /**
diff --git a/src/test/org/codehaus/groovy/runtime/memoize/CommonCacheTest.java b/src/test/org/codehaus/groovy/runtime/memoize/CommonCacheTest.java
index 2223e5457e..d1485c1848 100644
--- a/src/test/org/codehaus/groovy/runtime/memoize/CommonCacheTest.java
+++ b/src/test/org/codehaus/groovy/runtime/memoize/CommonCacheTest.java
@@ -177,7 +177,7 @@ public class CommonCacheTest {
         sc.put("c", "3");
         sc.put("a", "4");
         sc.put("d", "5");
-        Assert.assertArrayEquals(new String[] {"c", "a", "d"}, sc.keys().toArray(new String[0]));
+        Assert.assertEquals(3, sc.size());
         Assert.assertEquals("3", sc.get("c"));
         Assert.assertEquals("4", sc.get("a"));
         Assert.assertEquals("5", sc.get("d"));
@@ -196,4 +196,4 @@ public class CommonCacheTest {
         Assert.assertEquals("3", sc.get("c"));
         Assert.assertEquals("5", sc.get("d"));
     }
-}
\ No newline at end of file
+}
diff --git a/src/test/org/codehaus/groovy/runtime/memoize/ConcurrentCommonCacheTest.java b/src/test/org/codehaus/groovy/runtime/memoize/ConcurrentCommonCacheTest.java
index efbb054a4b..9eef22e4b7 100644
--- a/src/test/org/codehaus/groovy/runtime/memoize/ConcurrentCommonCacheTest.java
+++ b/src/test/org/codehaus/groovy/runtime/memoize/ConcurrentCommonCacheTest.java
@@ -178,7 +178,7 @@ public class ConcurrentCommonCacheTest {
         sc.put("c", "3");
         sc.put("a", "4");
         sc.put("d", "5");
-        Assert.assertArrayEquals(new String[] {"c", "a", "d"}, sc.keys().toArray(new String[0]));
+        Assert.assertEquals(3, sc.size());
         Assert.assertEquals("3", sc.get("c"));
         Assert.assertEquals("4", sc.get("a"));
         Assert.assertEquals("5", sc.get("d"));
diff --git a/src/test/org/codehaus/groovy/runtime/memoize/StampedCommonCacheTest.java b/src/test/org/codehaus/groovy/runtime/memoize/StampedCommonCacheTest.java
index 2fc6ff6d37..e823e987ca 100644
--- a/src/test/org/codehaus/groovy/runtime/memoize/StampedCommonCacheTest.java
+++ b/src/test/org/codehaus/groovy/runtime/memoize/StampedCommonCacheTest.java
@@ -178,7 +178,7 @@ public class StampedCommonCacheTest {
         sc.put("c", "3");
         sc.put("a", "4");
         sc.put("d", "5");
-        Assert.assertArrayEquals(new String[] {"c", "a", "d"}, sc.keys().toArray(new String[0]));
+        Assert.assertEquals(3, sc.size());
         Assert.assertEquals("3", sc.get("c"));
         Assert.assertEquals("4", sc.get("a"));
         Assert.assertEquals("5", sc.get("d"));