From 6f14ad09b508858a7752eee74a29e14cad9278b3 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 1 Nov 2015 13:09:02 +0100 Subject: [PATCH] BUG-4556: enable DataSchemaContextTrees to be scavenged DataSchemaContextTree contains an internal weak-keyed cache, which is used to speed up lookups and share DataSchemaContextNodes. Unfortunately the cache uses strong references for values (e.g. DataSchemaContextTree) instances, which transitively (via DataSchemaContextNode) retain the reference to the key. This has the effect of the key being always reachable, thus causing a memory leak. Make the cache use weak references for values, which ensures that it gets scavenged whenever its contents are no longer referenced. Change-Id: I1684d1bf2c2c5cdc44cda1e8e508149ff3a8fae4 Signed-off-by: Robert Varga --- .../yang/data/util/DataSchemaContextTree.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextTree.java b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextTree.java index e30b524488..4b80edf686 100644 --- a/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextTree.java +++ b/yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextTree.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.data.util; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import java.util.Iterator; import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; @@ -18,14 +17,11 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; public final class DataSchemaContextTree { private static final LoadingCache TREES = CacheBuilder.newBuilder() - .weakKeys() - .build(new CacheLoader() { - + .weakKeys().weakValues().build(new CacheLoader() { @Override public DataSchemaContextTree load(final SchemaContext key) throws Exception { return new DataSchemaContextTree(key); } - }); private final DataSchemaContextNode root; @@ -40,9 +36,8 @@ public final class DataSchemaContextTree { public DataSchemaContextNode getChild(final YangInstanceIdentifier path) { DataSchemaContextNode currentOp = root; - Iterator arguments = path.getPathArguments().iterator(); - while (arguments.hasNext()) { - currentOp = currentOp.getChild(arguments.next()); + for (PathArgument arg : path.getPathArguments()) { + currentOp = currentOp.getChild(arg); } return currentOp; } -- 2.36.6