[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) {