BUG-648: do not keep HashMap$Values around 68/7468/2
authorRobert Varga <rovarga@cisco.com>
Wed, 28 May 2014 21:30:06 +0000 (23:30 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Thu, 29 May 2014 12:28:44 +0000 (12:28 +0000)
Profiling has identified that we keep a lot (>600K) of HashMap$Values
objects around. This is caused by our class hierarchy, which forces the
Container nodes to supply their Iterable values at construction time --
which means they have to capture children.values() and wrap it in an
UnmodifiableIterable.

This patch creates splits the functionality of
AbstractImmutableNormalizedNode into two:

AbstractImmutableNormalizedNode, which just holds the identifier plus
the infrastructure layout. AbstractImmutableNormalizedValueNode, which
additionally holds the value.

Container nodes are then made subclasses of the former, which allows
them to provide getValue() dynamically, thus avoiding the unnecessary
instantiation.

Change-Id: I3fb894b0eeef3cd4a7b0de7634d4638c72c66fc3
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetEntryNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableOrderedLeafSetNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableOrderedMapNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUnkeyedListNodeBuilder.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableDataContainerNode.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedNode.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedValueAttrNode.java [moved from yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedAttrNode.java with 87% similarity]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedValueNode.java [new file with mode: 0644]

index fcec7afc214a5967d3c7099e76c3b7fee50cd8f3..a127bc5e0b467fe472c6ea93a4a8f2ec3585478a 100644 (file)
@@ -13,7 +13,7 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeAttrBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedAttrNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedValueAttrNode;
 
 public class ImmutableLeafNodeBuilder<T> extends AbstractImmutableNormalizedNodeBuilder<InstanceIdentifier.NodeIdentifier, T, LeafNode<T>> {
 
@@ -26,7 +26,7 @@ public class ImmutableLeafNodeBuilder<T> extends AbstractImmutableNormalizedNode
         return new ImmutableLeafNode<>(getNodeIdentifier(), getValue(), getAttributes());
     }
 
-    private static final class ImmutableLeafNode<T> extends AbstractImmutableNormalizedAttrNode<InstanceIdentifier.NodeIdentifier, T> implements LeafNode<T> {
+    private static final class ImmutableLeafNode<T> extends AbstractImmutableNormalizedValueAttrNode<InstanceIdentifier.NodeIdentifier, T> implements LeafNode<T> {
 
         ImmutableLeafNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier, final T value, final Map<QName, String> attributes) {
             super(nodeIdentifier, value, attributes);
index fd5cf52678ecd92f248c0d8493ca3a2579187e68..ba351f13481c7491c963f5063dc6ed17931d2b5c 100644 (file)
@@ -12,7 +12,7 @@ import java.util.Map;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedAttrNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedValueAttrNode;
 
 import com.google.common.base.Preconditions;
 
@@ -27,7 +27,7 @@ public class ImmutableLeafSetEntryNodeBuilder<T> extends AbstractImmutableNormal
         return new ImmutableLeafSetEntryNode<>(getNodeIdentifier(), getValue(), getAttributes());
     }
 
-    private static final class ImmutableLeafSetEntryNode<T> extends AbstractImmutableNormalizedAttrNode<InstanceIdentifier.NodeWithValue, T> implements LeafSetEntryNode<T> {
+    private static final class ImmutableLeafSetEntryNode<T> extends AbstractImmutableNormalizedValueAttrNode<InstanceIdentifier.NodeWithValue, T> implements LeafSetEntryNode<T> {
 
         ImmutableLeafSetEntryNode(final InstanceIdentifier.NodeWithValue nodeIdentifier, final T value, final Map<QName, String> attributes) {
             super(nodeIdentifier, value, attributes);
index ad4fb5a0b6daf3157d069ff250c71818da7e5307..6d04d5989cd41cb2a965425a2a1ec6f01b5e7f55 100644 (file)
@@ -23,6 +23,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedValueNode;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Iterables;
@@ -101,7 +102,7 @@ public class ImmutableLeafSetNodeBuilder<T> implements ListNodeBuilder<T, LeafSe
     }
 
     protected final static class ImmutableLeafSetNode<T> extends
-            AbstractImmutableNormalizedNode<InstanceIdentifier.NodeIdentifier, Iterable<LeafSetEntryNode<T>>> implements
+            AbstractImmutableNormalizedValueNode<InstanceIdentifier.NodeIdentifier, Iterable<LeafSetEntryNode<T>>> implements
             Immutable, LeafSetNode<T> {
 
         private final Map<InstanceIdentifier.NodeWithValue, LeafSetEntryNode<T>> children;
index 9046c263213e4be232abf78e6de2c3bbde61dd46..4a52f95d3ec12ba201df1d115c323bd02f19097d 100644 (file)
@@ -104,7 +104,7 @@ public class ImmutableMapNodeBuilder
 
         ImmutableMapNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier,
                          final Map<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> children) {
-            super(nodeIdentifier, Iterables.unmodifiableIterable(children.values()));
+            super(nodeIdentifier);
             this.children = children;
         }
 
@@ -113,6 +113,11 @@ public class ImmutableMapNodeBuilder
             return Optional.fromNullable(children.get(child));
         }
 
+               @Override
+               public Iterable<MapEntryNode> getValue() {
+                       return Iterables.unmodifiableIterable(children.values());
+               }
+
         @Override
         protected int valueHashCode() {
             return children.hashCode();
index d66f0228953bf4f171cc2ea41401f5f216d7ac9d..c440bd7f8d747a7adacd89cb1c60e7f04608b529 100644 (file)
@@ -122,7 +122,7 @@ public class ImmutableOrderedLeafSetNodeBuilder<T> implements ListNodeBuilder<T,
 
         ImmutableOrderedLeafSetNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier,
                 final Map<InstanceIdentifier.NodeWithValue, LeafSetEntryNode<T>> children) {
-            super(nodeIdentifier, Iterables.unmodifiableIterable(children.values()));
+            super(nodeIdentifier);
             this.children = children;
         }
 
@@ -155,6 +155,11 @@ public class ImmutableOrderedLeafSetNodeBuilder<T> implements ListNodeBuilder<T,
             // TODO Auto-generated method stub
             return 0;
         }
+
+               @Override
+               public Iterable<LeafSetEntryNode<T>> getValue() {
+                       return Iterables.unmodifiableIterable(children.values());
+               }
     }
 
     @Override
index 3f9e4d5f12ae029b6bd00199baa13c6e219af291..ca0ea95365da2341e3277c5b579e1114b0a86b70 100644 (file)
@@ -116,7 +116,7 @@ public class ImmutableOrderedMapNodeBuilder
 
         ImmutableOrderedMapNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier,
                          final Map<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> children) {
-            super(nodeIdentifier, Iterables.unmodifiableIterable(children.values()));
+            super(nodeIdentifier);
             this.children = children;
         }
 
