From 60bf4e92ffddc4deb1c108482af8407d4e5acfa0 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Wed, 20 Jan 2021 20:30:30 +0100 Subject: [PATCH] #1405 - Use ConcurrentLruCache for affordances. We now use a ConcurrentLruCache limited to 256 entries instead of a ConcurrentReferenceHashMap to cache Affordance instances to prevent the cache from growing unboundedly before GC kicks in. --- .../hateoas/server/core/WebHandler.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/springframework/hateoas/server/core/WebHandler.java b/src/main/java/org/springframework/hateoas/server/core/WebHandler.java index 79c7791c..adec03b2 100644 --- a/src/main/java/org/springframework/hateoas/server/core/WebHandler.java +++ b/src/main/java/org/springframework/hateoas/server/core/WebHandler.java @@ -38,7 +38,7 @@ import org.springframework.hateoas.TemplateVariables; import org.springframework.hateoas.server.LinkBuilder; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.ConcurrentReferenceHashMap; +import org.springframework.util.ConcurrentLruCache; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.ObjectUtils; @@ -63,7 +63,8 @@ public class WebHandler { public static final MappingDiscoverer DISCOVERER = CachingMappingDiscoverer .of(new PropertyResolvingMappingDiscoverer(new AnnotationMappingDiscoverer(RequestMapping.class))); - private static final Map> AFFORDANCES_CACHE = new ConcurrentReferenceHashMap<>(); + private static final ConcurrentLruCache> AFFORDANCES_CACHE = new ConcurrentLruCache<>( + 256, key -> SpringAffordanceBuilder.create(key.type, key.method, key.href.toUriString(), DISCOVERER)); public interface LinkBuilderCreator { T createBuilder(UriComponents components, TemplateVariables variables, List affordances); @@ -160,9 +161,8 @@ public class WebHandler { variables = variables.concat(variable); } - List affordances = AFFORDANCES_CACHE.computeIfAbsent( - new AffordanceKey(invocation.getTargetType(), invocation.getMethod(), components), - key -> SpringAffordanceBuilder.create(key.type, key.method, key.href.toUriString(), DISCOVERER)); + List affordances = AFFORDANCES_CACHE + .get(new AffordanceKey(invocation.getTargetType(), invocation.getMethod(), components)); return creator.createBuilder(components, variables, affordances); };