2012-02-21 18 views
2

私はジャクソン1.9を使用しています。 SpringのModelMap、BindingResult、java.uil.Mapなどの複雑なオブジェクトをJSON Stringオブジェクトに変換する必要がある私のWebアプリケーションでは、OutOfMemoryジャクソンを使用中1.9

私はそのような変換をしようとしています次のコードスニペットを考えてみてください:

Map<String, Object> methodArgsMap = new HashMap<String, Object>(); 

methodArgsMap.put("map", map);/*map is an instance of org.springframework.ui.ModelMap*/ 

methodArgsMap.put("command", command);/*command is an instance of a custom POJO  viz.ReportBeanParam*/ 
methodArgsMap.put("result", result);/*result is an instance of org.springframework.validation.BindingResult*/ 

方法がJSONProcessUtilです。次のようにgetObjectsAsJSONString(...)が実装さ:

public final class JSONProcessUtil { 

private static ObjectMapper objectMapper; 

     static { 
       objectMapper = new ObjectMapper(); 
/*Start : Configs. suggested by Jackson docs to avoid OutOfMemoryError*/ 
       SerializationConfig serConfig = objectMapper.getSerializationConfig(); 
       serConfig.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS); 

       objectMapper.getJsonFactory().configure(
           JsonParser.Feature.INTERN_FIELD_NAMES, false); 
       objectMapper.getJsonFactory().configure(
           JsonParser.Feature.CANONICALIZE_FIELD_NAMES, false); 
/*End : Configs. suggested by Jackson docs to avoid OutOfMemoryError*/ 

     } 


public static Map<String, String> getObjectsAsJSONString(
         Map<String, Object> argsMap) throws JsonGenerationException, 
         JsonMappingException, IOException { 

       log.info("Source app.In JSONProcessUtil.getObjectsAsJSONString(...)"); 

       Map<String, String> jsonStrMap = null; 

       if (!(argsMap == null || argsMap.isEmpty())) { 
         jsonStrMap = new HashMap<String, String>(); 

         Set<String> keySet = argsMap.keySet(); 
         Iterator<String> iter = keySet.iterator(); 
         String argName = null; 

         while (iter.hasNext()) { 

           argName = iter.next(); 

           log.info("Source app. argName = {}, arg = {} ", argName, 
               argsMap.get(argName)); 

           jsonStrMap.put(argName, 
               objectMapper.writeValueAsString(argsMap.get(argName)));/*The line giving error*/ 

           log.info("Proceeding to the next arg !"); 
         } 
       } 

       log.info("Source app. Exit from JSONProcessUtil.getObjectsAsJSONString(...)"); 

       return jsonStrMap; 
     } 
} 

次のように私はOutOfMemoryErrorが発生を取得しています:

INFO [http-8080-7] (JSONProcessUtil.java:73) - Source app. argName = result, arg = org.springframework.validation.BeanPropertyBindingResult: 0 errors DEBUG [http-8080-7] (SecurityContextPersistenceFilter.java:89) - SecurityContextHolder now cleared, as request processing completed Feb 20, 2012 5:03:30 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet saas threw exception 
java.lang.OutOfMemoryError: Java heap space 
     at org.codehaus.jackson.util.TextBuffer._charArray(TextBuffer.java:  
674) 
     at org.codehaus.jackson.util.TextBuffer.expand(TextBuffer.java:633) 
     at org.codehaus.jackson.util.TextBuffer.append(TextBuffer.java:438) 
     at org.codehaus.jackson.io.SegmentedStringWriter.write(SegmentedStringWriter.java:69) 
     at org.codehaus.jackson.impl.WriterBasedGenerator._flushBuffer(WriterBasedGenerator.java:1810) 
     at org.codehaus.jackson.impl.WriterBasedGenerator._writeFieldName(WriterBasedGenerator.java:345) 
     at org.codehaus.jackson.impl.WriterBasedGenerator.writeFieldName(WriterBasedGenerator.java:217) 
     at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:426) 
     at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175) 
     at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142) 
     at org.codehaus.jackson.map.ser.impl.ObjectArraySerializer.serializeContents(ObjectArraySerializer.java:121) 
     at org.codehaus.jackson.map.ser.impl.ObjectArraySerializer.serializeContents(ObjectArraySerializer.java:28) 
     at org.codehaus.jackson.map.ser.ArraySerializers$AsArraySerializer.serialize(ArraySerializers.java:56) 
     at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428) 
     at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175) 
     at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142) 
     at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428) 
     at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175) 
     at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142) 
     at org.codehaus.jackson.map.ser.MapSerializer.serializeFields(MapSerializer.java:287) 
     at org.codehaus.jackson.map.ser.MapSerializer.serialize(MapSerializer.java:212) 
     at org.codehaus.jackson.map.ser.MapSerializer.serialize(MapSerializer.java:23) 
     at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428) 
     at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175) 
     at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142) 
     at org.codehaus.jackson.map.ser.MapSerializer.serializeFields(MapSerializer.java:287) 
     at org.codehaus.jackson.map.ser.MapSerializer.serialize(MapSerializer.java:212) 
     at org.codehaus.jackson.map.ser.MapSerializer.serialize(MapSerializer.java:23) 
     at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428) 
     at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175) 
     at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142) 
     at org.codehaus.jackson.map.ser.MapSerializer.serializeFields(MapSerializer.java:287) 

同じの解決について案内してください。

ありがとうございました!

答えて

1

あなたは巨大なJSON出力を生成しているようですが、メモリにバッファリングされています。 これはエラーメッセージに基づいています。

選択肢はどちらかである:

  • (ただし、私は春は、あなたがこれを行うことを可能にする場合はわからない)メモリにバッファリングを避けるために、出力をストリーミング使用、または
  • 増加のヒープサイズあなたが持っているので、十分なメモリ

インターンと正規化を無効にする機能は、解析にのみ関連し、解析するのではなくJSONを生成しています。