Repository: incubator-geode
Updated Branches:
  refs/heads/develop 1e576f7a6 -> f0eb44eec


GEODE-225 excessive CPU utilization and garbage collection strain for JSON 
processing

Use of a singleton ObjectMapper can be enabled using a system property.

-DPdxInstance.use-static-mapper=true


Project: http://git-wip-us.apache.org/repos/asf/incubator-geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-geode/commit/d62dff94
Tree: http://git-wip-us.apache.org/repos/asf/incubator-geode/tree/d62dff94
Diff: http://git-wip-us.apache.org/repos/asf/incubator-geode/diff/d62dff94

Branch: refs/heads/develop
Commit: d62dff949d6883c2196253f7a26eeef921951353
Parents: 1e576f7
Author: Bruce Schuchardt <bschucha...@pivotal.io>
Authored: Fri Aug 12 10:35:13 2016 -0700
Committer: Bruce Schuchardt <bschucha...@pivotal.io>
Committed: Fri Aug 12 10:35:13 2016 -0700

----------------------------------------------------------------------
 .../gemfire/pdx/internal/PdxInstanceImpl.java   | 22 ++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/d62dff94/geode-core/src/main/java/com/gemstone/gemfire/pdx/internal/PdxInstanceImpl.java
----------------------------------------------------------------------
diff --git 
a/geode-core/src/main/java/com/gemstone/gemfire/pdx/internal/PdxInstanceImpl.java
 
b/geode-core/src/main/java/com/gemstone/gemfire/pdx/internal/PdxInstanceImpl.java
index d759c49..53dd958 100644
--- 
a/geode-core/src/main/java/com/gemstone/gemfire/pdx/internal/PdxInstanceImpl.java
+++ 
b/geode-core/src/main/java/com/gemstone/gemfire/pdx/internal/PdxInstanceImpl.java
@@ -16,6 +16,8 @@
  */
 package com.gemstone.gemfire.pdx.internal;
 
+import static org.apache.logging.log4j.message.MapMessage.MapFormat.JSON;
+
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
@@ -63,6 +65,18 @@ public class PdxInstanceImpl extends PdxReaderImpl 
implements PdxInstance, Senda
 
   private static final long serialVersionUID = -1669268527103938431L;
 
+  private static final boolean USE_STATIC_MAPPER = 
Boolean.getBoolean("PdxInstance.use-static-mapper");
+
+  static final ObjectMapper mapper = USE_STATIC_MAPPER? createObjectMapper() : 
null;
+
+  private static ObjectMapper createObjectMapper() {
+    ObjectMapper mapper = new ObjectMapper();
+    mapper.setDateFormat(new SimpleDateFormat("MM/dd/yyyy"));
+    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+    
mapper.configure(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES,
 true);
+    return mapper;
+  }
+
   private transient volatile Object cachedObjectForm;
 
   /**
@@ -209,12 +223,9 @@ public class PdxInstanceImpl extends PdxReaderImpl 
implements PdxInstance, Senda
         
         if(StringUtils.hasText(className)) {
           try {
-            ObjectMapper mapper = new ObjectMapper();
-            mapper.setDateFormat(new SimpleDateFormat("MM/dd/yyyy"));
-            
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-            
mapper.configure(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES,
 true);
             String JSON = JSONFormatter.toJSON(this);
-            Object classInstance = mapper.readValue(JSON, 
ClassPathLoader.getLatest().forName(className));
+            ObjectMapper objMapper = USE_STATIC_MAPPER? mapper : 
createObjectMapper();
+            Object classInstance = objMapper.readValue(JSON, 
ClassPathLoader.getLatest().forName(className));
             return classInstance;
           }catch(Exception e){
             throw new PdxSerializationException("Could not deserialize as java 
class type could not resolved", e);
@@ -284,7 +295,6 @@ public class PdxInstanceImpl extends PdxReaderImpl 
implements PdxInstance, Senda
         break;
       }
       case OBJECT: {
-        //TODO - we might able to optimize these to not deserialize the object
         Object objectValue = ur.readObject(ft);
         if (objectValue == null) {
           // default value of null does not modify hashCode.

Reply via email to