[SCB-2646] fix metaspace oom problem (#3238)
diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectFactory.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectFactory.java
index ecedf26..7bec69d 100644
--- a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectFactory.java
+++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectFactory.java
@@ -26,7 +26,9 @@
import org.apache.servicecomb.config.inject.InjectProperties;
import org.apache.servicecomb.config.inject.InjectProperty;
import org.apache.servicecomb.config.inject.PlaceholderResolver;
+import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
import org.apache.servicecomb.foundation.common.utils.JsonUtils;
+import org.apache.servicecomb.foundation.common.utils.LambdaMetafactoryUtils;
import org.apache.servicecomb.foundation.common.utils.bean.Setter;
import org.springframework.stereotype.Component;
@@ -45,7 +47,9 @@
@Component
public class ConfigObjectFactory {
private final PriorityPropertyFactory propertyFactory;
-
+ private static final Map<Class<?>, JavaType> classCache = new ConcurrentHashMapEx<>();
+ private static final Map<JavaType, BeanDescription> javaTypeCache = new ConcurrentHashMapEx<>();
+ private static final Map<BeanPropertyDefinition, Setter<Object, Object>> beanDescriptionCache = new ConcurrentHashMapEx<>();
public ConfigObjectFactory(PriorityPropertyFactory propertyFactory) {
this.propertyFactory = propertyFactory;
}
@@ -84,8 +88,9 @@
public List<ConfigObjectProperty> createProperties(Object instance, String prefix, Map<String, Object> parameters) {
List<ConfigObjectProperty> properties = new ArrayList<>();
- JavaType javaType = TypeFactory.defaultInstance().constructType(instance.getClass());
- BeanDescription beanDescription = JsonUtils.OBJ_MAPPER.getSerializationConfig().introspect(javaType);
+ JavaType javaType = classCache.computeIfAbsent(instance.getClass(), TypeFactory.defaultInstance()::constructType);
+ BeanDescription beanDescription = javaTypeCache.computeIfAbsent(javaType,
+ JsonUtils.OBJ_MAPPER.getSerializationConfig()::introspect);
for (BeanPropertyDefinition propertyDefinition : beanDescription.findProperties()) {
if (propertyDefinition.getField() == null) {
continue;
@@ -95,7 +100,8 @@
continue;
}
- Setter<Object, Object> setter = createObjectSetter(propertyDefinition);
+ Setter<Object, Object> setter = beanDescriptionCache.computeIfAbsent(propertyDefinition,
+ LambdaMetafactoryUtils::createObjectSetter);
PriorityProperty<?> priorityProperty = createPriorityProperty(propertyDefinition.getField().getAnnotated(),
prefix, parameters);
setter.set(instance, priorityProperty.getValue());
@@ -205,7 +211,7 @@
private String[] collectPropertyKeys(Field field, String prefix, Map<String, Object> parameters) {
String propertyPrefix = prefix;
- String[] keys = new String[] {field.getName()};
+ String[] keys = new String[]{field.getName()};
InjectProperty injectProperty = field.getAnnotation(InjectProperty.class);
if (injectProperty != null) {