Skip to content

Commit 3738a45

Browse files
Vasiliy Kudriavtsevsbrannen
authored andcommitted
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
1 parent fd3e99c commit 3738a45

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/annotation/InjectionMetadata.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,20 @@ protected boolean needsRefresh(Class<?> clazz) {
107107
}
108108

109109
public void checkConfigMembers(RootBeanDefinition beanDefinition) {
110-
Set<InjectedElement> checkedElements = new LinkedHashSet<>(this.injectedElements.size());
111-
for (InjectedElement element : this.injectedElements) {
112-
Member member = element.getMember();
113-
if (!beanDefinition.isExternallyManagedConfigMember(member)) {
114-
beanDefinition.registerExternallyManagedConfigMember(member);
115-
checkedElements.add(element);
110+
if (this.injectedElements.isEmpty()) {
111+
this.checkedElements = Collections.emptySet();
112+
}
113+
else {
114+
Set<InjectedElement> checkedElements = new LinkedHashSet<>(this.injectedElements.size()*4/3 + 1);
115+
for (InjectedElement element : this.injectedElements) {
116+
Member member = element.getMember();
117+
if (!beanDefinition.isExternallyManagedConfigMember(member)) {
118+
beanDefinition.registerExternallyManagedConfigMember(member);
119+
checkedElements.add(element);
120+
}
116121
}
122+
this.checkedElements = checkedElements;
117123
}
118-
this.checkedElements = checkedElements;
119124
}
120125

121126
public void inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {

spring-core/src/main/java/org/springframework/core/type/classreading/MergedAnnotationReadingVisitor.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.lang.annotation.Annotation;
2020
import java.lang.reflect.Array;
2121
import java.util.ArrayList;
22+
import java.util.Collections;
2223
import java.util.LinkedHashMap;
2324
import java.util.List;
2425
import java.util.Map;
@@ -92,8 +93,10 @@ public AnnotationVisitor visitArray(String name) {
9293

9394
@Override
9495
public void visitEnd() {
96+
Map<String, Object> compactedAttributes
97+
= this.attributes.size() == 0 ? Collections.emptyMap() : this.attributes;
9598
MergedAnnotation<A> annotation = MergedAnnotation.of(
96-
this.classLoader, this.source, this.annotationType, this.attributes);
99+
this.classLoader, this.source, this.annotationType, compactedAttributes);
97100
this.consumer.accept(annotation);
98101
}
99102

0 commit comments

Comments
 (0)