@@ -144,5 +144,10 @@ public class ImmutableOrderedMapNodeBuilder
         public int getSize() {
             return children.size();
         }
+
+               @Override
+               public Iterable<MapEntryNode> getValue() {
+                       return Iterables.unmodifiableIterable(children.values());
+               }
     }
 }
index 498b65824599fcf0c48ea91d6f9544a357402c70..274b781d3e66fded64bdf5485dada1f47561c20f 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedValueNode;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
@@ -109,7 +110,7 @@ public class ImmutableUnkeyedListNodeBuilder implements CollectionNodeBuilder<Un
     }
 
     protected static final class ImmutableUnkeyedListNode extends
-            AbstractImmutableNormalizedNode<InstanceIdentifier.NodeIdentifier, Iterable<UnkeyedListEntryNode>>
+            AbstractImmutableNormalizedValueNode<InstanceIdentifier.NodeIdentifier, Iterable<UnkeyedListEntryNode>>
             implements Immutable, UnkeyedListNode {
 
         private final ImmutableList<UnkeyedListEntryNode> children;
index 7c7d53d61ac210a77bc7a5dc7c7d3e29a5f3b334..438b05c7da3af2bab1424fba7e56b00c80a007e7 100644 (file)
@@ -26,7 +26,7 @@ public abstract class AbstractImmutableDataContainerNode<K extends PathArgument>
 
     public AbstractImmutableDataContainerNode(
             final Map<PathArgument, DataContainerChild<? extends PathArgument, ?>> children, final K nodeIdentifier) {
-        super(nodeIdentifier, Iterables.unmodifiableIterable(children.values()));
+        super(nodeIdentifier);
         this.children = children;
     }
 
@@ -35,6 +35,11 @@ public abstract class AbstractImmutableDataContainerNode<K extends PathArgument>
         return Optional.<DataContainerChild<? extends PathArgument, ?>> fromNullable(children.get(child));
     }
 
