You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2017/09/29 07:25:33 UTC

[2/9] karaf git commit: Deduplicate common OSGi filter strings

Deduplicate common OSGi filter strings

Based on a heap dump with a large number of features/bundles,
5 strings have a large number of duplicates -- ~48K duplicate strings,
wasting ~1.9MiB of memory.

Create a small interning Map, which can normalize these, squashing
a number of these duplicates.

Signed-off-by: Robert Varga <ni...@hq.sk>


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/c68e8c6e
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/c68e8c6e
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/c68e8c6e

Branch: refs/heads/master
Commit: c68e8c6e022d38b2d9fe293a4cb365eb6ffc96ca
Parents: 8fc4d28
Author: Robert Varga <ni...@hq.sk>
Authored: Tue Sep 26 17:20:10 2017 +0200
Committer: Robert Varga <ni...@hq.sk>
Committed: Wed Sep 27 09:55:03 2017 +0200

----------------------------------------------------------------------
 .../internal/resolver/SimpleFilter.java         | 23 +++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/c68e8c6e/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
index 3464a4e..117734e 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/SimpleFilter.java
@@ -19,10 +19,12 @@ package org.apache.karaf.features.internal.resolver;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Deque;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 
 import org.apache.felix.utils.version.VersionRange;
 
@@ -38,12 +40,27 @@ public class SimpleFilter {
     public static final int PRESENT = 8;
     public static final int APPROX = 9;
 
+    /**
+     * Strings which are commonly found in filter specification. We use this map as an interner.
+     */
+    private static final Set<String> COMMON_STRINGS;
+
+    static {
+        Set<String> s = new HashSet<>(8);
+        s.add("optional");
+        s.add("osgi.ee");
+        s.add("resolution");
+        s.add("uses");
+        s.add("version");
+        COMMON_STRINGS = s;
+    }
+
     private final String name;
     private final Object value;
     private final int op;
 
     public SimpleFilter(String name, Object value, int op) {
-        this.name = name;
+        this.name = internIfCommon(name);
         this.value = value;
         this.op = op;
     }
@@ -125,6 +142,10 @@ public class SimpleFilter {
         }
     }
 
+    private static String internIfCommon(String str) {
+        return str != null && COMMON_STRINGS.contains(str) ? str.intern() : str;
+    }
+
     private static void toString(StringBuilder sb, List<?> list) {
         for (Object o : list) {
             SimpleFilter sf = (SimpleFilter) o;