From bda9bbb102e232c8850e793c48afa789c155ccd6 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 28 May 2014 23:30:06 +0200 Subject: [PATCH] BUG-648: do not keep HashMap$Values around 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 --- .../impl/ImmutableLeafNodeBuilder.java | 4 +-- .../ImmutableLeafSetEntryNodeBuilder.java | 4 +-- .../impl/ImmutableLeafSetNodeBuilder.java | 3 +- .../builder/impl/ImmutableMapNodeBuilder.java | 7 ++++- .../ImmutableOrderedLeafSetNodeBuilder.java | 7 ++++- .../impl/ImmutableOrderedMapNodeBuilder.java | 7 ++++- .../impl/ImmutableUnkeyedListNodeBuilder.java | 3 +- .../AbstractImmutableDataContainerNode.java | 7 ++++- .../AbstractImmutableNormalizedNode.java | 9 +----- ...ractImmutableNormalizedValueAttrNode.java} | 6 ++-- .../AbstractImmutableNormalizedValueNode.java | 28 +++++++++++++++++++ 11 files changed, 64 insertions(+), 21 deletions(-) rename yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/{AbstractImmutableNormalizedAttrNode.java => AbstractImmutableNormalizedValueAttrNode.java} (87%) create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedValueNode.java diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafNodeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafNodeBuilder.java index fcec7afc21..a127bc5e0b 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafNodeBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafNodeBuilder.java @@ -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 extends AbstractImmutableNormalizedNodeBuilder> { @@ -26,7 +26,7 @@ public class ImmutableLeafNodeBuilder extends AbstractImmutableNormalizedNode return new ImmutableLeafNode<>(getNodeIdentifier(), getValue(), getAttributes()); } - private static final class ImmutableLeafNode extends AbstractImmutableNormalizedAttrNode implements LeafNode { + private static final class ImmutableLeafNode extends AbstractImmutableNormalizedValueAttrNode implements LeafNode { ImmutableLeafNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier, final T value, final Map attributes) { super(nodeIdentifier, value, attributes); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetEntryNodeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetEntryNodeBuilder.java index fd5cf52678..ba351f1348 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetEntryNodeBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetEntryNodeBuilder.java @@ -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 extends AbstractImmutableNormal return new ImmutableLeafSetEntryNode<>(getNodeIdentifier(), getValue(), getAttributes()); } - private static final class ImmutableLeafSetEntryNode extends AbstractImmutableNormalizedAttrNode implements LeafSetEntryNode { + private static final class ImmutableLeafSetEntryNode extends AbstractImmutableNormalizedValueAttrNode implements LeafSetEntryNode { ImmutableLeafSetEntryNode(final InstanceIdentifier.NodeWithValue nodeIdentifier, final T value, final Map attributes) { super(nodeIdentifier, value, attributes); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetNodeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetNodeBuilder.java index ad4fb5a0b6..6d04d5989c 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetNodeBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetNodeBuilder.java @@ -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 implements ListNodeBuilder extends - AbstractImmutableNormalizedNode>> implements + AbstractImmutableNormalizedValueNode>> implements Immutable, LeafSetNode { private final Map> children; diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java index 9046c26321..4a52f95d3e 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java @@ -104,7 +104,7 @@ public class ImmutableMapNodeBuilder ImmutableMapNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier, final Map 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 getValue() { + return Iterables.unmodifiableIterable(children.values()); + } + @Override protected int valueHashCode() { return children.hashCode(); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableOrderedLeafSetNodeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableOrderedLeafSetNodeBuilder.java index d66f022895..c440bd7f8d 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableOrderedLeafSetNodeBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableOrderedLeafSetNodeBuilder.java @@ -122,7 +122,7 @@ public class ImmutableOrderedLeafSetNodeBuilder implements ListNodeBuilder> children) { - super(nodeIdentifier, Iterables.unmodifiableIterable(children.values())); + super(nodeIdentifier); this.children = children; } @@ -155,6 +155,11 @@ public class ImmutableOrderedLeafSetNodeBuilder implements ListNodeBuilder> getValue() { + return Iterables.unmodifiableIterable(children.values()); + } } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableOrderedMapNodeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableOrderedMapNodeBuilder.java index 3f9e4d5f12..ca0ea95365 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableOrderedMapNodeBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableOrderedMapNodeBuilder.java @@ -116,7 +116,7 @@ public class ImmutableOrderedMapNodeBuilder ImmutableOrderedMapNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier, final Map 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 getValue() { + return Iterables.unmodifiableIterable(children.values()); + } } } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUnkeyedListNodeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUnkeyedListNodeBuilder.java index 498b658245..274b781d3e 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUnkeyedListNodeBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUnkeyedListNodeBuilder.java @@ -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> + AbstractImmutableNormalizedValueNode> implements Immutable, UnkeyedListNode { private final ImmutableList children; diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableDataContainerNode.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableDataContainerNode.java index 7c7d53d61a..438b05c7da 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableDataContainerNode.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableDataContainerNode.java @@ -26,7 +26,7 @@ public abstract class AbstractImmutableDataContainerNode public AbstractImmutableDataContainerNode( final Map> children, final K nodeIdentifier) { - super(nodeIdentifier, Iterables.unmodifiableIterable(children.values())); + super(nodeIdentifier); this.children = children; } @@ -35,6 +35,11 @@ public abstract class AbstractImmutableDataContainerNode return Optional.> fromNullable(children.get(child)); } + @Override + public final Iterable> getValue() { + return Iterables.unmodifiableIterable(children.values()); + } + @Override protected int valueHashCode() { return children.hashCode(); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedNode.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedNode.java index 708f9225c2..14b0f41929 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedNode.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedNode.java @@ -21,11 +21,9 @@ public abstract class AbstractImmutableNormalizedNode, 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 - extends AbstractImmutableNormalizedNode +public abstract class AbstractImmutableNormalizedValueAttrNode + extends AbstractImmutableNormalizedValueNode implements AttributesContainer { private final Map attributes; - protected AbstractImmutableNormalizedAttrNode(final K nodeIdentifier, final V value, final Map attributes) { + protected AbstractImmutableNormalizedValueAttrNode(final K nodeIdentifier, final V value, final Map 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 index 0000000000..16ca637e2c --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableNormalizedValueNode.java @@ -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 + extends AbstractImmutableNormalizedNode { + + 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; + } +} -- 2.36.6