+    @Override
+    public final Iterable<DataContainerChild<? extends PathArgument, ?>> getValue() {
+        return Iterables.unmodifiableIterable(children.values());
+    }
+
     @Override
     protected int valueHashCode() {
         return children.hashCode();
index 708f9225c2f29c640db725b4550b2d5386d2a6cf..14b0f419297352315c71d5b2517395fee7e7cfb8 100644 (file)
@@ -21,11 +21,9 @@ public abstract class AbstractImmutableNormalizedNode<K extends InstanceIdentifi
         implements NormalizedNode<K, V>, Immutable {
 
     private final K nodeIdentifier;
-    private final V value;
 
-    protected AbstractImmutableNormalizedNode(final K nodeIdentifier, final V value) {
+    protected AbstractImmutableNormalizedNode(final K nodeIdentifier) {
         this.nodeIdentifier = Preconditions.checkNotNull(nodeIdentifier, "nodeIdentifier");
-        this.value = Preconditions.checkNotNull(value, "value");
     }
 
     @Override
@@ -48,11 +46,6 @@ public abstract class AbstractImmutableNormalizedNode<K extends InstanceIdentifi
         return getNodeType();
     }
 
-    @Override
-    public final V getValue() {
-        return value;
-    }
-
     @Override
     public final V setValue(final V value) {
         throw new UnsupportedOperationException("Immutable");
@@ -16,13 +16,13 @@ import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
 import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.collect.ImmutableMap;
 
-public abstract class AbstractImmutableNormalizedAttrNode<K extends InstanceIdentifier.PathArgument,V>
-        extends AbstractImmutableNormalizedNode<K, V>
+public abstract class AbstractImmutableNormalizedValueAttrNode<K extends InstanceIdentifier.PathArgument,V>
+        extends AbstractImmutableNormalizedValueNode<K, V>
         implements AttributesContainer {
 
     private final Map<QName, String> attributes;
 
-    protected AbstractImmutableNormalizedAttrNode(final K nodeIdentifier, final V value, final Map<QName, String> attributes) {
+    protected AbstractImmutableNormalizedValueAttrNode(final K nodeIdentifier, final V value, final Map<QName, String> attributes) {
         super(nodeIdentifier, value);
         this.attributes = ImmutableMap.copyOf(attributes);
     }
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedValueNode.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedValueNode.java
new file mode 100644 (file)
index 0000000..16ca637
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.impl.schema.nodes;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+
+import com.google.common.base.Preconditions;
+
+public abstract class AbstractImmutableNormalizedValueNode<K extends InstanceIdentifier.PathArgument,V>
+        extends AbstractImmutableNormalizedNode<K, V> {
+
+    private final V value;
+
+    protected AbstractImmutableNormalizedValueNode(final K nodeIdentifier, final V value) {
+       super(nodeIdentifier);
+        this.value = Preconditions.checkNotNull(value, "value");
+    }
+
+    @Override
+    public final V getValue() {
+        return value;
+    }
+}