From 3738a45658426d7caa976021f01f94c125d9e4ef Mon Sep 17 00:00:00 2001 From: Vasiliy Kudriavtsev Date: Mon, 26 Dec 2022 12:35:38 +0300 Subject: [PATCH] Avoid wasted memory on empty maps and sets This commit avoids wasted memory on empty hash maps in MergedAnnotationReadingVisitor and empty sets in InjectionMetadata. Closes gh-29742 --- .../factory/annotation/InjectionMetadata.java | 21 ++++++++++++------- .../MergedAnnotationReadingVisitor.java | 5 ++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java index 8898dea97a..381ca0c701 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java @@ -107,15 +107,20 @@ public class InjectionMetadata { } public void checkConfigMembers(RootBeanDefinition beanDefinition) { - Set checkedElements = new LinkedHashSet<>(this.injectedElements.size()); - for (InjectedElement element : this.injectedElements) { - Member member = element.getMember(); - if (!beanDefinition.isExternallyManagedConfigMember(member)) { - beanDefinition.registerExternallyManagedConfigMember(member); - checkedElements.add(element); - } + if (this.injectedElements.isEmpty()) { + this.checkedElements = Collections.emptySet(); + } + else { + Set checkedElements = new LinkedHashSet<>(this.injectedElements.size()*4/3 + 1); + for (InjectedElement element : this.injectedElements) { + Member member = element.getMember(); + if (!beanDefinition.isExternallyManagedConfigMember(member)) { + beanDefinition.registerExternallyManagedConfigMember(member); + checkedElements.add(element); + } + } + this.checkedElements = checkedElements; } - this.checkedElements = checkedElements; } public void inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable { diff --git a/spring-core/src/main/java/org/springframework/core/type/classreading/MergedAnnotationReadingVisitor.java b/spring-core/src/main/java/org/springframework/core/type/classreading/MergedAnnotationReadingVisitor.java index e3af278bd7..a4d13cd32a 100644 --- a/spring-core/src/main/java/org/springframework/core/type/classreading/MergedAnnotationReadingVisitor.java +++ b/spring-core/src/main/java/org/springframework/core/type/classreading/MergedAnnotationReadingVisitor.java @@ -19,6 +19,7 @@ package org.springframework.core.type.classreading; import java.lang.annotation.Annotation; import java.lang.reflect.Array; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -92,8 +93,10 @@ class MergedAnnotationReadingVisitor extends AnnotationVis @Override public void visitEnd() { + Map compactedAttributes + = this.attributes.size() == 0 ? Collections.emptyMap() : this.attributes; MergedAnnotation annotation = MergedAnnotation.of( - this.classLoader, this.source, this.annotationType, this.attributes); + this.classLoader, this.source, this.annotationType, compactedAttributes); this.consumer.accept(annotation); }